Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Redirect 烧瓶从关闭状态重新定向_Redirect_Python 3.x_Flask_Closures - Fatal编程技术网

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