Flask视图路由补充

1.路由和视图

路由有两种实现方式,常规的是在函数上加装饰器

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

第二种实现方式,,第一个参数是路径,第二个是endpoint,默认不写是函数名,第三个是函数名,endpoint不要重名

app.add_url_rule('/index',None,index)

常用参数

ule, URL规则 view_func, 视图函数名称 endpoint=None, 名称,用于反向生成URL,即: url_for(‘名称’) methods=None, 允许的请求方式,如:[“GET”,”POST”] strict_slashes=None, 对URL最后的 / 符号是否严格要求,如果为false后面可以加/ 否则绝对匹配

如:

@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 "11111"
@app.route('/index/<int:nid>', redirect_to=func)

defaults=None, 默认值,当URL中无参数,函数需要参数时,使用defaults={‘k’:’v’}为函数提供参数 subdomain=None, 子域名访问

自定义匹配

from flask import Flask,url_for

app = Flask(__name__)

# 步骤一:定制类
 from werkzeug.routing import BaseConverter
 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['reg'] = RegexConverter

"""
 1. 用户发送请求
 2. flask内部进行正则匹配
 3. 调用to_python(正则匹配的结果)方法
 4. to_python方法的返回值会交给视图函数的参数

"""

# 步骤三:使用自定义正则
 @app.route('/index/<reg("\d+"):nid>')
 def index(nid):
 print(nid,type(nid))

print(url_for('index',nid=987))
 return "index"

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

CBV

import functools
 from flask import Flask,views
 app = Flask(__name__)


 def wrapper(func):
     @functools.wraps(func)
     def inner(*args,**kwargs):
          return func(*args,**kwargs)
     return inner

class UserView(views.MethodView):
     methods = ['GET']
#全局装饰器
     decorators = [wrapper,]

     def get(self,*args,**kwargs):
          return 'GET'
     def post(self,*args,**kwargs):
           return 'POST'

app.add_url_rule('/user',None,UserView.as_view('user'))

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

Flask视图路由补充
http://www.jcwit.com/article/242/
作者
Carlos
发布于
2018年8月2日
许可协议