Flask的路由系统

本质:
带参数的装饰器
传递函数后 执行 add_url_rule 方法
将 函数 和 url 封装到一个 Rule对象
将Rule对象 添加到 app.url_map(Map对象)

注意:装饰器要放在路由的上方 -- 注意装饰器的执行顺序

1 路由格式以及参数

@app.route('/user/<username>')
@app.route('/post/<int:post_id>')
@app.route('/post/<float:post_id>')
@app.route('/post/<path:path>')
@app.route('/login', methods=['GET', 'POST']) 本质: app.add_url_rule(rule 路由, endpoint 别名, f 视图函数, **options 参数)

常用路由系统有以上五种,所有的路由系统都是基于一下对应关系来处理:

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,                视图函数名称   #CBV 使用  view_func=IndexView.as_view(name='...')

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

def func(adapter, nid):
return "/home/888"
@app.route('/index/<int:nid>', redirect_to=func)

subdomain=None, 子域名访问

    公网上线时
租域名 aaa.com/net
租用服务器 + 公网IP 213.213.21 访问 域名 -->> (域名解析)ip 测试时 修改hosts
hosts文件 127.0.0.1:8000 www.aaa.com
127.0.0.1:8000 www.admin.aaa.com
127.0.0.1:8000 www.username.aaa.com 使用子域名 from flask import Flask, views, url_for
app = Flask(import_name=__name__) app.config['SERVER_NAME'] = 'www.aaa.com:5000' # 配置主域名 @app.route("/", subdomain="admin") # 子域名 admin.aaa.com
def static_index():
return "static.your-domain.tld" @app.route("/dynamic", subdomain="<username>") # 传参--字符串 username.aaa.com/dynamic
def username_index(username):
return username + ".your-domain.tld" if __name__ == '__main__':
app.run()

>## 2 url_for 与 endpoint

url反向生成

无参数

	app.route('/login',method=['GET','POST'],endpoint='login')

	视图
return redirect(url_for('login'))
模板
<form action='{{url_for("login")}}'></form> 有参数 app.route('/index/<int:nid>',method=['GET','POST'],endpoint='index') 视图
return redirect(url_for('index',nid=111))
模板
<form action='{{url_for("index",nid=111)}}'></form>

>## 3 让路由支持正则

from flask import Flask, views, url_for
from werkzeug.routing import BaseConverter # 导入基础转换类 app = Flask(import_name=__name__) # 正则表达式类
class RegexConverter(BaseConverter):
"""
自定义URL匹配正则表达式
""" def __init__(self, map, regex):
super(RegexConverter, self).__init__(map)
self.regex = regex def to_python(self, value):
"""
路由匹配时,匹配成功后传递给视图函数中参数的值
:param value:
:return:
"""
return int(value) def to_url(self, value):
"""
使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数
:param value:
:return:
"""
val = super(RegexConverter, self).to_url(value)
return val app.url_map.converters['regex'] = RegexConverter # 添加到flask中 @app.route('/index/<regex("\d+"):nid>') # 使用
def index(nid):
print(url_for('index', nid='888'))
return 'Index' if __name__ == '__main__':
app.run()

>##4 Flask 的FBV与CBV

不常使用

from flask import Flask,views,redirect,url_for  # 导入views 基础类

app = Flask(__name__)

# 定义装饰器
def auth_decorator(func):
def inner(*args,**kwargs):
print('装饰器')
return func(*args,**kwargs)
return inner CBV 添加 装饰器 和 指定 请求方法
class IndexView(views.MethodView):
methods = ['POST','GET'] # 指定允许的 请求方法
decorators = [auth_decorator] # 所有方法都加上 装饰器
def get(self):
return redirect(url_for('home'))
def post(self):
return 'POST' class HomeView(views.MethodView):
def get(self):
return 'Home' app.add_url_rule('/index',view_func=IndexView.as_view(name='index'))
app.add_url_rule('/home',view_func=HomeView.as_view(name='home'))
# CBV 只能通过这种方式
# view_func = IndexView.as_view(name='index') # 指定 反向解析的name if __name__ == '__main__':
app.run()

