1、add_url_rule(rule, endpoint=None, view_func=None)
注:这个方法用来添加url与视图函数的映射,如果没有填写`endpoint`,默认使用`view_func`的名字作为`endpoint`。
app.add_url_rule('/list/',view_func=list,endpoint='list')
2、@app.route(rule,**options):底层依然是使用add_url_rule这个函数实现路由映射的
@app.route('/') def index(): return render_template('index.html')
一、标准类视图函数
实例1、URL返回JSON数据
from flask import views,jsonify class JsonView(views.View): def get_data(self): raise NotImplementedError def dispatch_request(self): return jsonify(self.get_data()) class ListViews(JsonView): def get_data(self): return {'a':'111','b':'222'} # 第一步:匹配url,找到ListViews方法 # 第二步:执行dispatch_request方法,找到父类JsonView =》dispatch_request() # 第三步:return jsonify(self.get_data()) ===》找到自己的get_data()方法 ===》转换json格式并返回数据 app.add_url_rule('/list/',endpoint='list',view_func=ListViews.as_view( 'list' ))
实例2、多个URL获取相同数据
from flask import views,render_template class GuangGaoViews(views.View): def __init__(self): super(GuangGaoViews,self).__init__() self.context = { 'a':'广告数据' } class LoginViews(GuangGaoViews): def dispatch_request(self): return render_template('login.html',**self.context) class RegistViews(GuangGaoViews): def dispatch_request(self): return render_template('regist.html',**self.context) app.add_url_rule('/login/',view_func=LoginViews.as_view('login')) app.add_url_rule('/regist/',view_func=RegistViews.as_view('regist'))
二、调度方法得类视图
from flask import Flask,views,render_template,request class ListView(views.MethodView): """ 'get', 'post', 'head', 'options','delete', 'put', 'trace', 'patch' """ def _render(self,error=None): return render_template('login.html',error = error) def get(self): """ login.html: 这是登陆页面 <form action="" method="post"> 用户名:<input type="text" name="username"> 密码:<input type="password" name="password"> <input type="submit" value="提交"> {% if error %} <p>{{ error }}</p> {% endif %} </form> :return: """ return self._render() def post(self): username = request.form.get('username') password = request.form.get('password') if username == 'admin' and password == '123456': return render_template('index.html') else: return self._render(error="用户密码错误!")
三、类视图使用装饰器
1、函数视图装饰器
from flask import Flask,request from functools import wraps def login_required(func): @wraps(func) # 保留原始属性 def wrapper(*args,**kwargs): u = request.args.get('u') if u == 'aaa': return func(*args,**kwargs) else: return '请先登录' return wrapper @app.route('/') @login_required def index(): return '首页'
2、类视图装饰器
from flask import Flask,request,views from functools import wraps def login_required(func): @wraps(func) # 保留原始属性 def wrapper(*args,**kwargs): u = request.args.get('u') if u == 'aaa': return func(*args,**kwargs) else: return '请先登录' return wrapper class ProfileView(views.MethodView): decorators = [login_required] # 装饰器放在这里 def get(self): return '个人中心' app.add_url_rule('/user/',view_func=ProfileView.as_view('user'))