Przede wszystkim find_one
zwróci pojedynczy słownik lub None, jeśli w kolekcji nie ma pasującego elementu. Myślę więc, że page[0]
jest równoważne pobraniu wartości słownika strony dla klucza 0
Jeśli zwracane dokumenty zawierają ObjectId
jako _id
nie możesz po prostu użyć jsonify
ponieważ, jak ObjectId
nie nadaje się do serializacji JSON. Możesz użyć czegoś takiego:
jsonify({ 'page': make_public_page({k:v for k, v in page.items() if k != '_id'}))
lub możesz po prostu usunąć _id
dzwoniąc na page.pop('_id')
Możesz także użyć bson.json_util
. Zawiera narzędzia do konwersji między BSON a JSON.
from flask import Response
from bson import json_util
A następnie zastąp jsonify
z czymś podobnym do tego:
return Response(
json_util.dumps({'page' : make_public_page(page)}),
mimetype='application/json'
)
Edytuj
Jeśli potrzebujesz krótkiego i brudnego sposobu radzenia sobie z problemem, możesz to zrobić w ten sposób:
from bson import json_util, ObjectId
import json
#Lets create some dummy document to prove it will work
page = {'foo': ObjectId(), 'bar': [ObjectId(), ObjectId()]}
#Dump loaded BSON to valid JSON string and reload it as dict
page_sanitized = json.loads(json_util.dumps(page))