2017-12-06 25 views
0

私はCherryPyツールボックスに新しいツールを宣言しようとしていますが、これはdocs:Docs CherryPy Toolsの例に従っています。CherryPyツールの宣言が失敗しました

私が書かれている例によると:

import cherrypy 

def myTool(): 
    print ("myTool") 

class Root(object): 
    @cherrypy.expose 
    @cherrypy.tools.mytool() 
    def index(self): 
     return "Hello World!" 

if __name__ == '__main__': 
    cherrypy.tools.mytool = cherrypy.Tool('before_finalize', myTool) 
    cherrypy.quickstart(Root(), '/') 

これは、次のエラーが発生:私は次のように表記を変更した場合、予想通り

Traceback (most recent call last): 
    File "server.py", line 6, in <module> 
    class Root(object): 
    File "server.py", line 8, in Root 
    @cherrypy.tools.mytool() 
    AttributeError: 'Toolbox' object has no attribute 'mytool' 

は、しかし、それは動作します。

import cherrypy 

def myTool(): 
    print ("myTool") 

class Root(object): 
    @cherrypy.expose 
    def index(self): 
     return "Hello World!" 
    index._cp_config = {'tools.mytool.on': True} 

if __name__ == '__main__': 
    cherrypy.tools.mytool = cherrypy.Tool('before_finalize', myTool) 
    cherrypy.quickstart(Root(), '/') 

ドキュメントによれば、どちらの方法も同じ効果がありますが、私の場合はそうではありません。誰かが私が間違っていることを知っていれば、とても感謝しています。

ツールはグローバルに定義するべきではないので、@ cherrypy.tools.mytool()という表記法を使用してください。

私はpython 3.6を使用しています。

+0

私はちょうどフラスコを個人的に使用していました...申し訳ありませんが、私は答えがわかりませんが、私を知っています –

答えて

0

Pythonの評価順序を誤って(トップダウン)、クラス定義時にツールが定義されていないという問題があります。

ツールは、(クラス定義の前に)別のファイルインポートで定義することができ、それは機能するはずです。

2番目の形式は、設定が実際のツールオブジェクトではなくconfig内の文字列を使用して間接的に行われるため機能します。

+0

ありがとうございました!別のファイルからツールをインポートすることは、そのトリックでした! – Dif

関連する問題