2013-02-16 33 views
4

以下是錯誤:Python龍捲風 - 如何修復'URLhandler需要完全X參數'的錯誤?

TypeError: __init__() takes exactly 1 argument (3 given) 
ERROR:root:Exception in callback <tornado.stack_context._StackContextWrapper object at 0x1017d4470> 
Traceback (most recent call last): 
    File "/Library/Python/2.7/site-packages/tornado-2.4.1-py2.7.egg/tornado/ioloop.py", line 421, in _run_callback 
    callback() 
    File "/Library/Python/2.7/site-packages/tornado-2.4.1-py2.7.egg/tornado/iostream.py", line 311, in wrapper 
    callback(*args) 
    File "/Library/Python/2.7/site-packages/tornado-2.4.1-py2.7.egg/tornado/httpserver.py", line 268, in _on_headers 
    self.request_callback(self._request) 
    File "/Library/Python/2.7/site-packages/tornado-2.4.1-py2.7.egg/tornado/web.py", line 1395, in __call__ 
    handler = spec.handler_class(self, request, **spec.kwargs) 
TypeError: __init__() takes exactly 1 argument (3 given) 

這裏是代碼:

class IndexHandler(tornado.web.RequestHandler): 
    def __init__(self): 
     self.title = "Welcome!" 

    def get(self): 
     self.render("index.html", title=self.title) 

我已經簡化了代碼到上述情況,我感到莫名其妙,爲什麼這是生產的錯誤。我一定是做錯了,但我不知道什麼(3參數通過??? ...嗯?)

注意:title變量只是在我的index.html模板中的<title>{{ title }}</title>

我正在運行Python 2.7.3,32位版本以便與Mysqldb-Python一起工作。正如你所看到的,我的Tornado版本是2.4.1。我也在OSX Lion上運行(如果這有什麼區別......)也許是最終產生這個錯誤的兼容性問題?

所有的幫助在調試時都會受到讚賞。謝謝。

回答

9

@Princess of the Universe是正確的,但也許這需要一點闡述。

龍捲風打算撥打電話__init__RequestHandler子類的參數application, request, **kwargs,所以你需要允許的。

你可以這樣做:

def __init__(self, application, request, **kwargs): 
    self.title = "Welcome!" 
    super(IndexHandler, self).__init__(application, request, **kwargs) 

這意味着你的IndexHandler類現在與相同的簽名父類初始化。你是什​​麼意思時,你說:「你必須提供的構造相同的API

def initialize(self): 
    self.title = "Welcome!" 
+0

謝謝你的解釋!我正在學習龍捲風,這對我來說完全有意義。很有幫助。 – JohnZ 2013-02-16 18:31:42

+4

Tornado沒有公開關於'RequestHandler .__ init__'的文檔,因此沒有向後兼容性合約。至少現在我會考慮'初始化'唯一有效的方法。 – 2015-04-28 22:46:16

1

您在不適當的方式重寫

__init__() 

http://www.tornadoweb.org/documentation/web.html

簽名是

class tornado.web.RequestHandler(application, request, **kwargs)[source] 

很明顯,你必須提供派生類的構造函數相同的API。

+0

你不介意詳細闡述了一點:

不過,我贊成的initialize方法,其中龍捲風爲此提供了派生類「?例如,我將如何正確地「覆蓋」__init__? – JohnZ 2013-02-16 06:32:26

+0

你在理解編程和閱讀答案方面缺乏重要性。您的__init __()必須提供與基類的__init __()相同的參數列表,清楚地表明(應用程序,請求,** kwargs) – 2013-02-16 06:49:25

+0

我對於尚未完全掌握Tornado的基礎知識表示歉意,因爲我剛剛開始學習它;然而,你的答案,與科爾一起,現在對我有意義。謝謝。 – JohnZ 2013-02-16 18:33:20