Flask快速入门(3) — flask路由的本质

目录

  • route():就是一个加在index()上的装饰器
  • add_url_rule():将匹配规定与视图函数的对应关系添加到路由
  • 总结:
from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return 'ok'

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

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

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

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()

原文地址:https://www.cnblogs.com/863652104kai/p/11601029.html

时间: 2024-11-07 09:44:54

Flask快速入门(3) — flask路由的本质的相关文章

Flask快速入门(2) — Flask四剑客与配置文件

目录 Flask四剑客 配置文件的方式 第一种方式 第二种方式 第三种方式 第四种方式 其他方式 Flask四剑客 在Django中后端返回响应有几种形式:render(前端渲染页面).redirect(重定向跳转).HttpResponse(直接返回).JsonResponse(实际内部继承了HttpResponse,返回json字符串). 在Flask中也有相对的返回机制: render:前端渲染页面 redirect_:重定向跳转 jsonify:返回json字符串 return 'xx'

网站后端_Python+Flask.0003.FLASK快速入门之Hello Word?

框架特点: 1. 非常小, 小到可称为微型框架 2. 可扩展, 设计初衷就是不会替开发者做太多决策,支持随时更换或动手实现扩展模块 3. 三依赖, 路由/调试/WSGI(由WERKZEUG提供的WEB服务器网关接口实现),模版系统(由JINJA2实现),签名(由ITSDANGEROUS实现) 快速安装: pip install flask 快速入门: #!/usr/bin/env python # -*- coding: utf-8 -*- """ # # Authors: 

Flask快速入门(17) — flask_session

Flask快速入门(17) - flask_session 作用:将默认保存的签名cookie中的值,保存到 redis/memcached/file/Mongodb/SQLAlchemy 安装:pip install flask-session 使用1: from flask import Flask,session from flask_session import RedisSessionInterface import redis app = Flask(__name__) conn=r

Flask快速入门(18) — 信号

Flask快速入门(18) - 信号 作用:Flask框架中的信号基于blinker,其主要就是让开发者可以在flask请求过程中定制一些用户行为 安装:pip install blinker 内置信号: request_started = _signals.signal('request-started') # 请求到来前执行 request_finished = _signals.signal('request-finished') # 请求结束后执行 before_render_templ

Flask快速入门(20) — 多app应用

Flask快速入门(20) - 多app应用 之前一直是一个app,如果有多个app该怎么进行分发呢? from werkzeug.wsgi import DispatcherMiddleware from werkzeug.serving import run_simple from flask import Flask,current_app # 注册两个app app1 = Flask('app01') app2 = Flask('app02') @app1.route('/index')

【转】Flask快速入门

迫不及待要开始了吗?本页提供了一个很好的 Flask 介绍,并假定你已经安装好了 Flask.如果没有,请跳转到 安装 章节. 一个最小的应用 一个最小的 Flask 应用看起来会是这样: from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run() 把它保存为 hello.py 

Flask快速入门,知识整理

一.Flask介绍(轻量级的框架,非常快速的就能把程序搭建起来) Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器. “微”

flask快速入门

概述: Flask是一个使用 Python 编写的轻量级 Web 应用框架.其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 (类似于php中的smarty,旨在让程序实现界面与数据分离). Flask使用 BSD 授权. WSGI(Python Web Server Gateway Interface),是Python应用程序或框架和Web服务器之间的一种接口,已经被广泛接受.类似于java中的servelet api. 一个最简单的应用: from flask im

二 Flask快速入门

1: 外部可访问的服务器: 如果你运行了这个服务器,你会发现它只能从你自己的计算机上访问,网络中其它任何的地方都不能访问.在调试模式下,用户可以在你的计算机上执行任意 Python 代码.因此,这个行为是默认的.如果你禁用了 debug 或信任你所在网络的用户,你可以简单修改调用 run() 的方法使你的服务器公开可用,如下: app.run(host='0.0.0.0'),这会让操作系统监听所有公网 IP. 2: 调试模式 虽然 run() 方法适用于启动本地的开发服务器,但是你每次修改代码后