当前位置: 首页 > 工具软件 > Tornado > 使用案例 >

tornado总结

徐凌
2023-12-01
1.
    import tornado.ioloop
import tornado.web


class MainHandler(tornado.web.RequestHandler):    #定义视图处理方法
    def get(self):
            self.write('<html><body><form action="/" method="post">'
                   '<input type="text" name="message">'
                   '<input type="submit" value="Submit">'
                   '</form></body></html>')


    def post(self):
        self.set_header("Content-Type", "text/plain")
        self.write("You wrote " + self.get_argument("message"))


write方法,相当与django中HttpResponse
响应三种  self.write('ok')  self.render('index.html', user='user')   self.redirect('/index/')
get_argument(‘message’)相当于request.POST.get("message"),注意其为方法,不是字典get_argument()页


application = tornado.web.Application([        #定义url
    (r"/", MainHandler),
    (r"/index/", MyHandler,  dict(var="test")),   #向视图中传值,用方法dict ,值为关键字传值,也可已以字典形式{"var": "test"}
    ],
    cookie_secret="1111"   #设置cookie安全码
 )
注意url的与django不同,不支持“^$”   且url前必须有“/”
url仍然支持路径传值
if __name__ == "__main__":
    application.listen(8888)       #定义端口
    tornado.ioloop.IOLoop.instance().start()    #启动服务
每次代码修改,都要重启服务
2.
    上传的文件可以通过 self.request.files 访问到,该对象将名称(HTML元素 <input type="file">的 name 属性)对应到一个文件列表。每一个文件都以字典的形式存在,其格式为 {"filename":..., "content_type":..., "body":...}。
3.
    如果你想要返回一个错误信息给客户端,例如“403 unauthorized”,只需要抛出一个 tornado.web.HTTPError 异常:


if not self.user_is_logged_in():
    raise tornado.web.HTTPError(403)
4.
    支持{{items[0]}}  即支持‘[]’,也支持"()"
5.
    Tornado 中的重定向有两种主要方法:self.redirect,或者使用 RedirectHandler。
注意,在 self.redirect 和 RedirectHandler 中,permanent 的默认值是不同的。这样做是有一定道理的,self.redirect 通常会被用在自定义方法中,是由逻辑事件触发的(例如环境变更、用户认证、以及表单提交)。而 RedirectHandler 是在每次匹配到请求 URL 时被触发。
6.
    self.render('test.html', var="value", weibos=weibos)  直接向模板中传值
7.
    self.get_cookie("username")  得到cookie
    self.set_cookie("username", "alen")  设置cookie
  self.get_secure_cookie("username")  得到设置安全后的cookie
    self.set_secure_cookie("username", "alen")  设置安全cookie    用于login
在重写get_current方法后,登录的用户名字符串储存于   self.current_user
然后下面定义的类,只继承BaseHandler就可以了
  class BaseHandler(tornado.web.RequestHandler):
      def get_current_user(self):
          return self.get_secure_cookie('username')




8.
    在模板中字典的访问可以通过 ' . '也可以通过'['key']'
    {{user.name}}   {{user['name']}}
9.
    {% extends 'base.html' %}
     {% block  part1 %}  ....{% end %}
    {% for var in vars %}....{% end%} 注意不是{% endfor %}
    {% if    %}    {% end %}
10.
    视图方法没有return
11.
    self.request.arguments = {u'username': ['11'], u'password': ['1'], u'repassword': ['1']}    {'变量名': [ '内容' ]}
    self.request.files = {u'headimg': [{'body': '\x00"\x08\x02\x00\x00\x00\x1b\x\x00', 'content_type': u'image/png', 'filename': u'logo.png'}]}
              {'变量名': [ {'body': '文件内容', 'content_type': '类型',  'filename': '文件名' } ]}
12.
  select column_name from information_schema.columns where table_name='users;  MySQL得到表的字段名的命令
13.
    db.get(....)得到结果为多个时会报错,但是没有得到值不会报错,于django不同,django没有得到值也会报错
14.
    self.write('ok')  会将信息写入,但是并没有return 下面的语句会继续执行,所以最好加上return  self.write('ok')
15.
    self.clear_cookie('username')  注销 清除cookie
    self.clear_all_cookies()  清除所有cookie
16.
   dict(a='b')  返回{'a': 'b'}
17.
    静态文件有默认url路径 '/static/'  ,自定义上传文件见于程序
     (r'/media/(.*)', tornado.web.StaticFileHandler, dict(path=settings['medi    a_path']))   #处理上传文件的方法,访问'/media/',记得url分组
18.
    TRUNCATE TABLE 表名 清空表内数据
    DROP TABLE IF EXISTS users;  如果存在users删除
CREATE TABLE IF NOT EXISTS `users`; 如果不存在建立users ,反引号可加可不加
19.
     text---存储可变长度的非Unicode数据.经验正可以存储utf8
20.
     hasattr(list,  'append') 判断类或实例化的对象是否有后面的属性或方法,返回布尔值
21.
     元组可以作为字典的key
22.
       drop table if exists users;
        create table if not exists users (
            id int(8) unsigned not null auto_increment primary key,
            username char(30)     #sql语句最后没有 ' , '
        )ENGINE=InnoDB DEFAULT CHARSET=utf8;
23.
     ERROR 1005 (HY000): Can't create table 'db.udlend' (errno: 150)
    外键和被引用外键类型不一样,比如integer和double,   一个是int   unsigned 另一个只是 int
找不到要被引用的列
表的字符编码不一样
24.
     _mysql_exceptions.IntegrityError: (1217, 'Cannot delete or update a parent row: a foreign key constraint fails')
这可能是MySQL在InnoDB中设置了foreign key关联,造成无法更新或删除数据。可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况。 SET FOREIGN_KEY_CHECKS = 0;删除完成后设置 SET FOREIGN_KEY_CHECKS = 1;
25.
     char的总结:
      char最大长度是255字符,注意是字符数和字符集没关系。可以有默认值,尾部有空格会被截断。
varchar的总结:
      varchar的最大长度65535是指能存储的字节数,其实最多只能存储65532个字节,还有3个字节用于存储长度。注意是字节数这个和字符集有关系。一个汉字字符用utf8占用3字节,用gbk占用2字节。可以有默认值,尾部有空格不会截断。
text的总结:
      text和varchar基本相同。text会忽略指定的大小这和varchar有所不同,text不能有默认值。尾部有空格不会被截断。text使用额外的2个字节来存储数据的大小,varchar根据存储数据的大小选择用几个字节来存储。text的65535字节全部用来存储数据,varchar则会占用1-3个字节去存储数据大小。
26.
     (2014, "Commands out of sync; you can't run this command now")
    再次运行一次代码,可能就没事了
27.
         self.table = table
       def my_filter(self, key=' "" ' , value=''): #当不传值时,就是查询所有,key的默认值是关键
          '''查找结果是个列表'''
          sql = 'select * from %s where %s="%s"'%(self.table, key, value)
          objs = db.query(sql)
          return objs
28.
     {{users.my_get('id', note.uid).username}} 模板语言非常灵活和py中一样可以任意调用方法和字符串
 类似资料: