简体   繁体   English

PyMongo奇怪的错误“ TypeError:'Database'对象不可调用。”

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

I got a strange error. 我遇到一个奇怪的错误。

Source: __init__.py 资料来源: __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

Error: 错误:

> [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.

It works well if I use self.mongo in class Application . 如果我在Application类中使用self.mongo,它将很好地工作。 But I got an error if I use it in class BaseHandler . 但是,如果在类BaseHandler中使用它,则会出现错误。

Why? 为什么?

You've defined db as a property, meaning that you don't have to call it. 您已将db定义为属性,这意味着您不必调用它。 But then you call it! 但是那你就叫它!

Either remove the @property or use self.db instead of self.db() . 或者删除@property或使用self.db代替self.db()


As always, Python's error messages are informative and you should look at them! 和往常一样,Python的错误消息是有益的,您应该仔细阅读它们! In this case, you can see 在这种情况下,您可以看到

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.

which means that you are calling (ie like a function) a database object somewhere. 这意味着您正在某个地方调用(即像一个函数一样)数据库对象。 Where? 哪里?

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

See? 看到? self.db is a property, so gives you self.application.mongo . self.db是一个属性,因此为您提供了self.application.mongo Then you call it, so the above line is equivalent to 然后调用它,所以上面的行等效于

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

which is obviously wrong. 这显然是错误的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 类型错误:'numpy.ndarray' object 不可调用。 奇怪的错误 - TypeError: 'numpy.ndarray' object is not callable. Strange error TypeError:“模块”对象不可调用。 凯拉斯 - TypeError: 'module' object is not callable. keras 返回 TypeError: 'LinearRegression' 对象不可调用。 此错误的其他答案说 LinearRegression 尚未初始化 - Returns TypeError: 'LinearRegression' object is not callable. Other answers with this error say LinearRegression has not been initialized Python奇怪错误:“TypeError:'NoneType'对象不可调用” - Python Strange Error: “TypeError: 'NoneType' object is not callable” TypeError:“ str”对象不可调用。 即使没有所谓的“ str” - TypeError: 'str' object is not callable. Even though there is nothing called 'str' 类型错误:'float' object 不可调用。 这是什么意思? - TypeError: 'float' object is not callable. What does it mean? TypeError: 'torch.dtype' object 不可调用。 这个function怎么称呼? - TypeError: 'torch.dtype' object is not callable. how to call this function? 类型错误:'int' object 不可调用。 请帮帮我 - TypeError: 'int' object is not callable. Help me please 类型错误:“模块”对象不可调用。 当我运行它时它不起作用,因为第 4 行出现某种错误。我该怎么办? - TypeError: 'module' object is not callable. When I run it it does not work cuz there is some sort of error in line 4.What should I do? 集合 object 不是 PyMongo 的可调用错误 - Collection object is not callable error with PyMongo
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM