Flask(三) 请求

104 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

9. 请求

9.1 url路径参数

从路径中获取参数是Restful接口的常用做法

示例:

@user_bp.route('/profile/<user_id>')
def get_user_profile(user_id):
    return "user_profile,{}".format(user_id)

使用<>包裹参数即可,函数的参数要与路径的参数保持一致

效果:

也可以通过指定参数的类型来转换参数

@user_bp.route('/profile/<int:user_id>')
def get_user_profile(user_id):
    print(type(user_id))
    return "user_profile,{}".format(user_id)

通过int:参数名 的方式指定参数是一个int类型,这样函数中的参数就会被转换为int

效果:

9.2 转换器

上面的int:参数名 就是一种转换器,可以将路径中的参数转换为对应的类型

Flask提供了一部分默认的转换器

其实都是继承了BaseConverter类,这个类由Werkzeug.routing提供.

Flask默认使用的是UnicodeConverter,也就是将参数转换为str

除了上面Flask提供的默认转换器,我们也可以自定义转换器,只需要继承BaseConverter,然后再重写正则表达式即可

  1. 继承BaseConverter,重写正则表达式
  2. 注册BaseConverter
  3. 使用BaseConverter

示例:

from flask import Flask
from werkzeug.routing import BaseConverter

app = Flask(__name__)

# 自定义转换器类
class MobileConverter(BaseConverter):
    """
    自定义手机号转换器
    """
    regex = r'1[3-9]\d{9}'

# 注册mobile转换器
app.url_map.converters['mobile'] = MobileConverter

# 使用mobile转换器,注意此处使用的moible转换器名应与注册时的名字保持一致
@app.route("/user/<mobile:mobile>")
def get_user_mobile(mobile):
    print(type(mobile))
    return "mobile: {}".format(mobile)

效果

输入正确格式的手机号才能正常访问

同时可以看到参数的格式:

9.3 其他参数

除了路径的参数外,我们还有很多其他参数

比如url后?的参数,post请求的请求体,form等

可以通过request获取这些参数

from flask import Flask, request

app = Flask(__name__)


@app.route("/request")
def get_request_param():
    print(request.data)
    print(request.args.get("a"))
    print(request.headers)
    print(request.cookies)
    print(request.files)
    print(request.form)
    return "ok"

从flask中导入request全局变量

在视图中可以使用request对象来获取各种参数.