In diesem Artikel geht es um das Erstellen einer RESTful-API mit Flask, einem kompakten Python-Framework.
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.
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.
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.
.
├── 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
setUp.sh
docker-compose build
docker-compose up -d
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
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)
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
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()
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)
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
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'})
offizielle Referenz der Flasche offizielle Referenz zu flask-sqlalchemy Flask – SQLAlchemy yoshiya0503 / Hermetica 04 View und RESTful API Einfach zu verwendende Flasche
Recommended Posts