Request对象
request对象包括:
参数 | 功能 |
---|---|
method | HTTP请求方式 |
host | 被请求的主机 |
url | 请求的完整资源地址,包括路径和get查询参数部分 |
path | 请求路径部分 |
query | 请求的参数部分 |
version | HTTP的版本 |
headers | 请求的协议头,是个字典 |
body | 请求的体数据 |
remote_ip | 客户端的IP |
files | 用户上传的文件,字典类型 |
打印一下这些信息:
增加questobject路由信息:
from views.index import IndexHandler,HomeHandler,QuestObjectHandler
import tornado.web
import config
class Application(tornado.web.Application):
def __init__(self):
handlers=[
(r'/',IndexHandler),
(r'/home',HomeHandler),
(r'/questobject',QuestObjectHandler)
]
super(Application,self).__init__(handlers,**config.settings)
编写questobject页面:
from tornado.web import RequestHandler
import templates
import config
import os
class IndexHandler(RequestHandler):
def get(self):
self.write("test:root page")
class HomeHandler(RequestHandler):
def get(self):
self.write("test:Home")
class QuestObjectHandler(RequestHandler):
def get(self, *args, **kwargs):
print(self.request.host)
print(self.request.uri)
print(self.request.path)
print(self.request.query)
print(self.request.version)
print(self.request.headers)
print(self.request.body)
print(self.request.remote_ip)
print(self.request.files)
self.write("quest object test")
代码的内容是在服务器本地打印request的一些属性信息,然后在浏览器中显示:quest object test
运行结果:
在浏览器中输入:localhost:6578/questobject 后,浏览器显示:
然后在服务器端显示:
tornado.httputil.HTTPFile对象
这个对象是接收到的文件对象,浏览器每次上传一个文件就有一个这个对象
这个对象的属性有:
属性 | 功能 |
---|---|
filename | 文件的实际名字 |
body | 文件的数据实体 |
content-type | 文件的类型 |
浏览器上传文件
现在我们来尝试通过浏览器上传文件。
首先添加一下上传页面httpfile的路由信息:
from views.index import IndexHandler,HomeHandler,HttpFileHandler
import tornado.web
import config
class Application(tornado.web.Application):
def __init__(self):
handlers=[
(r'/',IndexHandler),
(r'/home',HomeHandler),
(r'/httpfile',HttpFileHandler)
]
super(Application,self).__init__(handlers,**config.settings)
然后写一下上传页面HttpFileHandler的代码:
from tornado.web import RequestHandler
import templates
import config
import os
class IndexHandler(RequestHandler):
def get(self):
self.write("test:root page")
class HomeHandler(RequestHandler):
def get(self):
self.write("test:Home")
class HttpFileHandler(RequestHandler):
def get(self, *args, **kwargs):
self.render("upfile.html")
def post(self, *args, **kwargs):
files=self.request.files
print(files)
self.write("your files have been successfully uploaded")
- get方法向浏览器端显示了一个html页面"upfile.html"
- post方法用于获得客户上传的文件,并在服务器端打印出上传文件的内容,最后在浏览器端显示信息:your files have been successfully uploaded
upfile.html的代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>upfile</title>
</head>
<body>
<form method="post" action="/httpfile" enctype="multipart/form-data">
<input type="file" name="file"/>
<input type="file" name="file"/>
<input type="file" name="img"/>
<input type="submit" value="upload"/>
</form>
</body>
</html>
运行结果:
在浏览器中输入:localhost:6578/upfile 然后上传2个文件test1.txt和test2.txt:
选择upload之后,浏览器显示为:
同时服务器本地显示为:
服务器终端显示的是files对象:
files对象是个字典,键是’file’,值是一个列表,列表里面是我们的上传的2个文件对象.
这两个文件对象都有3个属性:filename,body和contenttype
保存上传的文件
现在来尝试一下保存客户端上传的文件,我们直接修改httpfile页面类HttpFileHandler,将在服务器端显示上传文件内容的代码改为保存上传文件。
from tornado.web import RequestHandler
import templates
import config
import os
class IndexHandler(RequestHandler):
def get(self):
self.write("test:root page")
class HomeHandler(RequestHandler):
def get(self):
self.write("test:Home")
class HttpFileHandler(RequestHandler):
def get(self, *args, **kwargs):
self.render("upfile.html")
def post(self, *args, **kwargs):
files=self.request.files
for key in files:
filelist=files[key]
for file in filelist:
filepath=os.path.join(config.BASE_DIR,'upfile/'+file.filename)
with open(filepath,'wb') as f:
f.write(file.body)
self.write("your files have been uploaded successfully")
files:
files=self.request.files 是个字典,键是’file’,值是一个列表
filelist=files[key] 就是files的值,那个列表
file:是我们的文件,是个字典,包含filename,body和content-type三部分内容
运行结果:
在浏览器中输入: localhost:6578/httpfile
上传两个文件后:
同时服务器本地的upfile文件夹中新增加了2个文件test1.txt和test2.txt: