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 的代码两次。一次是在您启动应用程序时,另一次是在您将代码导入 topic.py 时。

我建议制作一个名为“pagemanager.py”之类的单独文件,并将任何共享类、函数、代码放在那里。然后将它们导入 main.py 和 topic.py,而不会导致特定于 Tornado 初始化的代码出现问题。

于 2012-04-06T12:52:13.163 回答