该Request实例包含许多有关其参数的有用信息
Request Body:
request.json:
参数:request.json
描述:解析后的 JSON 对象
$ curl localhost:8000 -d '{"foo": "bar"}'
>>> print(request.json)
{'foo': 'bar'}
request.body
参数:request.body
说明:请求正文中的原始字节
$ curl localhost:8000 -d '{"foo": "bar"}'
>>> print(request.body)
b'{"foo": "bar"}'
request.form
参数:request.form
说明:表单数据
$ curl localhost:8000 -d 'foo=bar'
>>> print(request.body)
b'foo=bar'
>>> print(request.form)
{'foo': ['bar']}
>>> print(request.form.get("foo"))
bar
>>> print(request.form.getlist("foo"))
['bar']
request.files
$ curl -F 'my_file=@/path/to/TEST' http://localhost:8000
>>> print(request.body)
b'--------------------------cb566ad845ad02d3\r\nContent-Disposition: form-data; name="my_file"; filename="TEST"\r\nContent-Type: application/octet-stream\r\n\r\nhello\n\r\n--------------------------cb566ad845ad02d3--\r\n'
>>> print(request.files)
{'my_file': [File(type='application/octet-stream', body=b'hello\n', name='TEST')]}
>>> print(request.files.get("my_file"))
File(type='application/octet-stream', body=b'hello\n', name='TEST')
>>> print(request.files.getlist("my_file"))
[File(type='application/octet-stream', body=b'hello\n', name='TEST')]
供参考
request.files对象是几种类型之一,它是一个字典,每个值都是一个列表。这是因为 HTTP 允许重复使用单个键来发送多个值。
大多数情况下,您希望使用该.get()方法访问第一个元素而不是列表。如果您确实想要所有项目的列表,则可以使用.getlist().
context
Request context
request.ctx
用于存储您需要的有关请求的任何信息。
这通常用于存储诸如经过身份验证的用户详细信息之类的项目。我们稍后会更多地介绍中间件,但这里有一个简单的例子
@app.on_request
async def run_before_handler(request):
request.ctx.user = await fetch_user_by_token(request.token)
@app.route('/hi')
async def hi_my_name_is(request):
return text("Hi, my name is {}".format(request.ctx.user.name))
一个典型的用例是将从数据库获取的用户对象存储在身份验证中间件中。在请求期间,所有后来的中间件以及处理程序都可以访问添加的密钥。
自定义上下文是为应用程序和扩展保留的。Sanic 本身并没有使用它。
Connection context 连接上下文
通常,您的 API 需要为同一客户端提供多个并发(或连续)请求。例如,这种情况经常发生在需要查询多个端点以获取数据的渐进式 Web 应用程序中。
HTTP 协议要求减少由使用保持活动标头的连接引起的开销时间。
当多个请求共享一个连接时,Sanic 提供了一个上下文对象来允许这些请求共享状态。
@app.on_request
async def increment_foo(request):
if not hasattr(request.conn_info.ctx, "foo"):
request.conn_info.ctx.foo = 0
request.conn_info.ctx.foo += 1
@app.get("/")
async def count_foo(request):
return text(f"request.conn_info.ctx.foo={request.conn_info.ctx.foo}")
$ curl localhost:8000 localhost:8000 localhost:8000
request.conn_info.ctx.foo=1
request.conn_info.ctx.foo=2
request.conn_info.ctx.foo=3
Parameters 参数
从路径中提取的值作为参数注入处理程序,或者更具体地说作为关键字参数。路由部分中有更多关于此的详细信息。
@app.route('/tag/<tag>')
async def tag_handler(request, tag):
return text("Tag - {}".format(tag))
Arguments 参数
request实例上有两个属性可以获取查询参数:
request.args
request.query_args
$ curl http://localhost:8000\?key1\=val1\&key2\=val2\&key1\=val3
>>> print(request.args)
{'key1': ['val1', 'val3'], 'key2': ['val2']}
>>> print(request.args.get("key1"))
val1
>>> print(request.args.getlist("key1"))
['val1', 'val3']
>>> print(request.query_args)
[('key1', 'val1'), ('key2', 'val2'), ('key1', 'val3')]
>>> print(request.query_string)
key1=val1&key2=val2&key1=val3
request.args对象是几种类型之一,它是一个字典,每个值都是一个列表。这是因为 HTTP 允许重复使用单个键来发送多个值。
大多数情况下,您希望使用该.get()方法访问第一个元素而不是列表。如果您确实想要所有项目的列表,则可以使用.getlist().