Flask 的路由系统 FBV 与 CBV的更多相关文章

  1. Flask最强攻略 - 跟DragonFire学Flask - 第七篇 Flask 中路由系统

    Flask中的路由系统其实我们并不陌生了,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST" ...

  2. Flask中路由系统以及蓝图的使用

    一.Flask的路由系统 1.@app.route()装饰器中的参数 methods:当前URL地址,允许访问的请求方式 @app.route("/info", methods=[ ...

  3. day89_11_11Flask启动,配置,路由,fbv和cbv

    一.flask的形成. flask是一个基于python并且以来jinja2模板和werkzeug wsgi服务器的一个微型框架. 安装了flask模块就代表安装了wekzeug,所以先安装flask ...

  4. 源码解析flask的路由系统

    源码解析flask的路由系统 当我们新建一个flask项目时,pycharm通常已经为项目定义了一个基本路由 @app.route('/') def hello_world(): return 'He ...

  5. 第七篇 Flask 中路由系统以及参数

    Flask中的路由系统其实我们并不陌生了,从一开始到现在都一直在应用 @app.route("/",methods=["GET","POST" ...

  6. 第七篇 Flask 中路由系统

    1. @app.route() 装饰器中的参数 如果不明白装饰器 点击这里 methods : 当前 url 地址,允许访问的请求方式 @app.route("/info", me ...

  7. 7,Flask 中路由系统

    Flask中的路由系统 @app.route("/",methods=["GET","POST"]) 为什么要这么用?其中的工作原理我们知道 ...

  8. flask框架路由系统

    flask框架的url系统: flask框架的路由系统: flask框架的路由系统使用实例化的route方法来指定: 如: @app.route('/') route函数装饰器可以把一个函数绑定到对应 ...

  9. Flask之路由系统

    路由系统 路由的两种写法 1.第一种方法: def index(): return render_template('index.html') app.add_url_rule('/index', ' ...

随机推荐

  1. 一次rna-seq的过程-知乎live转

    数据分析流程 来自知乎孟浩巍的“快速入门生物信息学的”Live,超棒的~ 1.数据质控 首先是质控部分,使用fastqc进行对结果分析. 对于Illumia二代测序的结果质控包括两个方面,去掉测序质量 ...

  2. Python(文件处理)

    二.基本操作 #r''------------------>> r:原生字符串,不判断符号的含义#文件处理 f=open(r’c:\a.txt’,’r’,encoding=’utf-8’) ...

  3. Python高阶函数-闭包

    高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回. 在这里我们首先回忆一下python代码运行的时候遇到函数是怎么做的. 从python解释器开始执行之后,就在内存中开辟了一个空间 每当 ...

  4. 数据库权限分配(远程共享数据库)(mysql)

    1. 数据库远程权限 mysql -uroot -proot grant all privileges on formal.* to root@'192.168.3.40' identified by ...

  5. __name__ = '__main__'有什么用

    很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码,可能很多新手一开始学习的时候都比较疑惑,python 中__name__ = ...

  6. 转:Oracle中的日期和字符串互相转换

    TO_DATE格式(以时间:2007-11-02   13:45:25为例)          Year:             yy two digits 两位年                显 ...

  7. LeetCode:比较含退格字符串【844】

    LeetCode:比较含退格字符串[844] 题目描述 给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果. # 代表退格字符. 示例 1: 输入:S = ...

  8. RegExp方法解析

    RegExp 正则表达式(regular expression)的缩写 语法: 显式构造函数 var rg= new RegExp(pattern, attributes) 隐式构造函数 var rg ...

  9. Kali更新源,亲测目前可用的源

    kali更新的时候老是无法定位软件包,网络上大部分中科大.阿里云kali源都不可用,都千篇一律,最后找了这个,网易的,还不错,贴出来大家看看: # 源 deb http://mirrors.163.c ...

  10. SpringBoot 定义通过字段验证

    第一步:定义ValidationResult类 public class ValidationResult { // 校验结果是否有错 private boolean hasErrors = fals ...