L'une des variantes de Flask est Eve, qui facilite la création de services REST. Tant que vous concevez le schéma, il déploiera l'API REST sur SiteRoot, mais cela ressemble à Django + REST Framework + angular, et quand j'ai essayé de le construire, il est devenu plutôt bon, donc je vais en garder une trace.
Dans le cas d'Eve, API Root = Root est généralement défini, donc index.html ne peut pas être affiché lors de l'accès à root. Donc,
settings.py
URL_PREFIX = 'api'
Vous pouvez modifier l'itinéraire de l'API en définissant un préfixe.
Il existe des paramètres distincts pour Eve et Flask. Si Eve n'est pas spécifié, il lira settings.py dans le même répertoire. Si vous souhaitez le lire séparément
app=EVE(settings='hoge.py')
Si vous écrivez, j'irai lire cela. Cependant, les paramètres n'acceptent que dict et fichier.
À part les paramètres utilisés par Eve, l'écriture dans settings.py ne devrait pas fonctionner ... Les paramètres du flacon doivent être séparés et donnés dans appFactory comme 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 Dans le cas d'Eve, si vous appuyez sur / statique sans paramètres, 404 sera renvoyé. La raison est flaskapp.py dans le package d'eve
flaskapp.py
class Eve(Flask, Events):
Omission
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):
Il est devenu. Lorsque Flask recherche static_root_path, il recherche import_name s'il y a import_name, donc import_name = __ package__ = EVE, le répertoire EVE dans site-package est reconnu comme le répertoire de satticfile et 404 est renvoyé. En guise de contre-mesure, définissez import_name = \ name lors de la création d'une instance Eve.
app=Eve(import_name=__name__)
Dans le cas d'Eve, pymongo est utilisé dans l'état initial, et si vous souhaitez utiliser ORM, vous pouvez utiliser le moteur Eve-mongo. Cependant, probablement parce que la mise à jour est arrêtée depuis environ un an, si vous l'utilisez, elle tombera en tant qu'erreur etag dans la séquence de démarrage. Etag est devenu obligatoire à partir d'une version d'Eve, mais je pense qu'il n'a pas rattrapé. À propos de ça Une définition Etag peut être ajoutée autour des 102e et 190e lignes de eve-mongoengine \ __ init.py.
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):
Omission
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