import time
from model.database import DataBase
from tornado import web, httpserver, ioloop
def getDiaryInfo(self):
t = self.get_argument('time',time.strftime('%Y-%m-%d %X', time.localtime()))
weather = self.get_argument('weather')
mood = self.get_argument('mood')
content = self.get_argument('content')
return dict(time=t, weather=weather, mood=mood, content=content)
class IndexHandler(web.RequestHandler):
def get(self, *args, **kwargs):
search=self.get_argument('search','') #初始搜索词为空,列出所有日记
diaries=DataBase().getDiaries(search)
self.render('index之日记本.html',diaries=diaries)
class CreateDiaryHandler(web.RequestHandler):
def get(self, *args, **kwargs):
self.render('createDiary.html')
def post(self, *args, **kwargs):
item=getDiaryInfo(self)
DataBase().createDiary(item)
self.redirect('/')
class UpdateDiaryHandler(web.RequestHandler):
def get(self, *args, **kwargs):
diary=DataBase().getDiaryByID(self.get_argument('id'))
self.render('updateDiary.html',diary=diary)
def post(self, *args, **kwargs):
item=getDiaryInfo(self) #id是get的参数,其他来自post请求
item.update({'id':self.get_argument('id')})
DataBase().updateDiary(item)
self.redirect('/')
class DeleteDiaryHandler(web.RequestHandler):
def get(self, *args, **kwargs):
id=self.get_argument('id')
self.write(f'''<form method="post">
<input type="submit" value="确认删除日记{id}" name="deleteDiary">
<input type="submit" value="取消删除{id}" name="deleteDiary"></form>''')
def post(self, *args, **kwargs):
if '确认' in self.get_argument('deleteDiary'):
DataBase().deleteDiary(self.get_argument('id'))
self.redirect('/')
class InfoDiaryHandler(web.RequestHandler):
def get(self, *args, **kwargs):
diary=DataBase().getDiaryByID(self.get_argument('id'))
self.render('infoDiary.html',diary=diary)
app = web.Application([
(r'/', IndexHandler),
(r'/createDiary', CreateDiaryHandler),
(r'/updateDiary', UpdateDiaryHandler),
(r'/deleteDiary', DeleteDiaryHandler),
(r'/infoDiary', InfoDiaryHandler),
],**{'template_path':'templates','static_path':'static'})
if __name__ == '__main__':
httpServer = httpserver.HTTPServer(app)
httpServer.listen(8080)
print('http://127.0.0.1:8080')
ioloop.IOLoop.current().start()
***************分割线***************
2、model文件夹中的database.py:
import pymysql
class DataBase:
def __init__(self):
self.conn=pymysql.connect(host='localhost',port=3306,user='chengy',password='',
db='tornado之日记本',charset='utf8mb4')
self.cur=self.conn.cursor(pymysql.cursors.DictCursor)
def operateDatabase(self,sql,insertValues=None):
self.cur.execute(sql,insertValues)
self.conn.commit()
self.cur.close()
self.conn.close()
def createDiary(self,item):
sql='insert into diaries(time,weather,mood,content) values(%s,%s,%s,%s)'
insertValues=(item['time'],item['weather'],item['mood'],item['content'])
self.operateDatabase(sql,insertValues)
def updateDiary(self,item):
sql=f'''update diaries set time="{item['time']}",weather="{item['weather']}",
mood="{item['mood']}",content="{item['content']}" where id={item['id']}'''
self.operateDatabase(sql)
def deleteDiary(self,id=''):
sql=f'delete from diaries where id={id}'
self.operateDatabase(sql)
def getDiaries(self,search=''):
sql=f'select * from diaries where content like "%{search}%" \
or weather like "%{search}%" or mood like "%{search}%" limit 25'
self.operateDatabase(sql)
return self.cur.fetchall()
def getDiaryByID(self,id=''):
sql=f'select * from diaries where id={id}'
self.operateDatabase(sql)
return self.cur.fetchone()
***************分割线***************
3、templates文件夹
<h2>日行一事</h2>
<div><a href="/createDiary">新建日记</a><br></div>
<form action="" method="get">
搜索日记:<input type="text" name="search">
<input type="submit" value="搜索">
</form>
<br><br>
{% if diaries %}
<table cellspacing="0" cellpadding="0" border="9">
<tr><th>修改</th><th>删除</th><th>id</th><th>时间</th>
<th>天气</th><th>心情</th><th>内容</th></tr>
{% for diary in diaries %}
<tr><td><a href="/updateDiary?id={{diary['id']}}">修改</a></td>
<td><a href="/deleteDiary?id={{diary['id']}}">删除</a></td>
<td>{{diary['id']}}</td><td>{{diary['time']}}</td><td>{{diary['weather']}}</td>
<td>{{diary['mood']}}</td>
<td><a href="/infoDiary?id={{diary['id']}}">{{diary['content'][:20]}}</a></td>
</tr> <!--显示前9个字符,tornado用[:9],django用|truncatechars:'9'-->
{% end %}
</table>
{% end %}
*****分割线*****
createDiary.html:
<h2>新建日记</h2>
<form action="" method="post">
天气:<input type="text" name="weather"><br>
心情:<input type="text" name="mood"><br>
内容:<textarea rows="10" cols="30" name="content"></textarea><br>
<input type="submit" value="保存">
</form>
*****分割线*****
updateDiary.html:
<h2>更新日记</h2>
{% if diary %}
<form action="" method="post">
时间:<input type="text" name="time" value="{{diary['time']}}"><br>
天气:<input type="text" name="weather" value="{{diary['weather']}}"><br>
心情:<input type="text" name="mood" value="{{diary['mood']}}"><br>
内容:<textarea rows="10" cols="30" name="content">{{diary['content']}}</textarea><br>
<input type="submit" value="更新"> <!--textarea无value属性,直接写在标签之间-->
</form>
{% end %}
*****分割线*****
infoDiary.html:
<h2 style="color: red;">日记详情</h2>
<h3><a href="/">返回首页</a><br><br></h3>
{% if diary %}
标识:{{diary['id']}}<br>
时间:{{diary['time']}}<br>
天气:{{diary['weather']}}<br>
心情:{{diary['mood']}}<br><br>
<!--把字符当html解析:对它用raw语法,或在head中加句{% autoescape None %}-->
{%raw diary['content'].replace('\r\n','<br>').replace(' ',' ')%}
{% end %} <!--使用时,各篇html代码替换回半角的&及左尖角符-->
- Python(九)Tornado web 框架
一.简介 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过 ...
- 使用tornado,我们可以做什么?
以下介绍都是建立在python2.x的基础上面,tornado使用任意版本皆可. 如果我们需要对外提供一个http server(web api)/websocket server时,我们都可以使用t ...
- tornado session
[转]tornado入门 - session cookie 和session 的区别: 1.cookie数据存放在客户的浏览器上,session数据放在服务器上. 2.cookie不是很安全,别人可以 ...
- tornado template
若果使用Tornado进行web开发可能会用到模板功能,页面继承,嵌套... 多页应用模板的处理多半依赖后端(SPA就可以动态加载局部视图),就算是RESTfull的API设计,也不妨碍同时提供部分模 ...
- tornado上手
http://www.tornadoweb.org/en/stable/ http://www.cnblogs.com/fanweibin/p/5418697.html import tornado. ...
- tornado+sqlalchemy+celery,数据库连接消耗在哪里
随着公司业务的发展,网站的日活数也逐渐增多,以前只需要考虑将所需要的功能实现就行了,当日活越来越大的时候,就需要考虑对服务器的资源使用消耗情况有一个清楚的认知. 最近老是发现数据库的连接数如果 ...
- centos 6.7 搭建tornado + nginx + supervisor的方法(已经实践)
首先,本来不想写这篇博客了,但是我测试了很多网上的例子包括简书的,全不行,我总结原因是自己太笨,搞了俩个晚上,后来决定,自己还是写一篇记录下来,保证自己以后使用 环境: centos6.7 64 py ...
- tornado中将cookie值设置为json字符串
不熟悉,找了很久,能FQ的话, https://groups.google.com/forum/#!topic/python-tornado/9Y--NgwjP_w 2楼有解释. tornado.es ...
- tornado 异步调用系统命令和非阻塞线程池
项目中异步调用 ping 和 nmap 实现对目标 ip 和所在网关的探测 Subprocess.STREAM 不用担心进程返回数据过大造成的死锁, Subprocess.PIPE 会有这个问题. i ...
- 离线安装 Python 2.7, paramiko 和 tornado
无非就是离线安装, 步骤比较繁琐, 记录一下. 需求很简单, 一个离线安装的 Python, 能跑 tornado 和 paramiko 1. 离线安装 Python 2.7 .tgz cd Pyth ...
随机推荐
- ajax导出表格数据失败的几处坑
$.ajax({ type:'POST', async:false, url:'/export', data:params, dataType:'json', ... success:function ...
- oracle优化(一)
非原创 1. 选用合适的ORACLE优化器 ORACLE的优化器有3种: a. RULE(基于规则)b. COST(基于成本) c. CHOOSE(选择性) 选择缺省的优化器,可以通过对init.or ...
- openal在vs2010中的配置
下载openal开发工具:相关资料可以在OpenAL官网http://connect.creativelabs.com/openal/default.aspx上获得.这里下载的SDK为OpenAL11 ...
- Windows学习"Network Analysis in Python"
原代码仓库的地址为 Network Analysis in Python. 主要按照里面的README.md 进行操作,全部仓库有100MB以上.考虑到数据比较大,再加上我对原笔记文件有修改,建议从我 ...
- fROM PPV report
Month search help: include rmcs0f0m. s_month for s001-spmon at selection-screen on value-request for ...
- 微信小程序开发过程问题总汇
之前在开发一个控车小程序,把过程中稍微需要搜索的问题做了记录. 1. 关键词:本地资源图片无法通过WXSS获取 描述:做小程序开发的时候,如果你需要使用图片作为背景,也就是想使用background- ...
- 检查手机是否安装外置SD卡
/** * 检测是否安装外置SD卡 * * @return */ public boolean checkSDcard() { StorageList list = new StorageList(t ...
- 源码分析之groupcache之consistenthash
很多时候读开源的库就是为自己准备大量的代码库,优秀开源项目代码质量比绝大部分人的代理质量都要高. 依赖的库 ```import ( "hash/crc32" "sort& ...
- 算法 BF算法
BF算法是字符匹配的一种算法,也称暴力匹配算法 算法思想: 从主串s1的pos位置出发,与子串s2第一位进行匹配 若相等,接着匹配后一位字符 若不相等,则返回到s1前一次匹配位置的后一位,接着与s2的 ...
- Windows PowerShell基本语法及常用命令
PowerShell常用命令: 一 Get类 1.Get-Command : 得到所有PowerShell命令,获取有关 cmdlet 以及有关 Windows PowerShell 命令的其他元素的 ...