[PYTHON] Versuchen Sie, mit MVC eine RESTful-API mit Flask 1.0.2 zu erstellen

In diesem Artikel geht es um das Erstellen einer RESTful-API mit Flask, einem kompakten Python-Framework.

Einführung

Es wurden bereits viele Artikel über RESTful-APIs mit Flask geschrieben, aber Flask hat sich in letzter Zeit auch erheblich weiterentwickelt, sodass es auf eine moderne Art und Weise beschrieben werden kann, die sich ein wenig von der Literatur vor zwei oder drei Jahren unterscheidet. Es ist geworden.

Selbst im technischen Test des Praktikums nimmt die Anzahl der Fälle zu, in denen Python als festgelegte Sprache übernommen wird, und ich hatte nicht genügend Programmierkenntnisse, um fließend Python anzuwenden. Deshalb habe ich mit Flask studiert, an dem ich mich schon lange interessiert hatte. Ich beschloss es zu sehen.

Es wurde auch festgestellt, dass die jüngste Mode von Flask eine Kombination aus einer Bibliothek namens Flask-SQL Alchemy, die durch Umschließen eines Python-ORM namens SQL Alchemy erstellt wurde, und einer Modellbeschreibung mit Active Record zu sein scheint. Ich werde es schaffen.

Warum Flasche?

Bevor ich zum Hauptthema komme, werde ich auch erklären, warum ich das Framework namens Flask gewählt habe.

Ich glaube, dass das größte Hindernis für das Erlernen eines Frameworks die Lernkosten sind. Insbesondere verfügt die Web-API über viele Funktionen, die unter den für Webanwendungen erforderlichen Funktionen wie Sitzungsverwaltung und Ansichtsgenerierung nicht verwendet werden.

Daher ist es sehr effektiv, keine unnötigen Lernkosten aufzuwenden, und persönlich verwendet das Thin Framework PHP Slim. In Python ist das Flask-Framework für sein dünnes Framework bekannt, daher habe ich mich diesmal für Flask entschieden.

Umgebung

Docker wird jedes Mal zum Erstellen der Umgebung verwendet.

Diesmal werden zwei Container verwendet, ein Python-Ausführungscontainer und ein MySQL-Container. Für MySQL ist kein spezielles Paket erforderlich. Verwenden Sie daher den MySQL-Container so wie er ist. Für den Python-Ausführungscontainer müssen Flask, SQLAlchemy und mysqlclient mit pip installiert werden.

Weitere Informationen finden Sie im Completed Repository, da nur die wichtigen Teile beschrieben werden.

Ausführungsumgebung

Endgültige Verzeichnisstruktur

.
├── Build
│   └── app
│       ├── Dockerfile
│       └── requirements.txt
├── DB
├── LICENSE
├── README.md
├── docker-compose.sample
├── docker-compose.yml
└── share
    ├── app.py
    ├── controllers
    │   ├── __init__.py
    │   ├── top_controller.py
    │   └── user_controller.py
    ├── db.py
    └── models
        ├── __init__.py
        └── user.py

Dockerfile Dockerfile wird wie folgt beschrieben Der Pfad lautet Build / app / Dockerfile Verschieben Sie diese Docker-Datei in das Verzeichnis / web, kopieren Sie die Datei require.txt in den Container und installieren Sie sie per Pip.

#Angeben des Basisbildes
FROM python:3.6.5

#Speichern Sie das Verzeichnis, in dem sich die Quelle befindet, als Variable
ARG project_dir=/web/

#Kopieren Sie die erforderlichen Dateien von lokal in den Container
ADD requirements.txt $project_dir

# requirements.Installieren Sie das in txt aufgeführte Paket
WORKDIR $project_dir
RUN pip install -r requirements.txt

Starten Sie den Docker-Container

setUp.sh


docker-compose build
docker-compose up -d

Implementierung

Nachdem die Umgebungskonstruktion abgeschlossen ist, implementieren Sie sie tatsächlich. Die Implementierung erfolgt nach dem folgenden Verfahren.

--Starten Sie den integrierten Server von Flask und setzen Sie db. --Erstellen Sie ein Modell --Erstellen Sie einen Controller

Über die grundlegenden Spezifikationen von Flask

Über den eingebauten Server

Um eine Anwendung mit Flask zu entwickeln, führen Sie die Ausführungsmethode des App-Objekts aus und starten Sie den integrierten Server. Der Kolben kann mindestens durch Schreiben der folgenden 7 Zeilen gestartet werden.

app.py


from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello, World!'

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=80, debug=True)

Über config

Sie können die Anwendungseinstellungen beschreiben, indem Sie dem Array app.config Werte hinzufügen. Stellen Sie diesmal die Datenbank und den Zeichencode ein. Die Datenbankeinstellungen sind in der Reihenfolge Benutzername, Kennwort, Hostname und Datenbankname.

