【问题标题】:Python Flask working with wrapsPython Flask 使用包装
【发布时间】:2013-12-28 11:37:21
【问题描述】:

尝试使用 Python 和 Flask 设置登录页面并收到错误: (第 33 行是 @login_required

Traceback (most recent call last):
  File "routes.py", line 33, in <module>
    @login_required
  File "/home/pi/FlaskTutorial/local/lib/python2.7/site-packages/flask/app.py", line 1013, in decorator
    self.add_url_rule(rule, endpoint, f, **options)
  File "/home/pi/FlaskTutorial/local/lib/python2.7/site-packages/flask/app.py", line 62, in wrapper_func
    return f(self, *args, **kwargs)
  File "/home/pi/FlaskTutorial/local/lib/python2.7/site-packages/flask/app.py", line 942, in add_url_rule
    endpoint = _endpoint_from_view_func(view_func)
  File "/home/pi/FlaskTutorial/local/lib/python2.7/site-packages/flask/helpers.py", line 60, in _endpoint_from_view_func
    assert view_func is not None, 'expected view func if endpoint ' \
AssertionError: expected view func if endpoint is not provided.

这是我正在使用的代码,我似乎找不到问题...有什么想法吗?

from flask import *
from functools import wraps

app = Flask(__name__)

app.secret_key = 'secret key' #Use a random key generator

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

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

def login_required(test):
    @wraps(test)
    def wrap(*args, **kwargs):
        if 'logged_in' in session:
            return test(*args, **kwargs)
        else:
            flash('You need to login first.')
            return redirect(url_for('log'))
        return wrap

@app.route('/logout')
def logout():
    session.pop('logged_in', None)
    flash('You were logged out')
    return redirect (url_for('log'))

@app.route('/hello')
@login_required
def hello():
    return render_template('hello.html')

@app.route('/log', methods=['GET', 'POST'])
def log():
    error = None
    if request.method =='POST':
        if request.form['username'] != 'admin' or request.form['password'] != 'admin':
            error = 'Invaled Credentials. Please try again.'
        else:
            session['logged_in'] = True
            return redirect(url_for('hello'))
    return render_template('log.html', error=error)

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=9000, debug=True)

【问题讨论】:

    标签: python flask decorator python-decorators


    【解决方案1】:

    您将return wrap 行缩进得太远,现在您的装饰器返回一个None 值。取消缩进最后一行:

    def login_required(test):
        @wraps(test)
        def wrap(*args, **kwargs):
            if 'logged_in' in session:
                return test(*args, **kwargs)
            else:
                flash('You need to login first.')
                return redirect(url_for('log'))
        return wrap
    

    异常指向@login_required 行,因为next 装饰器@app.route('/hello') 在应用于@login_required 的输出时抛出异常。 AssertionError 异常被显式抛出,因为路由装饰器为函数传递了 None 值。

    【讨论】:

    • 谢谢,你盯着它看了那么久,从树林里看不到森林……再次感谢
    • 感谢碰巧遇到了同样的问题。
    猜你喜欢
    • 2021-06-24
    • 2015-06-28
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2021-07-15
    • 2020-07-15
    • 1970-01-01
    相关资源
    最近更新 更多