【Sanic】请求 Request 4

该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().

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值