Python:如何使这更通用 - 可能与装饰器?

时间:2017-09-09 22:52:53

标签: python flask

目前我有这段代码

@app.route("/protect1")
def protect1():
    if not session.get('logged_in'):
        session['next'] = "/protect1"
        return render_template('login.html')
    else:
        return "This is the first protected page protect1"   

@app.route("/protect2")
def protect2():
    if not session.get('logged_in'):
        session['next'] = "/protect2"
        return render_template('login.html')
    else:
        return "This is the second protected page protect2"   

在我的烧瓶应用程序中,一切正常。只有我不需要为每个函数重复(查看)if / else组合。

我希望有一些通用的方式,比如这个pseude-code:

@checklogin
@app.route("/protect1")
def protect1():
    return "This is the first protected page protect1"

@checklogin
@app.route("/protect2")
def protect2():
    return "This is the second protected page protect2"

这里的一个挑战是@checklogin装饰器需要知道app.route路径(例如“/ protect1”)才能正确设置session ['next']。我不知道如何将此参数传递给装饰器,尤其是如何在第一时间找到它。换句话说,函数protect1()如何知道它是用@ app.route修饰的,以及哪个参数(“/ protect1”)已经传递给那个app.route装饰器?

1 个答案:

答案 0 :(得分:2)

装饰者可以在request上查找路径;使用已加载的网址(this section of the docs提供)或request.url

from functools import wraps
from flask import request, session

def checklogin(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        if not session.get('logged_in'):
            session['next'] = request.url
            return render_template('login.html')
        return f(*args, **kwargs)
    return wrapper

app.route()装饰者之后放置装饰者,否则它不会被注册为路线的处理者:

@app.route("/protect1")
@checklogin
def protect1():
    return "This is the first protected page protect1"