【问题标题】:Cause of mongoengine.errors.InvalidQueryErrormongoengine.errors.InvalidQueryError 的原因
【发布时间】:2014-10-17 12:29:19
【问题描述】:

使用 Flask、MongoDB 和 MongoEngine 的旅程仍在继续。

我(希望)以正常方式将数据库与我的模型同步,但是当我尝试查询数据库以获取像地址名称这样简单的内容时,我收到以下消息:

mongoengine.errors.InvalidQueryError
InvalidQueryError: Not a query object: {'wsgi.multiprocess': False, 'SERVER_SOFTWARE': 
'Werkzeug/0.9.6', 'SCRIPT_NAME': '', 'REQUEST_METHOD': 'GET', 'PATH_INFO': '/result', 
'SERVER_PROTOCOL': 'HTTP/1.1', 'QUERY_STRING': 'query=28+Paritai+Drive+Orakei', 
'werkzeug.server.shutdown': <function shutdown_server at 0x10f8cd1b8>, 'CONTENT_LENGTH': '', 
'HTTP_USER_AGENT': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like 
Gecko) Chrome/36.0.1985.143 Safari/537.36', 'HTTP_CONNECTION': 'keep-alive', 'SERVER_NAME': 
'127.0.0.1', 'REMOTE_PORT': 60329, 'wsgi.url_scheme': 'http', 'SERVER_PORT': '5000', 
'werkzeug.request': <Request 'http://localhost:5000/result?query=28+Paritai+Drive+Orakei' [GET]>, 
'wsgi.input': <socket._fileobject object at 0x10f8932d0>, 'HTTP_HOST': 'localhost:5000', 
'wsgi.multithread': False, 'HTTP_CACHE_CONTROL': 'max-age=0', 'HTTP_ACCEPT': 
'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'wsgi.version': (1, 
0), 'wsgi.run_once': False, 'wsgi.errors': <open file '<stderr>', mode 'w' at 0x10e8581e0>, 
'REMOTE_ADDR': '127.0.0.1', 'HTTP_ACCEPT_LANGUAGE': 'en-US,en;q=0.8', 'CONTENT_TYPE': '', 
'HTTP_ACCEPT_ENCODING': 'gzip,deflate,sdch'}.
Did you intend to use key=value?

Traceback (most recent call last)

我也因在 Python shell 中四处游荡而得到此错误(可能与此相关):

>>> db.properties.objects()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Library/Python/2.7/site-packages/pymongo/collection.py", line 1705, in __call__
self.__name)
TypeError: 'Collection' object is not callable. If you meant to call the 'objects' method on a     
'Database' object it is failing because no such method exists.

这是我的 models.py 代码,正确链接到 Flask:

from app import db

# ----------------------------------------
# Taking steps towards a working backend.
# ----------------------------------------

class Person(db.Document):

    # Meta variables.
    meta = {
        'collection': 'properties'
    }

    # Document variables.
    name = db.StringField(max_length=255, required=True)
    address =  db.StringField(max_length=255, required=True)
    email = db.StringField(max_length=255, required=True)

    def __repr__(self):
        return address

    def get_person_from_db(self, query_string):
        if not query_string:
            raise ValueError()
        # Ultra-simple search for the moment.
        person_class_object = Property
        bingo = person_class_object.objects(__raw__={'name': query_string})
        return bingo

这里是我调用 get_person_from_db(...) 的地方,也就是有问题的函数:

@app.route('/result')
def result():
search_string = request.args['query']
if search_string == '':
    return render_template('index.html')
else:

    person_class_object = models.Person()
    specific_person = person_class_object.get_person_from_db(search_string)

    return specific_person

关于此错误的原因可能是什么?提前感谢您的意见!

【问题讨论】:

  • 我觉得少了点什么。不知何故,一个烧瓶请求对象作为查询发送到 mongodb。
  • 好点子——@AndrewJohnson,有什么解决办法吗?感谢您的快速评论!
  • 在您的第一个错误中,最后有一个 Traceback 被切断。查看它并找到您真正的错误来自哪个文件/行。
  • 这是这里的确切问题:File "/Users/epithelialbiology/Desktop/fm906/application/app/views.py", line 32, in result person_class_object.objects(name="John Smith") TypeError: 'QuerySetManager' object is not callable 这并不完美,因为我正在更改名称等,但应该给出一个想法。

标签: python mongoengine flask-mongoengine


【解决方案1】:

这个错误的原因实际上非常简单——对象被正确检索,但 Flask Web 应用程序不适合在前端接收纯 JSON。

出于某种原因,我预计它会将 JSON 打印为字符串,但事实并非如此。

为了获得所需的结果,可以专门调用字段名称 (specific_person.name) 或使用 Flask 的 render_template 功能在网页上很好地格式化输出。

【讨论】:

    【解决方案2】:

    我知道现在很晚,但可能会帮助其他人。你可以这样做:

    return jsonify(bingo=bingo)

    不要忘记导入jsonify

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-13
      • 2017-04-10
      • 1970-01-01
      • 2014-05-31
      • 2015-12-30
      • 1970-01-01
      • 2011-07-30
      • 1970-01-01
      相关资源
      最近更新 更多