3

私は今 tornado を学んでいますが、優れたフレームワークだと思います。main.py からいくつかのメソッドを分離するまでは、すべて順調です。

例えば:

私のサーバー起動プログラムであるmain.pyにあります。tornado.options.define を使用して、次のようないくつかのプロパティを定義します。

define("port", default=8888, help="run on the given port", type=int)
define("mysql_host", default="127.0.0.1:3306", help="blog database host")
define("mysql_database", default="forum", help="database name")
define("mysql_user", default="root", help="database user")
define("mysql_password", default="passwd", help="database password")

その中に BaseHandler があります。

class BaseHandler(tornado.web.RequestHandler):
@property
def db(self):
    return self.application.db

def get_current_user(self):
    return self.get_secure_cookie("username")

また、topic.py などの別のファイルでは、topic.py 内のすべてのハンドラーが main.py 内の BaseHandler を拡張するため、次のように BaseHandler をインポートします。

from main import BaseHandler

次に、プログラムを起動すると問題が発生します。

Traceback (most recent call last):
  File "/Users/abc/money/main.py", line 85, in <module>
    define("port", default=8888, help="run on the given port", type=int)
  File "/Library/Python/2.7/site-packages/tornado-2.2-py2.7.egg/tornado/options.py", line 93, in define
options[name].file_name)
tornado.options.Error: ('Option %r already defined in %s', 'port', '/Users/suyejun/Dropbox/money/main.py')

どうすればこの種の問題を回避できますか? または、コードを記述する別の方法はありますか?

4

1 に答える 1

4

BaseHandlerをmain.pyという別のファイルに移動する必要があります。あなたが抱えている問題は、main.pyのコードを2回効果的にロードしていることです。アプリケーションを起動したときと、コードをtopic.pyにインポートしたとき。

'pagemanager.py'のような別のファイルを作成し、そこに共有クラス、関数、コードを配置することをお勧めします。次に、Tornadoの初期化に固有のコードで問題を発生させることなく、それらをmain.pyとtopic.pyの両方にインポートします。

于 2012-04-06T12:52:13.163 に答える