[PYTHON] Le point culminant de la construction de site normal REST + avec Flask, Eve

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.

Modifications de la racine de l'API REST

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.

Paramètres Flask et Eve

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__)

Utilisez le moteur Eve-mongo.

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

Le point culminant de la construction de site normal REST + avec Flask, Eve
Mémorandum de construction du site Flask
Exécutez l'application avec Flask + Heroku
Publication automatique du site Web de conception de site Gary avec python + sélénium (1) Construction d'environnement
Comprendre la commodité de Django Rest Framework
Alignez la taille de la barre de couleurs avec matplotlib
La structure des dossiers de Flask est résumée
Vérifier l'existence du fichier avec python
La troisième nuit de la boucle avec pour
À propos de l'équation normale de la régression linéaire
La deuxième nuit de la boucle avec pour
Téléchargez le fichier avec PHP [En construction]
Compter le nombre de caractères avec écho