簡體   English   中英

PyMongo奇怪的錯誤“ TypeError:'Database'對象不可調用。”

[英]PyMongo Strange Error “TypeError: 'Database' object is not callable.”

我遇到一個奇怪的錯誤。

資料來源: __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

錯誤:

> [root@CloudK02 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.

如果我在Application類中使用self.mongo,它將很好地工作。 但是,如果在類BaseHandler中使用它,則會出現錯誤。

為什么?

您已將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(

這顯然是錯誤的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM