在before_request()
函数(下面)中,如果用户尚未登录,我想将用户重定向到/login
。是否有一个特殊变量可以为我提供当前可用的URL如下例所示?
@app.before_request
def before_request():
# the variable current_url does not exist
# but i want something that works like it
if (not 'logged_in' in session) and (current_url != '/login'):
return redirect(url_for('login'))
我需要检查当前网址是否为/login
,因为如果我不这样做,服务器会进入无限循环。
答案 0 :(得分:64)
您可以检查请求对象上的一些属性,记录here,request.path
可能就是您想要的。我可以建议request.endpoint
,所以如果你决定将你的观点转到另一个网址或多个网址,你将会被覆盖
@app.before_request
def before_request():
if 'logged_in' not in session and request.endpoint != 'login':
return redirect(url_for('login'))
答案 1 :(得分:13)
您可以使用装饰器。这是一个示例,说明如何在特定请求之前检查API密钥:
from functools import wraps
def require_api_key(api_method):
@wraps(api_method)
def check_api_key(*args, **kwargs):
apikey = request.headers.get('ApiKey')
if apikey and apikey == SECRET_KEY:
return api_method(*args, **kwargs)
else:
abort(401)
return check_api_key
您可以将其用于:
@require_api_key
答案 2 :(得分:5)
以下是使用flask-login接受的答案的实现:
@app.before_request
def require_authorization():
from flask import request
from flask.ext.login import current_user
if not (current_user.is_authenticated or request.endpoint == 'login'):
return login_manager.unauthorized()