3-flask 中的请求和响应

Posted 爱编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3-flask 中的请求和响应相关的知识,希望对你有一定的参考价值。

一:处理请求

1:动态路由

有一个请求访问的接口地址为/users/123,其中123实际上为具体的请求参数,表明请求123号用户的信息。此时如何从url中提取出123的数据?

Flask不同于Django直接在定义路由时编写正则表达式的方式,而是采用转换器语法:

@app.route(\'/users/<user_id>\')
def user_info(user_id):
    print(type(user_id))
    return \'hello user {}\'.format(user_id)

此处的<>即是一个转换器,默认为字符串类型,即将该位置的数据以字符串格式进行匹配、并以字符串为数据类型类型、 user_id为参数名传入视图。

Flask也提供其他类型的转换器

DEFAULT_CONVERTERS = {
    \'default\':          UnicodeConverter,
    \'string\':           UnicodeConverter,
    \'any\':              AnyConverter,
    \'path\':             PathConverter,
    \'int\':              IntegerConverter,
    \'float\':            FloatConverter,
    \'uuid\':             UUIDConverter,
}

将上面的例子以整型匹配数据,可以如下使用:

@app.route(\'/users/<int:user_id>\')
def user_info(user_id):
    print(type(user_id))
    return \'hello user {}\'.format(user_id)


@app.route(\'/users/<int(min=1):user_id>\')
def user_info(user_id):
    print(type(user_id))
    return \'hello user {}\'.format(user_id)

自定义转换器

如果遇到需要匹配提取/sms_codes/18512345678中的手机号数据,Flask内置的转换器就无法满足需求,此时需要自定义转换器。

定义方法

自定义转换器主要做3步

1:创建转换器类,保存匹配时的正则表达式 

from werkzeug.routing import BaseConverter

class MobileConverter(BaseConverter):
    """
    手机号格式
    """
    regex = r\'1[3-9]\\d{9}\'

2:将自定义的转换器类告诉flask对象

app = Flask(__name__)

# 将自定义转换器添加到转换器字典中,并指定转换器使用时名字为: mobile
app.url_map.converters[\'mobile\'] = MobileConverter

3:在使用转换器的地方第一使用

@app.route(\'/sms_codes/<mobile:mob_num>\')
def send_sms_code(mob_num):
    return \'send sms code to {}\'.format(mob_num)

2. 其他参数

如果想要获取其他地方传递的参数,可以通过Flask提供的request对象来读取。

不同位置的参数都存放在request的不同属性中

 

属性说明类型
data 记录请求的数据,并转换为字符串 *
form 记录请求中的表单数据 MultiDict
args 记录请求中的查询参数 MultiDict
cookies 记录请求中的cookie信息 Dict
headers 记录请求中的报文头 EnvironHeaders
method 记录请求使用的HTTP方法 GET/POST
url 记录请求的URL地址 string
files 记录请求上传的文件 *

例如 想要获取请求/articles?channel_id=1channel_id的参数,可以按如下方式使用:

from flask import request

@app.route(\'/articles\')
def get_articles():
    channel_id = request.args.get(\'channel_id\')
    return \'you wanna get articles of channel {}\'.format(channel_id)

上传图片

客户端上传图片到服务器,并保存到服务器中

from flask import request

@app.route(\'/upload\', methods=[\'POST\'])
def upload_file():
    f = request.files[\'pic\']
    # with open(\'./demo.png\', \'wb\') as new_file:
    #     new_file.write(f.read())
    f.save(\'./demo.png\')
    return \'ok\'

二:响应

1 返回模板

使用render_template方法渲染模板并返回

例如,新建一个模板index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
我的模板html内容
<br/>{{ my_str }}
<br/>{{ my_int }}
</body>
</html>

后端视图

from flask import render_template

@app.route(\'/\')
def index():
    mstr = \'Hello 黑马程序员\'
    mint = 10
    return render_template(\'index.html\', my_str=mstr, my_int=mint)

2 重定向

from flask import redirect

@app.route(\'/demo2\')
def demo2():
    return redirect(\'http://www.itheima.com\')

3 返回JSON

from flask import jsonify

@app.route(\'/demo3\')
def demo3():
    json_dict = {
        "user_id": 10,
        "user_name": "laowang"
    }
    return jsonify(json_dict)

4 自定义状态码和响应头

1) 元祖方式

可以返回一个元组,这样的元组必须是 (response, status, headers) 的形式,且至少包含一个元素。 status 值会覆盖状态代码, headers 可以是一个列表或字典,作为额外的消息标头值。

@app.route(\'/demo4\')
def demo4():
    # return \'状态码为 666\', 666
    # return \'状态码为 666\', 666, [(\'Itcast\', \'Python\')]
    return \'状态码为 666\', 666, {\'Itcast\': \'Python\'}

2) make_response方式

@app.route(\'/demo5\')
def demo5():
    resp = make_response(\'make response测试\')
        resp.headers[“Itcast”] = “Python”
        resp.status = “404 not found”
    return resp

 

以上是关于3-flask 中的请求和响应的主要内容,如果未能解决你的问题,请参考以下文章

学习小片段——springboot 错误处理

使用 rxJava 和改造多次调用另一个请求中的请求

Vue3官网-高级指南(十七)响应式计算`computed`和侦听`watchEffect`(onTrackonTriggeronInvalidate副作用的刷新时机`watch` pre)(代码片段

Server是如何完成针对请求的监听接收与响应1

VSCode自定义代码片段—— 数组的响应式方法

为啥片段中的晶圆厂不响应点击事件?