创建一个Flask公共网址装饰器

Bri*_*unt 8 python decorator werkzeug flask

我想为Flask路由创建一个装饰器,将某些路由标记为public,所以我可以这样做:

@public
@app.route('/welcome')
def welcome():
    return render_template('/welcome.html')
Run Code Online (Sandbox Code Playgroud)

在其他地方,这是我在想装饰器和检查看起来像:

_public_urls = set()

def public(route_function):
    # add route_function's url to _public_urls
    # _public_urls.add(route_function ...?.url_rule)
    def decorator(f):
        return f

def requested_url_is_public():
    from flask import request
    return request.url_rule in _public_urls
Run Code Online (Sandbox Code Playgroud)

然后,当发出请求时,我有一个检查的上下文函数requested_url_is_public.

我有点难过,因为我不知道如何在public装饰器中获取给定函数的url规则.

也许这不是Flask的最佳设计选择,但我希望有另一种简单而优雅的方式来实现这一目标.

我以前见过这样的模式,想模仿它.例如,这与Django的login_required装饰者相对应.

我喜欢读这个想法.

Jar*_*rek 5

Flask已经有了一个login_required装饰器(参见视图装饰器).如果您使用public_urls来决定要求身份验证的网址,那么您最好使用它.

  • 糟糕-我刚刚意识到,就如我所希望的那样,我不太确定这是我需要的答案。我大约有4个公开网址,超过100个私有网址。我不想污染带有@login_required的代码,所以我想有一个eg.before_request,它拒绝所有公共请求,除非视图上有一个@public。希望您能明白为什么这还不是答案,但是您发布的内容绝对是一个很好的线索。如果我想出答案,我会标记为正确并发布我所做的事情。干杯。 (2认同)