Eine der Varianten von Flask ist Eve, mit der sich REST-Services einfach erstellen lassen. Solange Sie das Schema entwerfen, wird die REST-API für SiteRoot bereitgestellt, aber es fühlt sich wie Django + REST Framework + eckig an, und als ich versuchte, es zu erstellen, wurde es ziemlich gut, daher werde ich es aufzeichnen.
Im Fall von Eve wird normalerweise API Root = Root festgelegt, sodass index.html beim Zugriff auf root nicht angezeigt werden kann. Deshalb,
settings.py
URL_PREFIX = 'api'
Sie können die API-Route ändern, indem Sie ein Präfix definieren.
Es gibt separate Einstellungen für Eve und Flask. Wenn Eve nicht angegeben ist, wird settings.py im selben Verzeichnis gelesen. Wenn Sie es separat lesen möchten
app=EVE(settings='hoge.py')
Wenn Sie schreiben, werde ich das lesen. Die Einstellungen akzeptieren jedoch nur Diktat und Datei.
Abgesehen von den von Eve verwendeten Einstellungen sollte das Schreiben in settings.py nicht funktionieren ... Die Kolbeneinstellungen müssen getrennt und in appFactory angegeben werden, z. B. create_app ().
app/__init__.py
def create_app(api_settings=None, flask_config='oss_app.config', package_name=__name__, flask_conf_override=None):
# Define the WSGI application object
if api_settings is not None:
app = Eve(settings=api_settings, import_name=__name__)
else:
app = Eve()
# Configurations
app.config.from_object(flask_config)
app.config.from_object(flask_conf_override)
static path Im Fall von Eve wird 404 zurückgegeben, wenn Sie / static ohne Einstellungen drücken. Der Grund ist flaskapp.py im Paket von eve
flaskapp.py
class Eve(Flask, Events):
Unterlassung
def __init__(self, import_name=__package__, settings='settings.py',
validator=Validator, data=Mongo, auth=None, redis=None,
url_converters=None, json_encoder=None,
media=GridFSMediaStorage, **kwargs):
Es ist geworden. Wenn Flask nach static_root_path sucht, sucht es nach import_name, wenn import_name vorhanden ist. Import_name = __ package__ = EVE, und das EVE-Verzeichnis in site-package wird als satticfile-Verzeichnis erkannt, und 404 wird zurückgegeben. Als Gegenmaßnahme setzen Sie beim Erstellen einer Eve-Instanz import_name = \ name.
app=Eve(import_name=__name__)
Im Fall von Eve wird Pymongo im Ausgangszustand verwendet, und wenn Sie ORM verwenden möchten, können Sie die Eve-Mongo-Engine verwenden. Wahrscheinlich, weil das Update für etwa ein Jahr angehalten wurde, wird es bei Verwendung als etag-Fehler in der Startsequenz gelöscht. Etag ist aus einer Version von Eve obligatorisch geworden, aber ich denke, es hat nicht aufgeholt. Darüber Die Etag-Definition kann um die 102. und 190. Zeile von eve-mongoengine \ __ init.py hinzugefügt werden.
eve-mongoengine\__init_.py
91:
def _parse_config(self):
# parse app config
config = self.app.config
try:
self.last_updated = config['LAST_UPDATED']
except KeyError:
self.last_updated = '_updated'
try:
self.date_created = config['DATE_CREATED']
except KeyError:
self.date_created = '_created'
+ try:
+ self.etag = config['ETAG']
+ except KeyError:
+ self.etag = '_etag'
def fix_model_class(self, model_cls):
Unterlassung
192:
date_field_cls = mongoengine.DateTimeField
+ string_field_cls = mongoengine.StringField
# field names have to be non-prefixed
last_updated_field_name = self.last_updated.lstrip('_')
+ date_created_field_name = self.date_created.lstrip('_')
etag__field_name = self.etag.lstrip('_')
new_fields = {
# TODO: updating last_updated field every time when saved
last_updated_field_name: date_field_cls(db_field=self.last_updated,
default=get_utc_time),
date_created_field_name: date_field_cls(db_field=self.date_created,
default=get_utc_time),
etag__field_name: string_field_cls(db_field=self.etag,
default=""),
}
Recommended Posts