化身天使的博客

python学习笔记第13章:web开发之sanic框架模块

官方文档: https://sanic.dev/zh/guide/getting-started.html

1.路由

@bp.route('/api/export', methods=["get","post"])       #同时支持get, post请求

@bp.get('/api/export/<tag:str>')                                  #get请求, 带参数路由, 指定参数类型为字符串,
@bp.get('/api/export/<tag>')                                       #tag名字随便起
async def export(request, tag):                                     #传递参数到函数
 

2.请求头

request.headers.get("my_name")       #获取请求头中的指定字段, 如有多个, 只返回第一个
request.headers.getall("my_name")     #获取指定字段, 返回列表
request.headers.get("host")            #获取主机名
request.token                                   #获取请求头中的token
request.id     
 

3. 请求           

3.1表单

request.form           #获取整个表单
request.form.get('phone')        #从表单获取phone的值
request.form.getlist('phone')   #从表单获取phone列表 

3.2body

request.body     #获取body的内容

3.3 json

request.json

request.json.get('phone')

request.json.getlist('phone') 

3.4 file

request.files      

request.files.getlist("my_file") 

 

4.响应

4.1json

from sanic import   json

return json({"key":  "value"})                         #返回json数据, 状态码200

return json({"key":  "value"}, status=201)     #自定义状态码

4.3其他类型

纯文本

from sanic import  text

return text("Hi")

5.文件下载

5.1下载本地文件

return await response.file(src, mime_type="text/csv", filename="名字")          #文件路径, 文件类型, 文件名(后两项可选)

5.2下载文件流

return response.HTTPResponse(data,  content_type="text/csv")
 

6.文件上传

6.1前端vue+axios

vue代码

   let formData = new FormData();        //创建一个表单
            var file_ref = this.$refs.upload_ref.files[0];
            formData.append('file', file_ref);              //这里的名字file和sanic要获取的名字对应
            formData.append('name', file_ref.name);
            //2.获取token
            let token = sessionStorage.getItem("token")

            //3.配置请求头
            let config = {
                timeout: 5000,
                headers: {
                    "content-type": 'application/x-www-form-urlencoded', //表单需要设为此种类型
                    "Authorization": "Bearer " + token, 
                }
            }
            //4.提交数据
            axios.post('/api/upload', formData, config)

sanic代码

@query.post("/api/upload")
@protected
async def query_data(request):
    file = request.files.get("file").body  #"file"是前端传来的参数中的名字

    #request.files.get("file").name  #也可以从files中获取文件名

    name = request.form.get("name")     #从表单获取filename

    with open(name, "wb") as f:            #以二进制形式写入文件
        f.write(file)
    return json({'h': f"{name}上传成功"})

 

 

6.2 前端xhr方式

sanic代码

#接收前端传递的文件, 保存到本地
@query.post("/api/upload")
async def query_data(request):
    filename = request.headers.get("filename") #从请求头获取filename, 在js的请求头定义
    filename = urllib.parse.unquote(filename)  #转换编码
    with open(filename, "wb") as f:            #以二进制形式写入文件
        f.write(request.body)
    return json({'h':"上传成功"})
posted @ 2021-08-07 22:52  化身天使  阅读(482)  评论(0)    收藏  举报