Redirect 烧瓶从关闭状态重新定向
它从不重定向到Redirect 烧瓶从关闭状态重新定向,redirect,python-3.x,flask,closures,Redirect,Python 3.x,Flask,Closures,它从不重定向到/login,而是提供一些垃圾页面 交换@/关闭订单产生: def check_login(func): """Check if user is logged in.""" def decorator(*args, **kwargs): if not login_session_test(): print ("Not logged in - redirect to /login") flash ("We
/login
,而是提供一些垃圾页面
交换@
/关闭订单产生:
def check_login(func):
"""Check if user is logged in."""
def decorator(*args, **kwargs):
if not login_session_test():
print ("Not logged in - redirect to /login")
flash ("Well that was wrong. Chicken winner. No more dinner.")
return redirect(url_for('login'))
print ("Logged in, do what needs to be done.")
return func(*args, **kwargs)
return decorator
@check_login
@app.route("/sacred/secret/stuff", methods=['GET'])
def funfunfun():
return "Super fun"
我还没有完全pythonized。您的装饰程序顺序不正确,并且您没有跨函数名复制到包装器函数 使用以下顺序:
AssertionError: View function mapping is overwriting an existing endpoint function: decorator
否则,将为视图注册未修饰的函数
用于将各种元数据从原始包装函数复制到替换它的包装器:
@app.route("/sacred/secret/stuff", methods=['GET'])
@check_login
def funfunfun():
return "Super fun"
路由需要端点名称,如果没有明确指定端点名称,Flask将使用函数名称(来自functionobj.\uuuu name\uuuuu
)。但是您的decorator包装对象的名称为decorator
,因此如果您多次使用decorator,Flask会抱怨它已经使用了该端点名称
@functools.wrapps()
跨\uuuuu name\uuuuuu
属性复制,因此现在您的装饰器包装器也称为funfunfun
,而另一个装饰路由函数也保留其名称。如果我的装饰器和登录测试位于另一个文件/模块中,该怎么办?我得到这个werkzeug.routing.BuildError:无法为端点“login”生成url。您的意思是“静态”吗?
@nmz787只要该模块已导入,它就会工作。您可以在命令行上运行flaskroutes
,以获得完整的列表(有多种方式对其排序的选项)。最后但并非最不重要的一点:如果您使用的是蓝图,则需要在名称前加上蓝图名称和一个点(如果您在注册到同一蓝图的视图中,则只需加上一个点)。
from functools import wraps
def check_login(func):
"""Check if user is logged in."""
@wraps(func)
def decorator(*args, **kwargs):
if not login_session_test():
print ("Not logged in - redirect to /login")
flash ("Well that was wrong. Chicken winner. No more dinner.")
return redirect(url_for('login'))
print ("Logged in, do what needs to be done.")
return func(*args, **kwargs)
return decorator