app.py


app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://%s:%s@%s/%s?charset=utf8' % (
    "root",
    "BzHSGDBv2fya",
    "db",
    "database",
)
app.config['JSON_AS_ASCII'] = False

Informationen zu Datenbankeinstellungen

Flask-Da SQLAlchemy verwendet wird, erstellen Sie eine Instanz mit db.py. Erstellen Sie eine Datenbankinstanz, indem Sie die folgenden zwei Zeilen schreiben. Registrieren Sie danach die App-Instanz in db wie db.init_app (app) in app.py.

db.py


from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

Über das Routing

Das Standardrouting von Flask wird mithilfe eines Dekorators namens @ app.route ('/') implementiert. Dieses Routing beschränkt jedoch die Funktionen, die nach dem Dekorator aufgerufen werden können, auf globale Funktionen. Verwenden Sie also app.add_url_rule. Die folgenden zwei Programme funktionieren auf die gleiche Weise

app.py


@app.route('/')
def get():
    return 'Hello, World!'

app.py


class TopController(MethodView):
    def get(self):
        return 'Hello, World!'

app.add_url_rule('/',view_func=TopController.as_view('top_controller'))

Die endgültige app.py sieht folgendermaßen aus:

app.py


from flask import Flask
from db import db
from controllers.top_controller import TopController
from controllers.user_controller import UserController

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://%s:%s@%s/%s?charset=utf8' % (
    "root",
    "BzHSGDBv2fya",
    "db",
    "database",
)
app.config['JSON_AS_ASCII'] = False
app.secret_key = 'secret'

app.add_url_rule('/', view_func=TopController.as_view('top_controller'))
app.add_url_rule('/<int:id>', view_func=UserController.as_view('user_controller'))


if __name__ == '__main__':
    db.init_app(app)
    app.run(host="0.0.0.0", port=80, debug=True)

Modell erstellen

Da das Modell auch Flask-SQL Alchemy verwendet, erstellen Sie es mit der Datenbankinstanz. Der Unterschied zu SQLAlchemy besteht darin, dass Sie db voranstellen müssen, z. B. db.Column oder db.Model. Erstellen Sie außerdem eine sehr wichtige Methode, to_dict (). to_dict () ist eine Methode zum Wechseln zu einem Wörterbuchtyp, da das Modellobjekt beim Erstellen von json als API-Antwort nach dem Erwerb des Modells nicht behandelt werden kann.

Zeigen Sie das erstellte Benutzermodell an.

user.py


from db import db
from datetime import datetime


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)
    created_at = db.Column(db.DateTime, nullable=False, default=datetime.now)
    updated_at = db.Column(db.DateTime, nullable=False, default=datetime.now, onupdate=datetime.now)

    def to_dict(self):
        return {
            'id': self.id,
            'username': self.username,
            'email': self.email,
            'created_at': self.created_at.strftime('%Y-%m-%d %H:%M'),
            'updated_at': self.updated_at.strftime('%Y-%m-%d %H:%M'),
        }

    def __repr__(self):
        return '<User %r>' % self.username

[WIP] Erstellen eines Controllers

Erstellen Sie abschließend einen Controller. Ich habe am meisten darüber nachgedacht, den Controller zu erstellen, aber ich konnte keine gute Methode finden, so dass er vorerst in seiner aktuellen Form vorliegt. Ich denke, es gibt eine bessere Entwurfsmethode, daher würde ich sie gerne in Zukunft in Betracht ziehen.

TopController ist wie folgt. Der Punkt ist, dass es die Anforderungsverarbeitung für die Basis-URL beschreibt. Da userId nicht angegeben ist, gibt get alle Daten so zurück, wie sie sind. Erstellen Sie in der Post einen neuen Benutzer. Verwenden Sie jsonify, um den Wörterbuchtyp in json zu ändern. Führen Sie außerdem beim ersten Zugriff db.drop_all () und db.create_all () aus, um eine Tabelle zu erstellen.

top_controller.py


from flask import request
from models.user import User
from flask.json import jsonify
from flask.views import MethodView
from db import db


class TopController(MethodView):
    def get(self):
        """
Holen Sie sich alle Tabellendaten
        :return: json
        """
        # db.drop_all()
        # db.create_all()
        return jsonify({"data": [User.to_dict(user) for user in User.query.all()]})

    def post(self):
        """
Erstellen Sie einen neuen Benutzer
        :return: json
        """
        username = request.form['username']
        email = request.form['email']
        user = User(username=username, email=email)
        db.session.add(user)
        db.session.commit()
        return jsonify({'response': 'ok'})

Referenz

offizielle Referenz der Flasche offizielle Referenz zu flask-sqlalchemy Flask – SQLAlchemy yoshiya0503 / Hermetica 04 View und RESTful API Einfach zu verwendende Flasche

