在函数内部调用return时,如何破坏Python Flask控制器流?

时间:2015-05-12 19:13:10

标签: python rest flask

我正在使用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,因为它是我遇到麻烦的环境。

如果需要更多信息,我愿意更新。提前谢谢。

2 个答案:

答案 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')