2013-12-10 14 views
5

Đang cố gắng để thiết lập một trang đăng nhập với Python và Flask và nhận được một Lỗi: (dòng 33 là với @login_required)Python Flask làm việc với liệu pháp quấn

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. 

Đây là mã tôi đang sử dụng, tôi dường như không thể tìm ra vấn đề ... Bất kỳ ý tưởng nào?

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) 

Trả lời

11

Bạn thụt dòng return wrap quá xa, bây giờ trang trí của bạn trả về một giá trị None. Unindent dòng cuối cùng:

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 

Những điểm ngoại lệ đối với dòng @login_requiredtiếp theo trang trí, @app.route('/hello') ném ngoại lệ khi nó được áp dụng cho các sản phẩm của @login_required. Ngoại lệ AssertionError được ném một cách rõ ràng bởi vì trang trí đường được chuyển một giá trị None cho hàm.

+0

Cảm ơn, Bạn nhìn chằm chằm vào nó quá lâu bạn không thể nhìn thấy khu rừng qua rừng ... Cảm ơn một lần nữa – user2740536

+0

Cảm ơn đã xảy ra để chạy vào cùng một vấn đề. –

Các vấn đề liên quan