tornado向服务端发送数据和上传文件

RequestHandler.request 对象存储了关于请求的相关信息,具体属性有:

  • method HTTP的请求方式,如GET或POST;
  • host 被请求的主机名;
  • uri 请求的完整资源标示,包括路径和查询字符串;
  • path 请求的路径部分;
  • query 请求的查询字符串部分;
  • version 使用的HTTP版本;
  • headers 请求的协议头,是类字典型的对象,支持关键字索引的方式获取特定协议头信息,例如:request.headers["Content-Type"]
  • body 请求体数据;
  • remote_ip 客户端的IP地址

一:body中发送json

注意:body中的数据只能是表单格式的,其它格式:json等 都要手动处理

# -*- coding: utf-8 -*-
import tornado.web
import tornado.ioloop
import tornado.httpserver
import tornado.options
from tornado.options import options, define
from tornado.web import RequestHandler, MissingArgumentError
import json

define("port", default=8000, type=int, help="run server on the given port.")

class IndexHandler(RequestHandler):
    def post(self):
 
       
        print (self.request.headers.get("Content-Type"))
        print (self.request.body)
        json_data = self.request.body
        json_args = json.loads(json_data.decode('utf-8'))
        self.write(str(json_args))

if __name__ == "__main__":
    tornado.options.parse_command_line()
    app = tornado.web.Application([
        (r"/", IndexHandler),
    ])
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()

可能遇到的错误:

story_data = json.loads(self.request.body)

提示TypeError: the JSON object must be str, not ‘bytes’ 
改为

story_data = json.loads(self.request.body.decode('utf-8'))

就好了



二:上传文件资源(上传图片为例)

  • files 用户上传的文件,为字典类型,型如:
    {
      "form_filename1":[<tornado.httputil.HTTPFile>, <tornado.httputil.HTTPFile>],
      "form_filename2":[<tornado.httputil.HTTPFile>,],
      ... 
    }
    
    tornado.httputil.HTTPFile是接收到的文件对象,它有三个属性:
    • filename 文件的实际名字,与form_filename1不同,字典中的键名代表的是表单对应项的名字;
    • body 文件的数据实体;
    • content_type 文件的类型。 这三个对象属性可以像字典一样支持关键字索引,如request.files["form_filename1"][0]["body"]。(注意这里不是点号索引)

我们来实现一个上传文件并保存在服务器本地的小程序upload.py:

# coding:utf-8

import tornado.web
import tornado.ioloop
import tornado.httpserver
import tornado.options
from tornado.options import options, define
from tornado.web import RequestHandler

define("port", default=8000, type=int, help="run server on the given port.")

class IndexHandler(RequestHandler):
    def get(self):
        self.write("hello itcast.")

class UploadHandler(RequestHandler): 
    def post(self):
        files = self.request.files
        img_files = files.get('img') #img_files是一个列表
        if img_files:
            img_file = img_files[0]["body"]#取列表的第一个元素
            file = open("./itcast", 'w+') #以写方式打开一个文件
            file.write(img_file)
            file.close()
        self.write("OK")

if __name__ == "__main__":
    tornado.options.parse_command_line()
    app = tornado.web.Application([
        (r"/", IndexHandler),
        (r"/upload", UploadHandler),
    ])
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(options.port)
    tornado.ioloop.IOLoop.current().start()










猜你喜欢

转载自blog.csdn.net/runner668/article/details/80289346
今日推荐