Flask视图及路由

本文详细介绍了Flask框架的路由机制,包括werkzeug模块下的Rule、Map和MapAdapter类,以及路由参数提取。接着讨论了flask请求,重点阐述了request对象及其在文件上传中的应用。此外,还讲解了视图函数如何生成响应,以及异常处理。最后,文章提到了cookie与session的管理,以及Flask的上下文、请求钩子和扩展命令行的使用。
摘要由CSDN通过智能技术生成

1. flask路由

1.1 flask路由机制

flask使用werkzeug模块实现路由分发,其routing模块负责实现URL解析,routing模块会对请求信息的URL进行解析,匹配到URL对应的视图函数,以此生成一个响应信息。

routing模块内部有Rule类(用来构造不同的URL模式的对象)、Map类(存储所有的URL规则)、MapAdapter类(负责具体URL匹配的工作)

- flask路由绑定实现:app.route(rule, **args)  ---> 装饰器(调用add_url_rule方法将请求url和视图函数绑定添加到路由映射列表中)
- 查看所有路由信息:app.url_map
- 路由中限制访问视图函数的请求方法:参数methods=[请求方法列表]
- 同一个路由对应多个视图函数:一般使用不同的请求方法进行区分
- 多个路由对应一个视图函数:即多个url可访问同一个视图函数(app.route()返回的装饰器叠加装饰)

- url反向解析:url_for()函数 ---> 接收视图函数的名字进行解析,返回一个url请求路径
    - 可选参数:_external=True 可以返回请求的url绝对地址
    - 用处一:常用在重定向时使用:先根据视图函数名字获取请求url,再使用redirect(url)函数重定向到指定页面
    - 用处二:模板文件中反向解析生成跳转链接(因为url_for为特殊方法,flask自动传递到模板文件中可使用)
1.1 路由参数提取

路由参数提取:多数情况下我们需要从url请求路径中捕获有关参数,传入视图函数进行相关操作。使用格式:<转换器:变量名>
请输入图片描述

注意:不加转换器类型直接使用变量名则使用默认的string转换器

自定义转换器:

- 自定义转换器: flask封装werkzeug模块,自定义转换器继承与werkzeug.routing模块中的BaseConverter(定义好后需要添加到flask程序实例的转换器字典中)
    - 初始化方法__init__(self, url_map, regex):接收第一个参数url_map代表flask程序示例的url映射列表;第二个参数regex为匹配参数使用的正则表达式
    - to_python(self, value)方法: 正则表达式匹配到的数据经过te_python方法处理后作为匹配后的返回值
    _ to_url()方法:在url_for反向解析时调用此方法
from flask import Flask, url_for, redirect
from werkzeug.routing import BaseConverter

app = Flask(__name__)


# 自定义转换器类
class RegexConverter(BaseConverter):
    """万能转换器:根据传入的正则表达式"""
    def __init__(self, url_map, regex):
        super().__init__(url_map)
        self.regex = regex  # 使用传入的正则表达式来匹配路由中的参数

    def to_python(self, value):
        return value

    def to_url(self, value):
        return value


# 将自定义的转换器类添加到app对象的路由映射列表转换器内
app.url_map.converters["my_converter"] = RegexConverter


# 转换器提取路由参数
@app.route("/get_goods/<int:goods_id>")
def goods_info(goods_id):
    """url捕获goods_id,查询数据后返回"""
    return "这是%s号商品的详细信息!!" % goods_id


# 自定义转换器调用
@app.route("/converter/<my_converter(r'1[34578]\d{9}'):phone>")
def test_converter(phone):
    return "匹配到了手机号:%s" % phone


if __name__ == "__main__":
    app.run(debug=True)

2. flask请求

用户通过浏览器发起请求,请求到达服务器,服务器使用WSGI协议转发请求到应用程序框架进行处理,用户请求到达flask项目时被封装为request对象。

request对象具有上下文的概念,因为无论进入哪个视图函数,使用request对象相关属性获取的请求信息都是当次的请求。

2.1 request对象

请输入图片描述

视图函数通常需要获取用户请求提交的相关数据,可以通过request对象的相关属性获取(get方法):
    - form:记录请求中的表单格式数据,类似于字典,可一键多值(key=value&key=value格式)
    - data:记录请求中的非表单格式数据(json, HTML, XML, Text等),二进制字符串(需要解码) 
    - args:记录请求中的查询参数,类似于字典,可一键多值(url请求路径中的?key1=value1&key2=value2格式数据)
    - cookies:记录请求中的cookie信息,字典类型
    - headers:记录请求中的报文头部
    - methods:记录请求使用的HTTP方法,字符串类型
    - url:记录请求的url地址,字符串类型
    - files:记录请求上传的文件,类似于Python标准的文件对象
    
    注意:当前端发送的数据全部是表单格式数据会直接存放在request.form里面,不会存放在request.data里面
         当前端发送的表单格式数据为一键多值情况,使用get方法只能获取第一个值,可使用getlist方法获取(返回列表)

使用postman模拟请求:
    - 表单格式:使用form-data(多媒体表单)、x-www-form-urlencoded(普通表单)
    - 非表单格式:使用raw格式,可选择json, HTML, XML, Text等
    - 查询字符串:选择Params选项
2.2 文件上传

re

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值