2

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 シェルをいじってから、このエラー (関連している可能性があります) が発生しました。

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

これが、Flask に適切にリンクされた models.py のコードです。

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

このエラーの原因について何か考えはありますか? 事前にご連絡いただきありがとうございます。

4

2 に答える 2

1

実際、このエラーの原因は驚くほど単純でした。オブジェクトは正しく取得されていましたが、Flask Web アプリケーションはフロント エンドで純粋な JSON を受け取ることができませんでした。

何らかの理由で、JSON を文字列として出力することを期待していましたが、そうではありませんでした。

目的の結果を得るには、フィールド名を具体的に呼び出す ( specific_person.name) か、Flask のrender_template機能を使用して Web ページで出力を適切にフォーマットすることができます。

于 2014-08-26T21:13:38.230 に答える