私は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.pyimport __main____main__.web.input()code.pycode.addon.web_input()addon.pyaddon.web_inputcode.web.input()
この状況で私は何をしますか?複数のアドオンがあり、それぞれにクラス定義がこのアドオンに格納されており、新しいモジュールを追加したり、既存のモジュールを簡単に接続および切断したりできます。変更する必要はありませんcode.py。これはPythonで可能だと思います...web.pyソースを変更する必要があるのでしょうか?