from flask import Flask,render_template,redirect,request,session app = Flask(__name__) app.secret_key = "sdfasdfasdf3fsdf" @app.route('/') def hello_world(): return 'Hello World!' def wapper(func): def inner(*args,**kwargs): if not session.get('user_info'): return redirect('/login') return func(*args,**kwargs) return inner @app.route('/login',methods=['GET','POST']) def login(): if request.method == "GET": return render_template('login.html') else: user = request.form.get('username') pwd = request.form.get('password') if user == 'alex' and pwd == '123': session['user_info'] = user return redirect('/index') else: return render_template('login.html',msg='用戶或密碼錯誤') @app.route('/index',methods=['GET']) @wapper def index(): return render_template('index.html') @app.route('/query',methods=['GET']) def query(): if not session.get('user_info'): return redirect('/login') return 'query' @app.route('/student',methods=['GET']) @wapper def student(): return 'student' if __name__ == '__main__': app.run()
上面方面使用裝飾器會有一個弊端:
"AssertionError: View function mapping is overwriting an existing endpoint function"如何解決
為什么會出現這樣的問題:
使用Flask定義URL的時候,如果出現"AssertionError: View function mapping is overwriting an existing endpoint function"這個異常信息,就說明定義了多個同名的視圖函數,只需要改成不同的函數名即可。 這是為什么呢? 原來flask中url跟視圖函數並不是直接對應的,而是有一個中間者-endpoint。 三者之間的關系是這樣的: ``` url---->endpoint---->view_function ``` 它們是一對一的關系,在注冊add_url_rule的時候,如果不指定endpoint,那么endpoint就會默認為函數名字,如果同一個endpoint於多個url注冊的話,就會發生沖突,從而拋出異常。
解決方法:

from flask import Flask,render_template,redirect,request,session app = Flask(__name__) app.secret_key = "sdfasdfasdf3fsdf" @app.route('/') def hello_world(): return 'Hello World!' @app.route('/login',methods=['GET','POST']) def login(): if request.method == "GET": return render_template('login.html') else: user = request.form.get('username') pwd = request.form.get('password') if user == 'alex' and pwd == '123': session['user_info'] = user return redirect('/index') else: return render_template('login.html',msg='用戶或密碼錯誤') def wapper(func): def inner(*args,**kwargs): if not session.get('user_info'): return redirect('/login') return func(*args,**kwargs) return inner @app.route('/index',methods=['GET'],endpoint='index') @wapper def index(): return render_template('index.html') @app.route('/query',methods=['GET'],endpoint='query') @wapper def query(): if not session.get('user_info'): return redirect('/login') return 'query' @app.route('/student',methods=['GET'],endpoint='student') @wapper def student(): return 'student' if __name__ == '__main__': app.run()