我正在使用Python Flask,我定义了以下功能:
def verify_session():
if not 'logged_in' in session:
flash("You are not logged in.<br/>Please, log in to use our application.", "warning")
return redirect(url_for('login_path'))
这意味着要在每个控制器中调用。我知道我可以使用@app.before_request
,但在某些地方我不想要调用此函数(例如,在同一个登录页面中),我真的不希望该函数检查排除的路径。
我的问题是:在每个路径的任何Flask控制器中,第一行看起来像这样:
@app.route('/web/account', methods=["GET"], endpoint="account_path")
def account():
verify_session()
return render_template('account')
但是,尽管我得到了#34;你需要登录&#34;闪烁消息,它仍然返回帐户页面,因为return
内部verify_session只返回此功能。
我需要的是return verify_session()
之类的内容,但除非实际需要返回控制器流,否则它不会结束。
也许这个问题只是Python / Programming而不是Flask所以我请原谅自己并请主持人相应地编辑我的问题。我提到Flask,因为它是我遇到麻烦的环境。
如果需要更多信息,我愿意更新。提前谢谢。
答案 0 :(得分:4)
result = verify_session()
if not result:
result = render_template("account")
return result
但实际上你应该为这个
使用装饰器def verify_session(fn):
def inner(*args,**kwargs):
if not 'logged_in' in session:
flash("You are not logged in.<br/>Please, log in to use our application.", "warning")
return redirect(url_for('login_path'))
return fn(*args,**kwargs)
return inner
然后你会像
一样使用它@app.route('/web/account', methods=["GET"], endpoint="account_path")
@verify_session #make sure to use any decorators after the route decorator
def account():
return render_template('account')
最后......我希望你知道你正在重新发明轮子,你应该只使用flask-login
来管理这些东西(除非你有非常令人信服的理由不这样做)
答案 1 :(得分:0)
增加Joran的优秀答案。您可以将登录所需的路线放在blueprint中,然后使用@app.before_request
,而不是使用@blueprint.before_request
:
account = Blueprint('account', __name__)
@account.before_request
def verify_session():
...
@account.route('/')
def index():
...
然后在你的应用中:
app = Flask(__name__)
app.register_blueprint(account, url_prefix='/web/account')