请求数据

当端点接收到HTTP请求时,路由函数将传递一个请求对象。

以下变量可作为请求对象的属性进行访问:

  • JSON(任意)-JSON主体

    from sanic.response import json
    
    @app.route("/json")
    def post_json(request):
        return json({ "received": True, "message": request.json })
    
  • args (dict) - Query string variables. A query string is the section of a URL that resembles ?key1=value1&key2=value2. If that URL were to be parsed, the args dictionary would look like {'key1': ['value1'], 'key2': ['value2']}. The request's query_string variable holds the unparsed string value. Property is providing the default parsing strategy. If you would like to change it look to the section below (Changing the default parsing rules of the queryset).

    from sanic.response import json
    
    @app.route("/query_string")
    def query_string(request):
        return json({ "parsed": True, "args": request.args, "url": request.url, "query_string": request.query_string })
    
  • 查询参数(list)-在许多情况下,您需要以一种不那么紧凑的形式访问URL参数。query参数是(key,value)元组的列表。属性提供默认的分析策略。如果要更改它,请查看下面的部分(更改查询集的默认解析规则)。对于相同的上一个URL查询集?key1=value1&key2=value2,查询参数列表如下 [('key1'、'value1')、('key2'、'value2')] . 如果多个参数具有相同的键,比如?key1=value1&key2=value2&key1=value3查询参数列表如下 [('key1'、'value1')、('key2'、'value2')、('key1'、'value3')] .

    queryset的request.args和request.query参数之间的差异?key1=value1&key2=value2&key1=value3

    from sanic import Sanic
    from sanic.response import json
    
    app = Sanic(__name__)
    
    
    @app.route("/test_request_args")
    async def test_request_args(request):
        return json({
            "parsed": True,
            "url": request.url,
            "query_string": request.query_string,
            "args": request.args,
            "raw_args": request.raw_args,
            "query_args": request.query_args,
        })
    
    if __name__ == '__main__':
        app.run(host="0.0.0.0", port=8000)
    

    产量

    {
      "parsed":true,
      "url":"http:\/\/0.0.0.0:8000\/test_request_args?key1=value1&key2=value2&key1=value3",
      "query_string":"key1=value1&key2=value2&key1=value3",
      "args":{"key1":["value1","value3"],"key2":["value2"]},
      "raw_args":{"key1":"value1","key2":"value2"},
      "query_args":[["key1","value1"],["key2","value2"],["key1","value3"]]
    }
    

    原始参数只包含key1的第一个条目。将在将来的版本中被弃用。

  • 文件(文件对象字典)-具有名称、正文和类型的文件列表

    from sanic.response import json
    
    @app.route("/files")
    def post_json(request):
        test_file = request.files.get('test')
    
        file_parameters = {
            'body': test_file.body,
            'name': test_file.name,
            'type': test_file.type,
        }
    
        return json({ "received": True, "file_names": request.files.keys(), "test_file_parameters": file_parameters })
    
  • 表单(dict)-发布的表单变量。

    from sanic.response import json
    
    @app.route("/form")
    def post_json(request):
        return json({ "received": True, "form_data": request.form, "test": request.form.get('test') })
    
  • 正文(字节)-已发布的原始正文。此属性允许检索请求的原始数据,而不考虑内容类型。

    from sanic.response import text
    
    @app.route("/users", methods=["POST",])
    def create_user(request):
        return text("You are trying to create a user with the following POST: %s" % request.body)
    
  • 头(dict)-包含请求头的不区分大小写的字典。

  • 方法(str)-请求的HTTP方法(即get、post)。

  • IP(str)-请求者的IP地址。

  • 端口(str)-请求者的端口地址。

  • 套接字(元组)-请求者的(IP,端口)。

  • 应用程序-对处理此请求的SANIC应用程序对象的引用。当在没有访问全局应用程序对象的模块中的设计图或其他处理程序内时,这很有用。

    from sanic.response import json
    from sanic import Blueprint
    
    bp = Blueprint('my_blueprint')
    
    @bp.route('/')
    async def bp_root(request):
        if request.app.config['DEBUG']:
            return json({'status': 'debug'})
        else:
            return json({'status': 'production'})
    
  • url:请求的完整url,即:http://localhost:8000/posts/1/?Fo=棒

  • 方案:与请求关联的URL方案:“http” |https| ws wss'或头文件给出的任意值。

  • 主机:与请求关联的主机(在主机头中):localhost:8080

  • 服务器名称:服务器的主机名,没有端口号。该值按以下顺序显示:config.server_name,x-forwarded-host header,:func:request.host

  • 服务器端口:类似服务器名称。请按以下顺序查看:x-forwarded-port头,:func:request.host,传输层套接字使用的实际端口。

  • 路径:请求的路径:/posts/1/

  • 查询字符串:请求的查询字符串:foo=bar或空字符串''

  • uri_template:匹配路由处理程序的模板:/posts/<id>/

  • 令牌:授权头的值:basic ywrtaw46ywrtaw4=

  • url-for:和sanic.sanic.url-for一样,但根据请求自动确定方案和netloc。由于此方法旨在生成正确的模式和netloc,_external是隐含的。