Recommended Posts

Versuchen Sie, mit MVC eine RESTful-API mit Flask 1.0.2 zu erstellen
So erstellen Sie einen LINE-Bot mit künstlicher Intelligenz mit der Flask + LINE Messaging-API
Versuchen Sie, Ihr eigenes AWS-SDK mit bash zu erstellen
Flask kann mit Azure API Apps nicht RESTful sein
Versuchen Sie, Blueprint with Flask zu verwenden, um Controller zu trennen
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
Versuchen Sie eine lockere OAuth-Authentifizierung mit einem Kolben (Slack API V2).
Versuchen Sie, mit Python eine Diedergruppe zu bilden
Versuchen Sie, Client-FTP mit Pythonista am schnellsten zu machen
Versuchen Sie, Tweets mithilfe der Twitter-API in großen Mengen zu löschen
Analysieren mit Google Colaboratory mithilfe der Kaggle-API
Versuchen Sie, den Boden durch Rekursion herauszufordern
Versuchen Sie, PythonTex mit Texpad zu verwenden.
Versuchen Sie es mit matplotlib mit PyCharm
Versuchen Sie es mit der Twitter-API
Machen Sie es mit der Syntax einfach
Versuchen Sie es mit der Twitter-API
Versuchen Sie es mit der PeeringDB 2.0-API
Versuchen Sie es mit Folium mit Anakonda
So erstellen Sie mit Flask einen BOT für Cisco Webex-Teams
Versuchen Sie es mit GUI, PyQt in Python
Die erste API, die mit dem Python Djnago REST-Framework erstellt wurde
Versuchen Sie, Lebensmittelfotos mithilfe der Google Cloud Vision-API zu beurteilen
Bildanalyse mit Objekterkennungs-API zum Ausprobieren in 1 Stunde
Versuchen Sie, eine lineare Regression mit Pytorch mit Google Colaboratory zu implementieren
Bis die von Flask + MySQL erstellte API in Docker konvertiert wird
Versuchen Sie es mit der Admin-API von Janus Gateway
Rubyist hat versucht, eine einfache API mit Python + Flasche + MySQL zu erstellen
Versuchen Sie, Facebook mit Python zu betreiben
Behalten Sie den Flask API-Server für immer bei
Versuchen Sie es mit der Pleasant-API (Python / FastAPI).
Versuchen Sie, sich mit ONNX Runtime zu profilieren
Versuchen Sie, Nagios mit pynag zu konfigurieren
Versuchen Sie, einen Web-Service-ähnlichen Typ mit 3D-Markup-Sprache zu erstellen
[Sakura-Mietserver] Versuchen Sie es mit einer Flasche.
Versuchen Sie, Statistiken mit e-Stat abzurufen
Versuchen Sie es mit der Aktions-API von Python argparse
Versuchen Sie, mit Python (1) eine Erfassungssoftware zu erstellen, die so genau wie möglich ist.
Ich habe versucht, eine ToDo-App mit einer Flasche mit Python zu erstellen
Wenn Sie ein Objekt mit Anforderungen mithilfe der Flasche senden möchten
Erstellen Sie eine API mit hug mit mod_wsgi
Versuchen Sie, Audio mit M5 STACK auszugeben
Versuchen Sie, Pythons networkx mit AtCoder zu verwenden
Versuchen Sie, einen Artikel von Qiita mit der REST-API [Umweltvorbereitung] zu erstellen.
Stellen Sie mit Flask SQL Alchemy eine Verbindung zu MySQL her
Der einfachste Weg, eine Flasche herzustellen
[TCP / IP] Versuchen Sie nach dem Studium, mit Python einen HTTP-Client zu erstellen
In Vim: Make, um HTML von Markdown mit Pandoc auszugeben
Es wurde ein Fehler behoben, der das einfache multifunktionale An- und Abmelden mit Python / Flask mithilfe von Auth0 ermöglichte
Python-Anfänger haben beschlossen, einen LINE-Bot mit Flask zu erstellen (Flask-Kommentar)
Versuchen Sie, mit Python (2) eine Erfassungssoftware zu erstellen, die so genau wie möglich ist.
Versuchen Sie, Foldl und Foldr mit Python: Lambda zu machen. Auch Zeitmessung
Ich habe versucht, "Sakurai-san" LINE BOT mit API Gateway + Lambda zu erstellen
Vorhersage von Effekten mit LSTM mithilfe von Keras + Tensorflow Teil 2 (Berechnung mit GPU)
Ich möchte eine Webanwendung mit React und Python Flask erstellen
Versuchen Sie, die Datenbank unter IBM i mit Python + JDBC mithilfe von JayDeBeApi zu starten
Versuchen Sie, Farbfilme mit Python zu reproduzieren