tornado之日记本——
 
1、diary.py:
 
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文件夹
 
index之日记本.html:
 
<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代码替换回半角的&及左尖角符-->

tornadoの2的更多相关文章

  1. Python(九)Tornado web 框架

    一.简介 Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本.这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过 ...

  2. 使用tornado,我们可以做什么?

    以下介绍都是建立在python2.x的基础上面,tornado使用任意版本皆可. 如果我们需要对外提供一个http server(web api)/websocket server时,我们都可以使用t ...

  3. tornado session

    [转]tornado入门 - session cookie 和session 的区别: 1.cookie数据存放在客户的浏览器上,session数据放在服务器上. 2.cookie不是很安全,别人可以 ...

  4. tornado template

    若果使用Tornado进行web开发可能会用到模板功能,页面继承,嵌套... 多页应用模板的处理多半依赖后端(SPA就可以动态加载局部视图),就算是RESTfull的API设计,也不妨碍同时提供部分模 ...

  5. tornado上手

    http://www.tornadoweb.org/en/stable/ http://www.cnblogs.com/fanweibin/p/5418697.html import tornado. ...

  6. tornado+sqlalchemy+celery,数据库连接消耗在哪里

    随着公司业务的发展,网站的日活数也逐渐增多,以前只需要考虑将所需要的功能实现就行了,当日活越来越大的时候,就需要考虑对服务器的资源使用消耗情况有一个清楚的认知.     最近老是发现数据库的连接数如果 ...

  7. centos 6.7 搭建tornado + nginx + supervisor的方法(已经实践)

    首先,本来不想写这篇博客了,但是我测试了很多网上的例子包括简书的,全不行,我总结原因是自己太笨,搞了俩个晚上,后来决定,自己还是写一篇记录下来,保证自己以后使用 环境: centos6.7 64 py ...

  8. tornado中将cookie值设置为json字符串

    不熟悉,找了很久,能FQ的话, https://groups.google.com/forum/#!topic/python-tornado/9Y--NgwjP_w 2楼有解释. tornado.es ...

  9. tornado 异步调用系统命令和非阻塞线程池

    项目中异步调用 ping 和 nmap 实现对目标 ip 和所在网关的探测 Subprocess.STREAM 不用担心进程返回数据过大造成的死锁, Subprocess.PIPE 会有这个问题. i ...

  10. 离线安装 Python 2.7, paramiko 和 tornado

    无非就是离线安装, 步骤比较繁琐, 记录一下. 需求很简单, 一个离线安装的 Python, 能跑 tornado 和 paramiko 1. 离线安装 Python 2.7 .tgz cd Pyth ...

随机推荐

  1. selenium调用webdriver异常

    使用selenium调用webdriver的时候报错. from selenium import webdriver browser = webdriver.Chrome() browser.get( ...

  2. Ionic2+WebApi 导出Excel转Pdf文件。

    步骤: 1.首先在WebApi中先把excel生成好. 2.把excel转成Pdf,并返回下载的链接. 3.Ionic2的页面做好下载的接口. 嗯~思路很清晰,那么下面就来详细的操作吧. 以下是H5的 ...

  3. C++ 深入理解 虚继承、多重继承和直接继承

    [摘要] 本文从5段代码实例出发,通过类中类的普通继承,类的虚继承,类的多重继承,多个虚函数类的普通继承.虚继承与多重继承,几个交叉概念,详细的阐释了继承.虚函数与虚继承的基本概念,深入剖析了继承于虚 ...

  4. python3 BeautifulSoup模块

    一.安装下载: 1.安装: pip install beautifulsoup4 2.可选择安装解析器:pip install lxmlpip install html5lib 3.解析器比较: 解析 ...

  5. gridview 选中某行后 某行的按钮显示,无选中则隐藏

    如后面的加号,选中行时出现,未被选中的隐藏 解决: 在按钮中的visibility属性中绑定该item是否选中,再用转换器转换 <Button Name="btnA" Cli ...

  6. 在MyEclipse中搭建spring-boot+mybatis+freemarker框架

    一.创建项目 1.右键-->New-->Project... 2.选中Maven Project,点击next 3.选中第一个 4.添写Group Id,Artifact Id,选择Com ...

  7. 配置Linux客户端使用socks5代理上网

    配置Linux客户端使用socks5代理上网   背景 有访问google或者其他海外网站需求的同学可能大都用过或者听过ss,在Windows.Mac.Android.IOS都有现成可用的客户端来协助 ...

  8. 初学html,任务2:写一个简单的登陆/注册界面

    先在body中把最基础的标签写出来 现在页面运行出来是这样的 就是一个没有任何样式的基础界面: 接下来我们为这些标签加上样式 首先还是让页面所有元素的padding和margin都设置为0, 清除浏览 ...

  9. Django中发件邮箱的设定

    Django中发件邮箱的设定: EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'#邮件发送到邮件服务器 #EMAIL_BACK ...

  10. 从mysql主从复制到微信开源的phxsql

    严格的来说,微信开源的phxsql不是数据库,而是一个数据库的插件: 传统的互联网数据库结构一般是这样的: 服务访问数据库是通过分片来的: 除了这种基于hash的分片,还有一种基于range的分片方式 ...