我正在使用需要用户管理的Flask应用。但是,我的网站有多个部分,让我们称之为/site/<name>/
,每个部分都有自己的用户(在数据库中链接到name
)。
所以,我想要实现的是:
/site/<name>/<path>
的任何未经授权的访问都会被重定向到/site/<name>/login
(因此,我不能简单地重新定义login_view_function
)。name
(因此,来自/site/name1/
的用户无法在/site/name2/
登录。)/site/name1/login
的登录位于/site/name1/<path>
内,但不在/site/name2/<path>
内(用户在此处未经授权;也可以退出name1
...我不知道#39;特别关心究竟发生了什么。)/site/<name>/
之外发生什么(或无效name
),现在都无关紧要。我尝试在before_request
修饰函数中重新定义URL规则:
site_manager = UserManager(db_adapter, app)
...
@app.before_request
def config_flask_user():
m = re.match(r'https?://[^/]+/site/(?P<name>[^:/]*)', request.url)
if m:
name = m.group('name')
flask.g.app_theme = name
if not name_ok(name):
flask.abort(404)
# Make a no-arguments node for the current site
app.debug = False
app.add_url_rule(
'/site/%s/' % name,
'site.current',
site,
methods=['GET', 'POST'],
defaults={'name': name},
)
app.debug = DEBUG
# Use it as the post-logout endpoint, so that it leads to a page
# where re-login works properly
site_manager.after_logout_endpoint = 'site.current'
# Override existing `login_url` and `logout_url` routes, to fit
# the current site path
for action in ('login', 'logout'):
rule = '/site/%s/%s/' % (name, action)
endpoint = getattr(site_manager, action + "_url")
view_func = getattr(site_manager, action + "_view_function")
for r in app.url_map._rules:
if r.rule == endpoint:
print("Redefining rule", endpoint, "as", rule)
r.rule = rule
r.refresh()
这似乎工作正常,但如果服务器在加载登录页面和实际提交用户的登录名和密码之间重新启动它实际上会中断,似乎是由于该位置为时已晚,无法重新定义这些路径,而且我和#39; m担心这是错误的方法(可能会导致不同的请求与不同的网站之间发生冲突),特别是对于预期的多工作环境。
TL; DR:如何让/site/<name>/
路径Flask-User
登录取决于name
参数?