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:

本文深入探讨了Tornado框架中HTTP请求对象的详细属性,包括method、host、url、path等,并展示了如何在服务器端处理和响应这些请求。此外,还介绍了如何使用Tornado接收和保存从浏览器上传的文件。
4868

被折叠的 条评论
为什么被折叠?



