Flask--视图增加多装饰器

一:问题:添加多个装饰器,抛异常

在Flask中如果按照普通的方法加装饰器,看上去是没有问题。他会抛出一个异常

from flask import Flask, render_template, redirect, request, session

app = Flask(__name__)
app.debug = True
app.secret_key = '123'

@app.route('/')
def home():
    return 'hello word'

def wapper(func):
    def inner(*args, **kwargs):
        if session.get('user'):
            return func()
        else:
            return redirect('/login')
    return inner

@app.route('/index')
@wapper
def index():
    return render_template('index.html')

@app.route('/rebak')
@wapper
def rebak():
    return render_template('index.html')

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    user = request.form.get('username')
    pwd = request.form.get('pwd')
    if user == '123' and pwd == '123':
        session['user'] = user
        return render_template('index.html')

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

标注的地方。翻译过来:AssertionError:视图函数映射覆盖现有端点函数inner

说白了。就是多个inner冲突了。

二:解决办法

2.1:方法一

from flask import Flask, render_template, redirect, request, session

app = Flask(__name__)  # 实例化flask对象
app.debug = True  # 能够随时更改自动重启,不加的话每次更改代码需要手动重启
app.secret_key = '123'  # secret_key,用于给session加密

def wapper(func):
    def inner(*args, **kwargs):
        if session.get('user'):
            return func()
        else:
            return redirect('/login')

    return inner

@app.route('/', endpoint='4')
@wapper
def home():
    return 'hello word'

@app.route('/index', endpoint='1')
@wapper
def index():
    return render_template('index.html')

@app.route('/rebak', endpoint='2')
@wapper
def rebak():
    return render_template('index.html')

@app.route('/login', methods=['GET', 'POST'], endpoint='3')  # endpoint是url的别名,相当于django中Url的name,必须写一个可迭代对象
def login():
    if request.method == 'GET':
        return render_template('login.html')
    user = request.form.get('username')
    pwd = request.form.get('pwd')
    if user == '123' and pwd == '123':
        session['user'] = user
        return render_template('index.html')

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

'''
如果给一个视图函数增加装饰器,应该加在app.route下面,这样的效果就是,
装饰器将下面的所有内容包裹,然后路由对应到这大的包裹中来。
需要注意endpoint要注明,如果不注明endpoint则默认用函数名来定义,
此时所有的函数名都叫inner了,所以需要注明endpoint,只是为了区分。
'''

2.2:方法二

from flask import Flask, render_template, redirect, request, session

app = Flask(__name__)
app.debug = True
app.secret_key = '123'

@app.route('/')
def home():
    return 'hello word'

import functools
def wapper(func):
    @functools.wraps(func)
    def inner(*args, **kwargs):
        if session.get('user'):
            return func()
        else:
            return redirect('/login')
    return inner

@app.route('/index')
@wapper                                     # index = wapper(index)
def index():
    return render_template('index.html')

@app.route('/rebak')
@wapper
def rebak():
    return render_template('index.html')

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('login.html')
    user = request.form.get('username')
    pwd = request.form.get('pwd')
    if user == '123' and pwd == '123':
        session['user'] = user
        return render_template('index.html')

if __name__ == '__main__':
    app.run()
'''
这个方法利用的是装饰器的修复技术,
返回的结果是每个函数的名字。
如果不加functools这个装饰器的话,每个函数都是inner
用来区分每个inner
'''

原文地址:https://www.cnblogs.com/Quantum-World/p/11166565.html

时间: 2024-10-27 06:09:56

Flask--视图增加多装饰器的相关文章

二十五:视图之类视图中使用装饰器

对于url的保护,一般是通过装饰器实现,如:某个页面需要登录后才能访问 函数视图实现 from flask import Flask, render_template, requestfrom functools import wrapsapp = Flask(__name__)def login_required(func): @wraps(func) def wrapper(*args, **kwargs): username = request.args.get('username') r

四 .Flask 模板 中间件 特殊装饰器 基础知识(使用)

一 Flask 模板 中间件 特殊装饰器 1 .Flask 模板语法直接看面效果 https://www.cnblogs.com/lovershowtime/p/11349576.html    模板  和Django模板类似 edit.html<form> asdfasdf asdfasdf asdf asdf 哈啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 </form> login.html <!DOCTYPE html> <html lang="zh-C

Flask之基于route装饰器的路由系统(源码阅读解析)

一 路由系统 1. 在flask中配置URL和视图函数的路由时,首先需要在main.py中实例化一个app对象: 1 from flask import Flask, render_template 2 3 app = Flask(__name__) 2. 然后通过app实例的route方法装饰视图函数,实现路由的配置: 1 @app.route('/') 2 def hello_world(): 3 return 'Hellow World!' 3. 所有这里需要关注在Flask类里定义的ro

Django学习笔记第八篇--实战练习四--为你的视图函数自定义装饰器

零.背景: 对于登录后面所有视图函数,都需要验证登录信息,一般而言就是验证cookie里面的一些信息.所以你可以这么写函数: 1 def personinfo(request): 2 if request.COOKIES.get("login_flag") == "1": 3 return HttpResponse("Success!") 4 else: 5 return HttpResponse("Failed!") 这样就

flask中权限访问装饰器

根据session里面保存的管理员id查询出对于的角色,根据角色查询出权限,根据权限查询出能够访问的路径 # 权限控制装饰器def admin_auth(f): @wraps(f) def decorated_function(*args, **kwargs): # 让某个函数来继承我们的参数 admin = Admin.query.join( Role ).filter( Role.id == Admin.role_id, Admin.id == session['admin_id'] ).f

flask类装饰器

from flask import Flask,request,views from functools import wraps app = Flask(__name__) #自定义登录装饰器 def login_required(func): @wraps(func) def wapper(*args,**kwargs): username = request.args.get('username') if username and username == 'xiaowu': return

Flask基础(3):session、flash、特殊装饰器、蓝图、路由正则匹配、上下文管理 &amp; flask-session

Session: Flask 默认将 session 以加密的形式放到了浏览器的 cookie 中 Flask 的 session 就是一个字典,字典有什么方法 session 就有什么方法 flask session 原理:当请求刚进来时,flask会读取cookie中 session(配置文件中能改这个名称) 对应的值,将这个值解密并反序列化成为一个字典放入内存, 以便视图函数使用: 在视图函数中使用时,按照字典的方法使用: 当请求结束时,flask会读取内存中字典的值,进行序列化+加密,然

【Flask】特殊装饰器

视图函数中的装饰器 -----------------------视图中的装饰器---------------------- 1.如果使用的是函数视图,那么自己定义的装饰器必须放在`app.route`下面, 否则这个装饰器起不到任何作用; 2.类视图的装饰器,需要重写类视图中的一个类属性`decorators`,这个类属性 是一个列表或元组都可以,里面装的就是左右装饰器; app.before_request 在请求(request)进入视图函数之前执行,是全局的装饰器,每次请求都会走一遍这个

116.类视图添加装饰器

之前说过为视图函数添加装饰器,同样我们也可以为类视图添加装饰器.比如,我们要实现在没有输入用户名username=xxx时,返回给用户登录的login页面,如果进行传入了?username=xxx,就可以进入个人中心页面,views.py文件中示例代码如下: from django.http import HttpResponse from django.views.generic import View from django.shutcuts import render, redirect,