Flask系列 路由系统

2023-10-27

Flask路由系统细分

from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
    return 'ok'

if __name__ == '__main__':
    app.run()

从这个简单的代码入口,来剖析一下路由@app.route('/')

route():就是一个加在index()上的装饰器



​```python
def route(self, rule, **options):  # rule:匹配规则,options参数字典
    def decorator(f):  
        endpoint = options.pop("endpoint", None)  # 如果option中有endpoint就取出,否则endpoint=None
        self.add_url_rule(rule, endpoint, f, **options)  # f就是装饰器装饰的视图函数 index
        return f
    return decorator

获取的信息:
(1)route传参时可以指定 endpoint = '别名',endpoint是给这个路由取的别名,用作反向解析,稍后再会介绍。没有传时为None。
(2)主要是执行了add_url_rule方法将匹配规定与视图函数的对应关系添加到路由中

add_url_rule():将匹配规定与视图函数的对应关系添加到路由

@setupmethod
def add_url_rule(self,rule,endpoint=None,view_func=None,provide_automatic_options=None,**options):
    # 其中rule是必须要传入的,endpoint是别名,view_func是函数名
    if endpoint is None:
        endpoint = _endpoint_from_view_func(view_func)  # 如果没有别名就执行该函数,并且将视图函数当做参数传入了,稍后再看
    options["endpoint"] = endpoint
    methods = options.pop("methods", None)  # 如果options中有methods则取出,否则为methods = None
    
    # 如果methods为None的话,默认为view_func中的methods属性值,或者为('GET',)请求
    if methods is None:
        methods = getattr(view_func, "methods", None) or ("GET",)
    # 如果methods是字符串类型,string_types=>(str, unicode),则抛出异常
    if isinstance(methods, string_types):
        raise TypeError(
            "Allowed methods have to be iterables of strings, "
            'for example: @app.route(..., methods=["POST"])'
        )
    # 循环遍历methods,并转成大写、去重
    methods = set(item.upper() for item in methods)

    required_methods = set(getattr(view_func, "required_methods", ()))

    if provide_automatic_options is None:
        provide_automatic_options = getattr(
            view_func, "provide_automatic_options", None
        )

    if provide_automatic_options is None:
        if "OPTIONS" not in methods:
            provide_automatic_options = True
            required_methods.add("OPTIONS")
        else:
            provide_automatic_options = False

    methods |= required_methods

    rule = self.url_rule_class(rule, methods=methods, **options)
    rule.provide_automatic_options = provide_automatic_options

    self.url_map.add(rule)  # 添加匹配规则
    if view_func is not None:
        old_func = self.view_functions.get(endpoint)  # 默认self.view_functions={},所以old_func=None
        if old_func is not None and old_func != view_func:
            raise AssertionError(
                "View function mapping is overwriting an "
                "existing endpoint function: %s" % endpoint
            )
        self.view_functions[endpoint] = view_func  # 将 endpoint 与 view_func 对应。{endpoint:view_func}

一眼看到上面的源码是不是懵,在代码中相关的部分添加了注释。获取的信息:
(1)methods是定义该视图函数的请求方式,如果没有指定就默认为get方式
(2)methods传参是不能传字符串类型,应该设置:methods=('post',),参数不区分大小写,即'post'与‘POST’都可以传入
(3)将endpoint的值与函数名对应,比如endpoint='xxx':则相当于是给视图函数index取了一个别名。如果没有endpoint,执行_endpoint_from_view_func(view_func),endpoint=函数名

def _endpoint_from_view_func(view_func):
    """Internal helper that returns the default endpoint for a given
    function.  This always is the function name.
    """
    assert view_func is not None, "expected view func if endpoint is not provided."
    return view_func.__name__  # 返回的就是函数名

总结:

(1)路由本质上就是执行了add_url_rule函数,所以也可以通过该函数来添加路由app.add_url_rule('/',endpoint='xxx',view_func=index)
(2)endpoint:用来指定别名,没有指定就用函数名字
(3)methods:用来指定视图函数的请求方式,没有指定就默认为get方法
(4)url_for:通过别名来做反向路由解析

from flask import Flask, request,redirect,url_for
app = Flask(__name__)
app.debug =True

# @app.route('/')
def index():
    return 'dasdk'
app.add_url_rule('/',endpoint='xxx',view_func=index)  # 用来绑定路由

@app.route('/login',methods=['post','get'])
def login():
    url = url_for('xxx')  # 反向路由解析,url此时指向index视图函数
    return redirect(url)

if __name__ == '__main__':
    app.run()

典型写法

@app.route('/detail/<int:nid>',methods=['GET'],endpoint='detail')

默认转换器

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

@app.route和app.add_url_rule参数

rule:url规则
view_func:视图函数名称
defaults = None:默认值,当URL中无参数,函数需要参数时,使用defaults = {'k': 'v'}为函数提供参数
endpoint = None:名称,用于反向生成URL,即: url_for('名称')
methods = None:允许的请求方式,如:["GET", "POST"]
strict_slashes = None:对URL最后的“/”符号是否严格要求
    '''
        @app.route('/index', strict_slashes=False)
        #访问http://www.xx.com/index/ 或http://www.xx.com/index均可
        @app.route('/index', strict_slashes=True)
        #仅访问http://www.xx.com/index
    '''
#重定向到指定地址
redirect_to = None, 
    '''
        @app.route('/index/<int:nid>', redirect_to='/home/<nid>')
    '''

路由正则匹配

from flask import Flask, url_for
from werkzeug.routing import BaseConverter
app = Flask(__name__)

class RegexConverter(BaseConverter):
    # 自定义URL匹配正则表达式
    def __init__(self,map,regex):
        super(RegexConverter,self).__init__(map)
        self.regex = regex

    def to_python(self, value):
        # 路由匹配时,匹配成功后传递给视图函数中参数的值
        value += 'sb'
        return value

    def to_url(self, value):
        # 使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数
        val = super(RegexConverter,self).to_url(value)
        return val

app.url_map.converters['regex'] = RegexConverter
@app.route('/index/<regex("\d+"):nid>')
def index(nid):
    # 参数nid就是to_python返回的值
    print(nid)
    print(url_for('index',nid='888'))
    return 'Index'

if __name__ == '__main__':
    app.run()

转载于:https://www.cnblogs.com/bladecheng/p/11604394.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flask系列 路由系统 的相关文章

随机推荐

  • layui多文件上传_EasyUI的filebox组件实现多文件上传的步骤

    EasyUI的filebox组件实现多文件上传的步骤 新增回款记录详情里面有个添加回款记录文件的按钮 点击选择文件 文件既可以选择一个也可以选择多个 img 点击并拖拽以移动
  • 锁升级

    synchronized锁升级机制 普通对象对象头 Mark Word与锁息息相关 后面的Klass Word与锁无关 不讨论 Mark Word结构 public class Syn static int a 0 public stati
  • 服务器有时候显示美国,美国服务器不通的情况解决方法

    最近有朋友跟小编反馈美国服务器会出现不通的情况 这是什么原因呢 1 大网络环境的的原因 很多时候 我们是使用移动 电信和联通的线路 电信的是最常用的 突然网络不通的话 检查咨询下机房看是不是环境大网络出现什么异常 有的时候 美国得走的是国际
  • QT跨线程连接信号和槽

    对QT的信号和槽理解较为初级 今天通过多次尝试 终于学会了跨线程连接信号和槽 其基本方法如下 1 无参数传递时 1 定义 signal void signal1 2 连接部分写法 connect p class1 类1的指针 SIGNAL
  • WDK学习笔记_基于区块链溯源系统的后端接口开发

    文章目录 摘要 一 fabric go sdk各个封装函数的功能介绍 1 1 查询指定节点通道是否已经存在 函数 QuerySavedChannel 1 2 创建并加入通道 函数 CreateChannel 1 3 查询指定节点的指定链码是
  • Python类中的self到底是干啥的

    Python类中的self到底是干啥的 Python编写类的时候 每个函数参数第一个参数都是self 一开始我不管它到底是干嘛的 只知道必须要写上 后来对Python渐渐熟悉了一点 再回头看self的概念 似乎有点弄明白了 首先明确的是se
  • Vue语法(四)

    一 组件的自定义事件 1 一种组件间通信的方式 适用于 strong style color red 子组件 gt 父组件 strong 2 使用场景 A是父组件 B是子组件 B想给A传数据 那么就要在A中给B绑定自定义事件 span st
  • 2021-07-21训练日记upc联通数(思维)

    A 联通数 题目描述 数学高手小G最近发现了一种新型的数 他首先在草稿纸写下任意长度的数字串kkkkkkkkkkk 1 k 9 并在其中间添加加号 且相邻两个加号之间至少含有两个数字k 默认数字串第一个数字前与最后一个数字后也有两个加号 然
  • React+antdPro4+TS(typescript)相关(知识点)踩坑记录

    最近公司新开了项目 是后台管理系统 在技术选型上选择的时候 选择了react 然后整体的框架选择的是antd pro 4 这个脚手架搭建出来的单页面应用 要是想要仔细了解antd pro 可以看一下他的官方文档 antd pro 此次开发整
  • [c#][process]下发单个以及同时多条adb指令

    库 using System Diagnostics private Process cmd process 下发单条adb指令 代码示例 private string GetAdbCommandsArguments string cmds
  • fiddler设置只抓取某个网址的信息

    1 前提 在使用fiddler进行抓包过程中 如果想只抓取某一个地址下的请求 可以如下设置 2 设置 1 打开fiddler 选择过滤器 2 选择仅显示以下主机 3 点击 动作 选择 现在运行筛选器 4 打开百度 输入信息 进行搜索 查看抓
  • 字符分割算法研究

    字符分割 定义 以字符串的形式分割字符 达到将验证码分割的效果 从定位得到的车牌图像中分离出单个字符 包括汉字 字母和数字等 的图像 以便于字符分割 初步了解 行切分 字切分 参考范例 车牌识别 主要算法解析 改进的连通域分割法 版面分割是
  • 线程池基础知识

    1 为什么要使用线程池 线程池用什么用 创建线程和销毁线程的花销是比较大的 这些时间有可能比处理业务的时间还要长 这样频繁的创建线程和销毁线程 再加上业务工作线程 消耗系统资源的时间 可能导致系统资源不足 我们可以把创建和销毁的线程的过程去
  • Linux 将本地文件上传Linux服务器, 即ssh 命令上传本地文件

    利用ssh传输文件 在linux下一般用scp这个命令来通过ssh传输文件 1 从服务器上下载文件scp username servername path filename var www local dir 本地目录 例如scp root
  • supervisor托管配置nginx

    前言 阅读本文档前 请先了解如何安装配置supervisor和nginx 以下是相关学习文档 超全面 CentOS7 安装及配置supervisor CentOS 安装及配置nginx 配置 1 创建supervisor托管配置文件 详细如
  • oracle导库报959,IMP-00003: 遇到 ORACLE 错误 959

    导入前先要建好表空间和用户 建议你导出的时候按用户导出 不要用sys全部导出来还有在导入的时候需要指定导入到哪个用中去 给个操作手顺吧 我今天刚弄完的 1 导出 exp user user dbname owner user file pa
  • opencv之初学

    浅浅地记录一下自己学习opencv的过程吧 我有想毕业之后从事图像处理方面的工作 所以就从现在学起 争取明年秋招时能拿到offer吧 1 下载opencv opencv有很多的版本 我大概在网上搜了一下它的下载过程 需要在Visual St
  • UE4中文本文件配置文件Json文件XML文件的读写

    虚幻引擎中提供了与平台无关的文件读写与访问接口 通过调用 可以完成一些文件的读写 比如文本文件 配置文件 json文件 xml文件等 完成文件读写 首先需要获取文件路径等相关信息 对调用这些操作 我们需要包含头文件PlatformFilem
  • stm32水质检测系统(TDS检测,水温检测,PH检测,wifi上传,上位机显示)

    一 硬件材料清单 1 STM32核心板 2 OLED显示屏 3 PH传感器 4 TDS传感器 5 DS18B02水温传感器 6 ESP8266 二 实现的功能 1 数据的实时检测 2 本地OLED数据实时刷新 3 远程终端上位机数据显示刷新
  • Flask系列 路由系统

    Flask路由系统细分 from flask import Flask app Flask name app route def index return ok if name main app run 从这个简单的代码入口 来剖析一下路由