【发布时间】:2013-09-19 08:09:20
【问题描述】:
我有两个模块。一个是基于web.py的网站核心(我们将其命名为code.py),另一个是附加模块(addon.py)。使用 web.py,对于网站服务器的每个页面,核心中都应该有类定义,如下所示:
class Page:
def GET(self):
variable = "Hello!"
return render.page_template(variable) #Here, it returns the rendered template to user
def POST(self):
post_variables = web.input()
pass #Doing something with those variables, maybe, writing in a database...
现在我真的需要将该类定义从code.py 移动到addon.py。我可以将类定义称为addon.Page 而不是简单的Page。 Page.GET 函数仍然运行良好……但是 POST 存在一个问题。似乎在核心模块中每次调用 POST 函数 web.input() 时都被设置为存储所有变量的存储对象。如果我的类定义存储在插件中,核心只需调用addon.Page.POST()(我认为无法改变这种行为)。 POST() 尝试获取 web.input()... 当然失败了 - web 没有导入到 addon.py 中,即使是,也不会有任何值 web.py web-server 是获取 - 只是空字典,它只是模块的另一个实例。所以我不知道...
一种解决方案是:在addon.Page.POST() 中添加某种功能。这个函数将向下一层,到code.py 并在那里执行web.input(),然后将它返回到addon.py,某种访问父模块命名空间(比如执行import __main__ 和访问__main__.web.input()(这,据我所知,不鼓励))。
或者,例如,放置某种在模块之间共享的类 C 指针,例如:
* 在code.py 中有定义,所有对code.addon.web_input() 的调用都被路由到code.web.input()
* 在addon.py - 只需致电addon.web_input 即可从code.web.input() 获取信息
在这种情况下我该怎么办?会有多个插件,每个插件都有存储在这个插件中的类定义,我应该能够添加新模块,轻松连接和断开现有模块,无需修改code.py。我相信这在 Python 中是可能的......也许web.py 源需要修改?
【问题讨论】:
-
您能否展示不同模块中的导入内容,以及您担心的全局变量(以及它们如何被初始化)?如果没有更多细节,很难回答您的问题。
-
@Blckknght >你的不同模块中的导入是什么好吧,我不太明白你的问题。 >你担心的全局变量是什么(以及它们如何被初始化)在code.py中我导入web,创建web.app()实例并使用这个实例的run()函数来运行web服务器(在我之后当然,已经为页面定义了所有必要的类)。然后,当 Web 服务器收到 GET 或 POST 请求时,它会将所有 GET 或 POST 变量放在一个存储中,可以从运行 web.app() 的同一主模块调用 web.input() 访问该存储。我知道的就这么多=(
-
如果
web是一个模块,你应该可以导入它。导入相同其他模块的所有模块都将获得对相同模块对象的引用,因此应该没有值没有显示在它们应该出现的位置的问题。我对 web.py 不是很了解,所以也许还有其他事情发生,但你的问题并没有真正说明什么。您是否尝试过在addon中导入web? -
哦,非常感谢!我真的不知道那个参考的东西,相反,我不这么认为,正如你所看到的。非常感谢!