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中一样可以任意调用方法和字符串