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':"上传成功"})

浙公网安备 33010602011771号