views包
用来存放视图函数
applation.py
用来存放路由和配置
config.py
用来设置配置信息
static目录
静态文件
templates目录
存放模板文件
server.py
服务器
debug/autoreload
设置tornado是否是在工作模式下,默认时False,即工作在生产模式下。
= True的4个特性:
1.自动重启,tornado会监控源代码文件,当有保存改动,便会重新启动服务器,这样可以减少
手动重启的次数从而提高开发效率
注意:如果保存后代码有错误会导致重启失败,修改错误后就不会自动重启了
autoreload = True
2.取消缓存编译的模板
compiled_template_cache = False
3取消缓存静态文件的hash值
static_hash_cache = False
4提供追踪信息
serve_traceback = True
5关闭当前项目的的自动转义(一般不用)
"autoescape":None,
6 配置安全cookie密钥
"cookie_secret":"tfA8keUBRy2y+HdXA91DSSDVq3v3EUp6gbsGqeHUHTA=",
7 开启XSRF保护
"xsrf_cookies":True
8 不符合验证用户的逻辑,请求会将访客重定向到配置中的login_url所指定的路由
"login_url":"/login"
static_path
设置静态文件目录
template_path
设置模板文件目录
(r’/’,index.IndexHandler) 无参数
正常书写http 的 GET,POST等一些方法
(r’/luciano’,index.LucianoHandler,{“word1”:“good”,“word2”:“nice”}), 有参数
需要重写initialize()方法接受传递的参数
tornado.web.url(r’/yaoge’,index.yaogeHandler,{“word3”:“good”,“word4”:“nice”},name=“fanxiangdaili”) 有参数+反向解析
tornado.web.url()如果使用name属性来写带反向解析的路由,不能直接使用元组写
self.reverse_url("fanxiangdaili") 会获取到name为“fanxiangdaili”的路由的正则匹配
利用HTTP协议向服务器传递参数
提取uri的特定部分
http://127.0.0.1:9000/liuyifei/is/a/woman
url:(r'/liuyifei/(\w+)/(\w+)/(\w+)',index.liuyifeiHandler),
handler:class liuyifeiHandler(RequestHandler):
# 接受路由的正则表达式的"组"
def get(self,h1,h2,h3,*args,**kwargs):
print(h1+"-"+h2+"-"+h3)
self.write("刘亦菲")
----------------------------------------------------
url:(r'/liuyifei/(?P<h1>\w+)/(?P<h2>\w+)/(?P<h3>\w+)', index.liuyifeiHandler),
handler:class liuyifeiHandler(RequestHandler):
# 接受路由的正则表达式的"组"
def get(self,h3,h1,h2,*args,**kwargs):
print(h1+"-"+h2+"-"+h3)
self.write("刘亦菲")
查询字符串(get方式传递参数)
http://127.0.0.1:9000/zhangmanyu?a=1&b=2&c=3
get_query_argumenr()方法:
self.get_query_argument(name,default=ARG_DEFAULT,strip=True)
参数说明:
name:从get请求参数字符串中返回指定参数的值
注意:如果出现多个同名参数,返回的是最后一个值
default:如果设置了未传的name参数时会返回default的默认的值,
如果default也没有设置,那么会抛出警告"tornado.web.MissingArgumentError"
strip:表示是否过滤掉两边的空白字符,默认True
------------------------------------------
实例:
application:
(r'/zhangmanyu',index.zhangmanyu),
handler:
class zhangmanyu(RequestHandler):
def get(self,*args,**kwargs):
a = self.get_query_argument("a")
b = self.get_query_argument("b")
c = self.get_query_argument("c")
print(a,b,c)
self.write("张曼玉")
----------------------------------------------
http://127.0.0.1:9000/zhangmanyu?a=1&a=2&b=2&c=3
get_query_argumenrs()方法:
self.get_query_arguments(name,strip=True)
class zhangmanyu(RequestHandler):
def get(self,*args,**kwargs):
alist = self.get_query_arguments("a")
b = self.get_query_argument("b")
c = self.get_query_argument("c")
print(alist[0],alist[1],b,c)
self.write("张曼玉")
请求体携带数据(post方式传递参数)
self.get_body_argument(name,default=ARG_DEFAULT,strip=True)
self.get_body_arguments(name,strip=True)
-------------------------------------------------
实例:
class postfile(RequestHandler):
# get用来展示页面
def get(self, *args, **kwargs):
self.render('postfile.html')
# post用来接受Post请求传递过来的数据
def post(self, *args, **kwargs):
username = self.get_body_argument("username")
password = self.get_body_argument("password")
hobbylist = self.get_body_arguments("hobby")
print(username,password,hobbylist)
self.write("dsd")
既可以获取get请求,也可以获取post请求(一般不用)
self.get_argument(name,default=ARG_DEFAULT,strip=True)
self.get_arguments(name,strip=True)
在http报文头中增加自定义字段
sad
request对象
method : HTTP请求的方式
host : 被请求的主机名
uri : 请求的完整资源地址,它包括路径和get查询参数部分
path : 请求的路径部分
query : 请求参数部分
version : 使用的http版本
headers : 请求的协议头,是一个字典类型
body : 请求体数据
remote_ip : 客户端的ip地址
files : 用户上传的文件,是一个字典类型
实例:
def get(self,*args,**kwargs):
print(self.request.method)
tornado.httputil.HTTPFile对象
filename :文件实际名字
body : 文件的数据实体
content_type : 文件的类型
文件对象的格式:
{
‘file’:[
{
‘filename’:‘a.txt’,
‘body’:'lucinao is goodman ',
‘content_type’:‘text/plain’
},{}
],
'img':[
{
'filename':'a.png',
'body':'afwaeeij8998sdf32jo... ',
'content_type':'image/png'
},{},{}...
]
}
代码部分:
import config
import os
class upfileHandler(RequestHandler):
def get(self,*args,**kwargs):
self.render(‘upfile.html’)
def post(self,*args,**kwargs):
filesDict = self.request.files
# 遍历 文件所有对象集合的key
for inputname in filesDict:
# 获取字典对象中的 valus 即 一个列表
fileArr = filesDict[inputname]
# 获取文件对象
for fileobj in fileArr:
# 指定存储路径
filePath = os.path.join(config.BASE_DIRS,'upfile/'+fileobj.filename)
# 保存到服务器的upfile文件上
with open(filePath,'wb') as f:
f.write(fileobj.body)
self.write("上传成功")