私は2つのモジュールを持っています。1 つは web.py に基づく Web サイトのコア (名前を付けましょうcode.py
) で、もう 1 つはアドオン モジュール ( addon.py
) です。web.py を使用すると、Web サイト サーバーの各ページに対して、次のようにコアにクラス定義が必要です。
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 には 1 つの問題があります。コアモジュールの POST 関数の呼び出しごとに、web.input()
すべての変数を格納するストレージオブジェクトとして設定されているようです。また、クラス定義がアドオンに格納されている場合、コアは単に呼び出しますaddon.Page.POST()
(この動作を変更する方法はありません)。はPOST()
取得を試みweb.input()
ますが、もちろん失敗します -web
は にインポートされません。インポートされていたとしても、 web-server が取得addon.py
する値はありません。空の辞書であり、モジュールの別のインスタンスにすぎません。 web.py
. だから私は知らない...
1つの解決策は、ある種の関数を に入れることaddon.Page.POST()
です。この関数は、1 つ下のレベルに移動し、そこでcode.py
を実行し、親モジュールの名前空間に何らかのアクセスを行う (実行してアクセスするweb.input(
など) に戻します (私が知っているように、これは推奨されません)。
または、たとえば、次のようにモジュール間で共有される C のようなポインターを配置します。
*すべての呼び出しが code.web.input() にルーティングされるという定義が
あります。から情報を得るaddon.py
import __main__
__main__.web.input()
code.py
code.addon.web_input()
addon.py
addon.web_input
code.web.input()
この状況で私は何をしますか?複数のアドオンがあり、それぞれにクラス定義がこのアドオンに格納されており、新しいモジュールを追加したり、既存のモジュールを簡単に接続および切断したりできます。変更する必要はありませんcode.py
。これはPythonで可能だと思います...web.py
ソースを変更する必要があるのでしょうか?