更改查询集的默认分析规则

在args和query args属性中内部用于分析queryset的默认参数:

  • keep_blank_values(bool):false-指示百分比编码查询中的空值是否应被视为空字符串的标志。一个真值表示空格应保留为空字符串。默认的false值表示忽略空白值,并将其视为不包括在内。

  • 严格分析(bool):错误-指示如何处理分析错误的标志。如果为false(默认值),则默认忽略错误。如果为true,则错误会引发ValueError异常。

  • 编码和错误(str):'utf-8'和'replace'-指定如何将百分比编码序列解码为Unicode字符,bytes.decode()方法接受这一点。

如果要更改该默认参数,可以使用新值调用get-args和get-query-args方法。

对于queryset/?test1=value1&test2=test3=value3:

from sanic.response import json

@app.route("/query_string")
def query_string(request):
    args_with_blank_values = request.get_args(keep_blank_values=True)
    return json({
        "parsed": True,
        "url": request.url,
        "args_with_blank_values": args_with_blank_values,
        "query_string": request.query_string
    })

输出将是:

{
    "parsed": true,
    "url": "http:\/\/0.0.0.0:8000\/query_string?test1=value1&test2=&test3=value3",
    "args_with_blank_values": {"test1": ["value1"], "test2": "", "test3": ["value3"]},
    "query_string": "test1=value1&test2=&test3=value3"
}

使用get和getlist访问值

返回字典的请求属性实际上返回一个子类dict,称为requestParameters。使用此对象时的主要区别是get和getlist方法之间的区别。

  • get(key,default=none)正常工作,但是当给定的key的值是一个列表时,只返回第一个项。

  • getlist(key,默认值为none)正常工作,返回整个列表。

from sanic.request import RequestParameters

args = RequestParameters()
args['titles'] = ['Post 1', 'Post 2']

args.get('titles') # => 'Post 1'

args.getlist('titles') # => ['Post 1', 'Post 2']

使用request.endpoint属性访问处理程序名称

request.endpoint属性保存处理程序的名称。例如,下面的路由将返回“hello”。

from sanic.response import text
from sanic import Sanic

app = Sanic()

@app.get("/")
def hello(request):
    return text(request.endpoint)

或者,对于蓝图,它将包含两者,并用一个句号分隔。例如,下面的路由将返回foo.bar:

from sanic import Sanic
from sanic import Blueprint
from sanic.response import text


app = Sanic(__name__)
blueprint = Blueprint('foo')

@blueprint.get('/')
async def bar(request):
    return text(request.endpoint)

app.blueprint(blueprint)

app.run(host="0.0.0.0", port=8000, debug=True)