我有两个模块。一个是基于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
源需要修改呢?
答案 0 :(得分:1)
我想我会把我的评论变成答案,因为它似乎解决了你的问题。
导入的模块在Python中缓存。这意味着当您从多个其他模块导入类似web
(主要web.py模块)的模块时,它们将获得具有相同内容的相同模块对象。
因此,您可能需要做的只是import web
模块顶部的addon.py
。