Fork me on GitHub

Flask 的路由系统 FBV 与 CBV

Flask的路由系统

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


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


1 路由格式以及参数

@app.route('/user/')
@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/')
或
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.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'))
模板

有参数

app.route('/index/int:nid',method=['GET','POST'],endpoint='index')

视图
return redirect(url_for('index',nid=111))
模板


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

posted @ 2018-03-10 14:30  派对动物  阅读(874)  评论(0)    收藏  举报
Top