Flask - 练习 - 基于装饰器实现登陆验证、及装饰器与endpoint报错分析

本文介绍了在Flask中如何通过装饰器实现登录验证,详细分析了因endpoint重复导致的错误及其原因,并提供了解决方案,包括手动指定endpoint和使用@wraps装饰器确保属性不被覆盖。
摘要由CSDN通过智能技术生成

目录

一、代码实现

1-1 方式一、endpoint 

1-2 方式二、装饰器内使用@wraps指向原有属性

二、错误总结

错误分析

错误分析总结

解决方式

三、@wraps 装饰器回顾


一、代码实现

思路总结:若未登陆,则查询/userlist 、 /userdetail/1 、/时都会自动跳转/login界面。当session内存在user对象时才能正常访问

1-1 方式一、endpoint 

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

app = Flask(__name__)
app.debug = True
app.secret_key = 'test'
# 模拟数据库内信息
USER_LIST = {
    1: {'name': '张三', 'age': 18, 'gender': '男', 'text': "道路千万条"},
    2: {'name': '李四', 'age': 28, 'gender': '男', 'text': "安全第一条"},
    3: {'name': '王五', 'age': 18, 'gender': '女', 'text': "行车不规范"},
}

def login_decorator(func, ):
    def wrapper(*args, **kwargs):
        if 'user' in session:
            res = func(*args, **kwargs)
            return res
        return redirect('/login')
    return wrapper

@app.route('/')
@login_decorator
def index():
    return 'ok'

@app.route('/login', methods=['GET', 'POST'], endpoint='login')
def login():
    if request.method == 'GET':
        return render_template('login.html')
    else:
        # 取出表单提交的name数据
        name = request.form.get('name')
        pwd = request.form.get('pwd')
        if name == 'test' and pwd == '123':
            # 登录成功 写session
            session['user'] = name
            return redirect('/userlist')
        else:
            # django中传字典,这里传**字典
            # return render_template('login.html',**{'error':'用户名或密码错误'})
            return render_template('login.html', error='用户名或密码错误')

@app.route('/userlist', methods=['GET'], endpoint='user_list')
@login_decorator
def user_list():
    return render_template('userlist.html', user_list=USER_LIST)

@app.route('/use
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值