我正在创建一个Python
Flask应用程序,并在下面创建了装饰器和视图。装饰器在查看索引时效果很好,但是当您注销并使用url_for
索引重定向时,它将引发builderror。为什么会
def logged_in(fn):
def decorator():
if 'email' in session:
return fn()
else:
return render_template('not-allowed.html', page="index")
return decorator
@app.route('/')
@logged_in
def index():
email = session['email']
return render_template('index.html', auth=True, page="index", marks=marks)
@app.route('/sign-out')
def sign_out():
session.pop('email')
print(url_for('index'))
return redirect(url_for('index'))
有任何想法吗?错误是:BuildError: ('index', {}, None)
这里的问题是,decorator()
您返回的函数与正在修饰的函数的名称不同,因此URL构建器找不到您的index
视图。您需要使用模块中的wraps()
装饰器functools
来复制原始函数的名称。另一个问题(您仍然必须遇到)是您不接受装饰器中的参数并将其传递给原始函数。这是更正的装饰器:
from functools import wraps
def logged_in(fn):
@wraps(fn)
def decorator(*args, **kwargs):
if 'email' in session:
return fn(*args, **kwargs)
else:
# IMO it's nicer to abort here and handle it in errorhandler.
abort(401)
return decorator
更多解释 :在Python装饰器中,是一个函数,该函数将另一个函数作为其参数并返回一个函数作为其结果。所以以下
@logged_in
def index(): pass
基本上与
def index(): pass
index = logged_in(index)
在这种情况下,问题在于logged_in
装饰器返回的不是原始函数,而是包装原始函数的包装器(decorator
在代码中称为)。该包装器的名称(decorator
)与要包装的原始函数不同。现在app.route()
,您将在之后调用的decoratorlogged_in
看到此新函数,并使用其名称(decorator
)为其注册路由。问题就出在这里:您希望修饰后的函数具有相同的名称(index
),因此可用于url_for()
为其获取路线。这就是为什么您需要手动复制名称的原因
decorator.__name__ = fn.__name__
或更好地使用模块中的帮助update_wrapper
和wraps
帮助functools
,为您做的甚至更多。
问题内容: 我想知道用于在模板和应用程序代码中生成链接的原因。 通过这样做,我可以获得什么: 和这个: 而不是硬编码路径? 问题答案: 从Flask的文档中, 使用提供的方法生成指向给定端点的URL。 目标端点未知的变量参数将作为查询参数附加到生成的URL。如果查询参数的值是,则将跳过整个对。如果蓝图处于活动状态,则可以通过在本地端点前面加点()来快捷引用同一蓝图。 现在,您无需使用静态网址即可到
问题内容: 假设我有一个名为的类,并且我想使用装饰器设计模式。如果我错了,请纠正我,但是要使其正常工作,我们需要创建一个装饰器类,例如,该类将保留对实例的引用,所有其他装饰器将对其进行扩展以添加功能。 我不明白为什么我们必须创建装饰器类而不是使用实例? 问题答案: 装饰器模式用于动态地(即在运行时)向对象添加功能。通常,在编写类时,对象将具有固定的功能。但是重要的一点是,对象的功能以对对象的客户端
问题内容: 我正在尝试使用pip安装软件包。我尝试 运行,但是得到了。为什么会出现此错误?如何使用pip安装软件包? 问题答案: 是从命令行而不是Python解释器运行的。这是一个安装模块的程序,因此你可以从Python使用它们。安装模块后,即可打开Python shell并执行。 不是命令行,而是一个交互式解释器。你在其中键入代码,而不是命令。
您都知道将依赖项放入pom.xml文件并运行“MVN clean Install”的过程。当这个命令运行时,依赖项的jar文件被下载到。m2存储库中。 当我们使用IntelliJ和run/debug配置窗口运行应用程序时,IntelliJ如何知道在哪里查找依赖项的jar文件?IntelliJ中的每个GUI操作实际上都取代了命令行操作。当我们单击“运行”按钮时,在“幕后”提交的命令行操作是什么。我相
举例说一下,比如有2个函数,我要对他们做相同的前置判断条件。
我试图理解静态变量中类加载器泄漏的可能性。正如我在许多地方看到的,静态变量被类对象引用,而类对象又与类加载器相关。这是否意味着如果我编写了如下代码,那么Classloader将不会被GCed<代码>专用静态最终GCTester INSTANCE=新GCTester() 和主类: 带有类加载和卸载选项的输出启用: 在这里我们可以看到 finalize 没有被调用,同样的事情在没有静态的情况下也会发生