2012-02-19 200 views
1

我有一个奇怪的错误。PyMongo奇怪的错误“TypeError:'数据库'对象不可调用。”

来源: __init__.py

import os 
import base64 
import uuid 

import tornado.web 
import tornado.httpserver 
import tornado.locale 
import tornado.ioloop 
import tornado.options 

from tornado.options import define, options 

from pymongo.connection import Connection 
from pymongo.database import Database 

from handlers import api 
#from auth import AuthLoginHandler 
#from auth import AuthLogoutHandler 
#from auth import AuthFirstRunHandler 
from handlers import home 

## Options 
define("listen_port",  default = 7456, type = "int", 
       help = "bind to port") 

define("listen_address", default = None, type = "string", 
       help = "bind to address") 

define("static_path",  default = os.path.join(os.path.dirname(__file__), "static"), type = "string", 
       help = "directory to store static resource") 

# http://www.v2ex.com/t/12646 
define("cookie_secret",  default = base64.b64encode(uuid.uuid4().bytes + uuid.uuid4().bytes), type = "string", 
       help = "cookie") 

define("mongo_host",  default = "127.0.0.1", type = "string", 
       help = "hostname or ip of mongo host") 

define("mongo_port",  default = 27017, type = "int", 
       help = "port of mongo host") 

define("mongo_collection", default = "meowth", type = "string", 
       help = "collection name") 

tornado.options.parse_command_line() 

class Application(tornado.web.Application): 
    def __init__(self): 
     tornado.web.Application.__init__(self, [ 
      (r"/i", home.HomeHandler), 
     # (r"/auth/login", AuthLoginHandler), 
     # (r"/auth/logout", AuthLogoutHandler), 
     # (r"/auth/install", AuthFirstRunHandler), 
     # (r"/backstage", BackstageHomeHandler), 
      (r"/api/cluster", api.APIHandler), 
      (r"/api/user", api.APIHandler), 
      (r"/api/connection", api.APIHandler), 
      (r"/api/control", api.APIHandler), 
      (r"/static/(.*)", tornado.web.StaticFileHandler, { "path" : options.static_path }) 
     ],** dict(
      xsrf_cookies = True, 
      cookie_secret = options.cookie_secret 
     )) 

     # init database connection 
     self.mongo = Database(
      Connection(
       options.mongo_host, 
       options.mongo_port 
      ), 
      options.mongo_collection 
     ) 
     #self.mongo = self.mongoConnection[options.mongo_collection] 
     #self.mongo = self.mongoConnection.meowth 

def main(): 
    if options.listen_address == None: 
     tornado.httpserver.HTTPServer(Application()).listen(options.listen_port) 
    else: 
     tornado.httpserver.HTTPServer(Application()).listen(options.listen_port, address = options.listen_address) 

    tornado.ioloop.IOLoop.instance().start() 

if __name__ == "__main__": 
    main() 

base.py

# -*- coding: utf8 -*- 
import tornado.web 
import pymongo 

class BaseHandler(tornado.web.RequestHandler): 

    def __init__(self, application, request, **kwargs): 
     tornado.web.RequestHandler.__init__(self, application, request, **kwargs) 
     self.session_id = self.get_secure_cookie("meowth_session") 
     self.session = {} 

    @property 
    def db(self): 
     print self.application.mongo 
     return self.application.mongo 

    def init_session(self): 
     if not self.session_id: 
      self.session_id = self.db().meowth_sessions.save(
       {"data" : self.session} 
      ) 
     else: 
      self.session = self.db().meowth_sessions.find_one(
       {"_id" : self.session_id} 
      ) 

    def flush_session(self): 
     self.db().meowth_sessions.save(
       {"data" : self.session, 
       "_id" : self.session_id 
       } 
      ) 

    def is_spider(self): 
     # https://bitbucket.org/keakon/doodle/src/3ddf46ac59e7/zh-CN/common.py#cl-512 
     user_agent = self.request.headers["User-Agent"] 
     if 'bot' in user_agent or 'spider' in user_agent: 
      return True 
     return False 

错误:

> [[email protected] Meowth]# ./Meowth-Web Database(Connection('127.0.0.1', 
> 27017), u'meowth') [E 120219 15:07:54 web:1031] Uncaught exception GET 
> /i (122.94.31.186) 
>  HTTPRequest(protocol='http', host='us1.loli.vg:7456', method='GET', uri='/i', version='HTTP/1.1', remote_ip='122.94.31.186', 
> body='', headers={'Accept-Language': 'en-US,en;q=0.8', 
> 'Accept-Encoding': 'gzip,deflate,sdch', 'Host': 'us1.loli.vg:7456', 
> 'Accept': 
> 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 
> 'User-Agent': 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, 
> like Gecko) Chrome/17.0.963.56 Safari/535.11', 'Accept-Charset': 
> 'ISO-8859-1,utf-8;q=0.7,*;q=0.3', 'Connection': 'keep-alive', 
> 'Cookie': 'PHPSESSID=rm4ght6ivop9a1hf5oogcft3j4; 
> session_id="MzZkODNiMWMyZjczOWZhNzcxYjU4YTNjNzVhZjA4Yzc=|1329674350|2562f7ed871c1ca3e24dcb5891d6e753cfacfa44"; 
> rock_format=json', 'Cache-Control': 'max-age=0'}) 
>  Traceback (most recent call last): 
>  File "/usr/local/lib/python2.6/site-packages/tornado/web.py", line 988, in _execute 
>   getattr(self, self.request.method.lower())(*args, **kwargs) 
>  File "/home/aveline/Meowth/web/handlers/home.py", line 7, in get 
>   self.init_session() 
>  File "/home/aveline/Meowth/web/handlers/base.py", line 19, in init_session 
>   self.session_id = self.db().meowth_sessions.save(
>  File "build/bdist.linux-x86_64/egg/pymongo/database.py", line 696, in __call__ 
>   "failing because no such method exists." % self.__name) 
>  TypeError: 'Database' object is not callable. If you meant to call the 'meowth' method on a 'Connection' object it is failing because no 
> such method exists. 

它工作得很好,如果我在课堂上应用使用self.mongo。 但是,如果我在类BaseHandler中使用它,我得到一个错误。

为什么?

回答

5

您已将db定义为属性,这意味着您不必调用它。但是你叫它!

删除@property或使用self.db而不是self.db()


一如既往,Python的错误信息是内容丰富的,你应该看看它们!在这种情况下,您可以看到

TypeError: 'Database' object is not callable. If you meant to call the 'meowth' method on a 'Connection' object it is failing because no such method exists. 

这意味着您正在调用某个数据库对象(即像函数一样)。哪里?

File "/home/aveline/Meowth/web/handlers/base.py", line 19, in init_session 
    self.session_id = self.db().meowth_sessions.save(

请参阅? self.db是一个属性,所以给你self.application.mongo。那么你打电话吧,所以上面的行相当于

self.session_id = self.application.mongo().meowth_sessions.save(

这显然是错的。

+0

谢谢,我已修复它。 – 2012-02-19 14:27:08