如何在Python中启用基本身份验证的情况下调用函数

如何在Python中启用基本身份验证的情况下调用函数,python,python-3.x,authentication,flask,flask-restful,Python,Python 3.x,Authentication,Flask,Flask Restful,我在一个flask应用程序中使用decorator的基本身份验证。 代码如下所示: from flask import Flask, Response, request from functools import wraps app = Flask(__name__) app.config.from_object('settings') def valid_credentials(username, password): return username == app.config['

我在一个flask应用程序中使用decorator的基本身份验证。 代码如下所示:

from flask import Flask, Response, request
from functools import wraps

app = Flask(__name__)
app.config.from_object('settings')

def valid_credentials(username, password):
    return username == app.config['USER'] and password == app.config['PASS']

def authenticate(f):
    @wraps(f)
    def wrapper(*args, **kwargs):
        auth = request.authorization
        if not auth.username or not auth.password or not valid_credentials(auth.username, auth.password):
            return Response('Login!', 401, {'WWW-Authenticate': 'Basic realm="Login!"'})
        return f(*args, **kwargs)
    return wrapper

@app.route('/')
def index():
    return 'Hello, world!'

@app.route('/secure')
@authenticate
def secure():
    return 'Secure!'

@app.route('/check')
@authenticate
def check():
    secure()
    return 'checked'

if __name__ == '__main__':
    app.run(debug=True)

但是由于身份验证,我无法从check函数调用secure函数。现在可以在当前场景中调用该函数了吗?

通常的方法是将helper方法与视图分开。例如:

def _secure():
    return 'Secure!'

@app.route('/secure')
@authenticate
def secure():
    return _secure()
然后,您可以从其他地方重用helper方法(
\u secure()
)。由于它没有关联的路由,因此访客不可能在没有身份验证的情况下运行它


将这些helper方法保存在一个单独的模块中也是一个好主意(例如
helpers.py
utils.py
)。

我明白了,我们可以将方法与路由分离,但是否真的可以将路由连接到它?我之前认为,装饰器只有在调用路由时才起作用,而不是函数。看来我完全错了。有什么明确的解释吗?修饰符只是将一个函数包装成另一个函数的语法糖,所以是的,无论从何处使用,都会使用修饰符。