Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.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
Python 烧瓶中的伪球形物及其他_Python_Flask - Fatal编程技术网

Python 烧瓶中的伪球形物及其他

Python 烧瓶中的伪球形物及其他,python,flask,Python,Flask,我正在寻找这个问题的合理答案: 我毫不怀疑,如果我深入研究,那么一切都会有意义,但我的第一直觉是:这种复杂性(代理对象到线程局部变量、上下文堆栈等)有多大程度上是由以下事实造成的: from flask import request 从烧瓶进口请求 这只是个坏主意? 如果不是: from flask import request ... @app.route('/'): def index(): return "Hello from %s" % re

我正在寻找这个问题的合理答案:

我毫不怀疑,如果我深入研究,那么一切都会有意义,但我的第一直觉是:这种复杂性(代理对象到线程局部变量、上下文堆栈等)有多大程度上是由以下事实造成的: from flask import request 从烧瓶进口请求 这只是个坏主意? 如果不是: from flask import request ... @app.route('/'): def index(): return "Hello from %s" % request.args.get('name') 从烧瓶进口请求 ... @应用程序路径(“/”): def index(): 返回“Hello from%s”%request.args.get('name')) 我们做到了: @应用程序路径(“/”): def索引(请求): 返回“Hello from%s”%request.args.get('name')) Armin对上述问题的回答不是很令人满意:

很长一段时间以来,我一直是线程本地人的强烈反对者,但我最终不得不承认,它们让事情变得更容易,而不是更难。 。。。 事实上,您可以使用`\u app\u ctx\u stack.top.mydatabase\u connection`从任何地方获取数据库连接,这非常有帮助。 。。。 TL;DR:你不能没有线程局部变量,或者你有一个可怕的API。
我看不出
\u app\u ctx\u stack.top.mydatabase\u connection
request.app.my\u database\u connection
好多少,你不应该只考虑控制器(在那里你可以访问请求对象)。它在应用程序的其他层中也很重要(想象一个可重用的服务层,其中有重要的业务规则)

考虑到有了显式参数,您现在必须将
请求
传递给视图可能需要使用的任何和所有实用程序函数,而不需要访问请求状态。这包括第三方库。我无法理解重复出现的库参数。当然,您必须将参数传递给库函数。替代方案是什么?第三方库是否从flask导入请求执行
,现在取决于flask?如果必须传入
请求
参数,库至少依赖于Werkzeug。我所说的是几层调用,在这些调用中,视图相关的代码最终被调用。现在,您需要一种方法来通过
请求
对象,或者能够访问将生成的响应,但是沿着该路径的任何和所有第三方库都必须合作。在任何情况下,您都可以尝试使用Pyramid和Flask来查看差异。然后你会发现这一点。我已经用Python编写web应用程序15年了,我发现不必通过多层调用传递请求非常有帮助,即使一开始对这个想法非常抵触。有时实用性胜过纯洁性。Flask只是明确说明了这一点,但几乎所有其他框架都使用线程局部变量!瓶子、Zope(还有更多的Plone)和金字塔。对于Django,有一种流行的中间件(另请参见)。但是Armin将其作为一个显式API选择,并且不知何故更糟? @app.route('/'): def index(request): return "Hello from %s" % request.args.get('name')