request 实例包含很多参数。
(1) 请求体 body
可以通过request 的json 、body、form 、files 获取从客户端post 提交的数据或文件(2) 上下文
request.ctx 是存储request 相关信息的地方,通常存储服务器端通过某些验证后需要临时存储身份认证信息以及专有变量等内容。 具体内容在中间件部分介绍。
@app.middleware('request')
async def run_before_handler(request):
#request.ctx.user = await fetech_user_by_token(request.token)
# 官网这个语句中带有fetch,会报错
if request.token is not None:
#如果token存在,则根据token 在服务器端查到相应的用户,这里简化处理,直接把token作为用户名
request.ctx.user = request.token
else:
request.headers['Authoriation'] = "token testtoken"
request.ctx.user = "token testtoken"
@app.route("/")
async def hi_my_token_is(request):
return text("Hi, my token is {}".format(request.ctx.user))
(3) 连接上下文 connection context
当多个请求共享一个连接时,sanic 提供一个上下文对象来允许这些请求共享状态
@app.on_request
async def count(request):
if not hasattr(request.conn_info.ctx, 'foo'):
request.conn_info.ctx.foo =0
request.conn_info.ctx.foo += 1
@app.route("/")
async def count_foo(request):
return text(f'request.conn_info.ctx.foo={request.conn_info.ctx.foo}')
每次浏览器访问时,count的值都会加1 ,说明服务器端记录着上次访问时count的状态
==============
@app.middleware('request') 与 @app.on_request()
所谓中间件就是在服务器接手请求之前或之后执行的函数。用于修改传request 或在返回response 之前
==========
(4) 路由参数 :
路径中包含可变参数,根据参数的不同进行不同处理
(5) 请求参数 [不知道有啥用,暂置不论]
在reques台终,通过两种属性访问请求参数
request.args
request.query_args