all
Business
data science
design
development
our journey
Strategy Pattern
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.

Du erstellst eine Flask-API mit Python: Die komplette Anleitung

Laptop screen showing lines of code

Flasche ist ein leichtes Python-Webframework, das häufig zum Erstellen von REST-APIs und Microservices verwendet wird. Sein minimaler Kern und seine flexible Architektur ermöglichen es Entwicklern, APIs zu entwerfen, ohne durch strenge Projektstrukturen eingeschränkt zu sein.

In diesem Handbuch erstellen Sie eine einfache REST-API mit Flask, einschließlich:

  • CRUD-Endpunkte
  • eine SQLite-Datenbank mit SQLAlchemy
  • Anforderungsvalidierung und Fehlerbehandlung
  • OpenAPI-Dokumentation
  • eine modulare Projektstruktur

Am Ende dieses Tutorials werden Sie verstehen, wie Sie eine produktionsbereite Flask-API entwerfen und strukturieren.

blue arrow to the left
Imaginary Cloud logo

Was ist Flask und warum sollte es zum Erstellen von APIs verwendet werden?

Flask ist ein leichtes Python-Webframework, das zum Erstellen von APIs und Webanwendungen verwendet wird, indem HTTP-Routen definiert werden, die JSON- oder HTML-Antworten zurückgeben.

Ein Framework ist eine Bibliothek, die von Entwicklern verwendet wird, um zuverlässige und skalierbare Webanwendungen zu erstellen und zu verwalten. Es gibt mehrere Rahmenbedingungen verfügbar für Python, wie Tornado, Pyramid und natürlich Django (was oft mit Flask verglichen wird).

Flask ist ein Python-Mikroframework für Web-Entwicklung. Obwohl Flask mit einem kleinen Kern gebaut wurde und als sehr leichtes Web Server Gateway Interface (WSGI) gilt, zeichnet es sich durch seine einfach zu erweiterende Philosophie aus. Es wurde für die Skalierung auf komplexe Anwendungen entwickelt und unterstützt einen einfachen und schnellen Start.

Ein weiterer großer Vorteil von Flask ist seine Funktionalität. Obwohl es Vorschläge anbietet, benötigt Flask nicht zwingend Projektlayouts oder andere Abhängigkeiten. Stattdessen ermöglicht es Entwicklern, die Bibliotheken und Tools auszuwählen, die sie verwenden möchten, und bietet zusätzlich verschiedene Verlängerungen verfügbar, die von der Community bereitgestellt werden.

blue arrow to the left
Imaginary Cloud logo

Was ist eine REST-API und wie funktioniert sie?

API ist ein Akronym für Application Programming Interface, was bedeutet, dass es im Grunde wie Sie mit einer Anwendung kommunizieren. Eine REST-API (Representational State Transfer) ermöglicht die Kommunikation zwischen Systemen mithilfe von HTTP-Standardmethoden und entspricht einer architektonischer Stil das auf zustandslose Kommunikation abzielt und Client- und Serveranliegen voneinander trennt. Es tauscht in der Regel Daten im JSON-Format aus und arbeitet mit Endpunkten, die Aktionen wie Create (POST), Read (GET), Update (PUT oder PATCH) und Delete (DELETE) entsprechen. REST-APIs werden aufgrund ihrer Einfachheit, Skalierbarkeit und Kompatibilität mit einer Vielzahl von Clients und Plattformen häufig verwendet.

Das REST-API In dieser Übung wird eine gefälschte Implementierung von erstellt CRUD-Aktionen über eine Entität. Eine API mit CRUD ermöglicht die Operationen Erstellen, Lesen, Aktualisieren und Löschen über die Elemente der Anwendung.

How to make a REST API using Python Flask?

This article will guide you through the first steps to create a REST API using Flask.

What You Will Build

In this tutorial, you will build a simple REST API using Flask and Python that includes:

  • a SQLite database connected through SQLAlchemy
  • CRUD endpoints for managing items
  • request validation and error handling
  • automatic API documentation using OpenAPI
  • a modular project structure for maintainability

This example demonstrates the key components needed to create a production-ready backend API.

Technical requirements

You must have Python installed on the current machine. The code presented will consider Python3. If you want to use Python2 and/or are following this procedure in a Windows machine, please follow the instructions presented in the Flask installation guide.

Let’s start by creating a directory to store the project. In the directory you want to have your project, run the following commands on the shell:

We’ve created the flask_demo directory and moved it inside. Before starting to install dependencies, let’s create a virtual environment by running the following command:

This will create a folder into your project with the name .venv. After that, we need to activate the respective environment by running:

This means we are now considering the venv virtual environment when running any Python code. It might be important to specify the environment you are considering when running it in your IDE.

Make sure you have the environment active before following the next steps. You can check if you are inside the environment by looking to the left side of the console. If there’s the virtual environment name inside parentheses, you’re good to go.

If you want to deactivate the environment, just run the following command:

Screenshot of Flask - venv virtual command environment.

API Development Workflow

A typical Flask API development workflow includes:

  1. Setting up the Flask application.
  2. Defining API routes and endpoints.
  3. Connecting the application to a database.
  4. Implementing CRUD operations.
  5. Validating requests and handling errors.
  6. Documenting the API using OpenAPI tools.

This structure helps keep backend services organised and easier to maintain.

Build a Flask API with a Real Database

In the previous example, the API stored data in a Python list. While this is useful for demonstrating CRUD endpoints, it is not suitable for real applications because the data disappears whenever the server restarts.

In practice, APIs store data in a database so it persists between requests and application restarts. In this section, we will use SQLite and SQLAlchemy to build a simple database-backed API.

SQLite is a lightweight database that requires no separate server, making it ideal for tutorials and small applications.

Install SQLAlchemy and Flask-SQLAlchemy

First, install the required dependencies.

Run the following command:

pip install sqlalchemy flask-sqlalchemy

If you are managing dependencies with a requirements.txt file, add:

Flask
sqlalchemy
flask-sqlalchemy

In this setup:

  • SQLAlchemy is the Object Relational Mapper (ORM) used to interact with the database.
  • Flask-SQLAlchemy simplifies the integration between Flask and SQLAlchemy.

Configure the Database

Next, configure Flask to connect to the SQLite database.

from flask import Flask, request, jsonify
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///items.db"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False

db = SQLAlchemy(app)

Here we define the database connection string:

sqlite:///items.db

This creates a local SQLite database file named items.db in the project directory.

Define the Database Model

Next, create a model representing the structure of the database table.

class Item(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), nullable=False)
    price = db.Column(db.Float, nullable=False)

    def to_dict(self):
        return {
            "id": self.id,
            "name": self.name,
            "price": self.price
        }

The Item model defines three fields:

  • id – unique identifier for each item
  • name – the name of the item
  • price – the price of the item

The to_dict() method converts the database object into a JSON-serialisable dictionary.

Create the Database Table

Before running the API, create the database tables using SQLAlchemy.

@app.route("/items", methods=["GET"])
def get_items():
    items = Item.query.all()
    return jsonify([item.to_dict() for item in items])

This endpoint retrieves all items stored in the database.

Create a New Item

@app.route("/items", methods=["POST"])
def create_item():
    data = request.get_json()

    if not data or "name" not in data or "price" not in data:
        return jsonify({"error": "Name and price are required"}), 400

    item = Item(name=data["name"], price=data["price"])
    db.session.add(item)
    db.session.commit()

    return jsonify(item.to_dict()), 201

This endpoint:

  1. reads the JSON request body
  2. validates the input
  3. creates a new database record
  4. returns the created item

Get a Single Item

@app.route("/items/<int:item_id>", methods=["GET"])
def get_item(item_id):
    item = Item.query.get_or_404(item_id)
    return jsonify(item.to_dict())

This endpoint retrieves a specific item by its ID.

If the item does not exist, Flask automatically returns a 404 error.

Update an Item

@app.route("/items/<int:item_id>", methods=["PUT"])
def update_item(item_id):
    item = Item.query.get_or_404(item_id)
    data = request.get_json()

    if not data:
        return jsonify({"error": "Request body is required"}), 400

    item.name = data.get("name", item.name)
    item.price = data.get("price", item.price)

    db.session.commit()

    return jsonify(item.to_dict())

This endpoint updates an existing item.

Only the provided fields are modified.

Delete an Item

@app.route("/items/<int:item_id>", methods=["DELETE"])
def delete_item(item_id):
    item = Item.query.get_or_404(item_id)

    db.session.delete(item)
    db.session.commit()

    return jsonify({"message": "Item deleted successfully"})

This endpoint removes the specified item from the database.

Run the Application

Start the Flask development server:

python app.py

Your API will now be available locally.

Example Request and Response

Create a New Item

Request:

{
  "name": "Keyboard",
  "price": 49.99
}

Response:

{
  "id": 1,
  "name": "Keyboard",
  "price": 49.99
}

Retrieve All Items

Response:

[
  {
    "id": 1,
    "name": "Keyboard",
    "price": 49.99
  }
]

Why Use a Database Instead of an In-Memory List?

In-memory lists are useful for simple demonstrations but have several limitations:

  • data is lost when the application restarts
  • multiple application instances cannot share data
  • data cannot be queried efficiently

Using a database such as SQLite allows the API to store and retrieve persistent data, making the application behave more like a real backend service.

For production systems, developers typically use databases such as PostgreSQL, MySQL, or MongoDB, but the overall API structure remains the same.

Beginner Structure: A Simple Flask API Project

For small applications or tutorials, it is common to keep the entire API in just a few files. This approach keeps the setup straightforward and easy to understand.

A typical beginner Flask API structure might look like this:

flask-api/
├── app.py
├── requirements.txt
├── models.py
├── routes.py
├── schemas.py
└── items.db

In this structure:

  • app.py creates the Flask application and configures extensions.
  • models.py defines the database models using SQLAlchemy.
  • routes.py contains the API endpoints.
  • requirements.txt lists project dependencies.
  • items.db is the SQLite database used for development.

This layout is easy to follow and works well for small APIs, prototypes, and learning projects.

However, as the application grows, this structure can become difficult to maintain.

Example: What Each File Contains

To make the structure easier to understand, here is how each file might be used.

app.py

This file creates the Flask application, configures the database, and registers the routes.

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_smorest import Api

db = SQLAlchemy()

def create_app():
    app = Flask(__name__)

    app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///items.db"
    app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
    app.config["API_TITLE"] = "Flask API Demo"
    app.config["API_VERSION"] = "v1"
    app.config["OPENAPI_VERSION"] = "3.0.3"
    app.config["OPENAPI_URL_PREFIX"] = "/"
    app.config["OPENAPI_SWAGGER_UI_PATH"] = "/docs"
    app.config["OPENAPI_SWAGGER_UI_URL"] = "https://cdn.jsdelivr.net/npm/swagger-ui-dist/"

    db.init_app(app)
    api = Api(app)

    from routes import blp
    api.register_blueprint(blp)

    with app.app_context():
        db.create_all()

    return app

app = create_app()

if __name__ == "__main__":
    app.run(debug=True)

models.py

This file defines the database model.

from app import db

class Item(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), nullable=False)
    price = db.Column(db.Float, nullable=False)

routes.py

This file contains the API endpoints.

from flask.views import MethodView
from flask_smorest import Blueprint
from models import Item
from schemas import ItemSchema
from app import db

blp = Blueprint(
    "items",
    "items",
    url_prefix="/items",
    description="Operations on items"
)

@blp.route("/")
class ItemsResource(MethodView):

    @blp.response(200, ItemSchema(many=True))
    def get(self):
        return Item.query.all()

    @blp.arguments(ItemSchema)
    @blp.response(201, ItemSchema)
    def post(self, new_item):
        item = Item(**new_item)
        db.session.add(item)
        db.session.commit()
        return item

Why This Structure Is Better

Separating the application into files provides several benefits:

  • it keeps responsibilities clear
  • it makes the code easier to maintain
  • it supports future growth
  • it reduces clutter in the main application file

For example, if you later add authentication, users, or orders, you can expand the structure without rewriting the whole project.

Production Structure: A Modular Flask API Architecture

Larger applications benefit from organising the code into packages. This separates different parts of the system, making the project easier to scale and maintain.

A more production-ready Flask API structure might look like this:

For larger projects, it is common to organise the code into folders rather than individual top-level files.

A more scalable structure might look like this:

flask-api/
├── app/
│   ├── __init__.py
│   ├── models/
│   │   └── item.py
│   ├── routes/
│   │   └── items.py
│   └── schemas/
│       └── item.py
├── requirements.txt
└── run.py

In this architecture:

  • The app package contains the main application logic.
  • models/ defines database models.
  • routes/ contains API endpoints grouped by resource.
  • schemas/ defines request and response validation using Marshmallow.
  • run.py starts the Flask application.

This modular approach makes it easier to:

  • manage large codebases
  • organise endpoints by resource
  • add new features such as authentication or background jobs
  • collaborate with other developers

Best Practice

When building a Flask API, it is a good idea to start with a simple structure and expand it only when the application grows. For small projects, a few clearly named files are often enough. For larger APIs, moving to a package-based layout makes maintenance much easier.

A clean project structure helps other developers understand the code quickly and makes the application easier to extend in the future.

Blueprints

Before we present other Flask strengths, let’s talk about blueprints. A blueprint is an object very similar to a Flask application object, but instead of creating a new one, it allows the extension of the current application. This might be useful if you want to create multiple versions of an API or simply divide services within the same application.

We will use this class type to present different use case scenarios of a Flask application. Let’s convert the code above to be inserted into a blueprint and loaded into the main application.

Create a new folder named blueprints to start inserting blueprint modules as we progress in the blog post. Inside it, create a folder named basic_endpoints and then a file named __init__.py:

# blueprints/basic_endpoints/__init__.py
from flask import Blueprint, jsonify

basic_bp = Blueprint('basic_bp', __name__)

@basic_bp.route('/')
def hello():
    return jsonify({'message': 'Hello from a Blueprint!'})

Now the main.py file just needs to load the created blueprint and register it to the application object:

# main.py
from flask import Flask
from blueprints.basic_endpoints import basic_bp

app = Flask(__name__)
app.register_blueprint(basic_bp)

if __name__ == '__main__':
    app.run(debug=True)

Now you should have exactly the same endpoints but using the structure provided by Blueprints. This will make your application easier to manage and scale as it grows.

Digital Transformation Service CTA

Add Request Validation and Error Handling

When building APIs, it is important to validate incoming requests and return meaningful error responses when something goes wrong. Without validation, an API might accept incomplete or invalid data, which can lead to inconsistent records in the database or unexpected application behaviour.

A well-designed API should:

  • validate incoming request data
  • return clear error messages
  • use appropriate HTTP status codes

This improves reliability and makes the API easier for other developers to use.

Validate Incoming Request Data

When a client sends data to the API, the server should verify that the required fields are present and correctly formatted.

For example, when creating a new item, the request should include both a name and a price.

Here is a simple validation example:

@app.route("/items", methods=["POST"])
def create_item():
    data = request.get_json()

    if not data:
        return jsonify({"error": "Request body must be JSON"}), 400

    if "name" not in data or "price" not in data:
        return jsonify({"error": "Both 'name' and 'price' fields are required"}), 400

    item = Item(name=data["name"], price=data["price"])

    db.session.add(item)
    db.session.commit()

    return jsonify(item.to_dict()), 201

In diesem Beispiel prüft die API, ob:

  • der Anfragetext enthält JSON
  • die erforderlichen Felder sind vorhanden

Wenn die Validierung fehlschlägt, gibt die API eine 400 Schlechte Anfrage Antwort.

Verwenden Sie aussagekräftige HTTP-Statuscodes

Mithilfe von HTTP-Statuscodes können Kunden nachvollziehen, ob eine Anfrage erfolgreich war oder fehlgeschlagen ist.

Zu den gängigen Codes, die in REST-APIs verwendet werden, gehören:

Status Code Meaning
200 OK The request was successful
201 Created A resource was successfully created
400 Bad Request The request is invalid
404 Not Found The requested resource does not exist
500 Internal Server Error Something unexpected went wrong

Die Verwendung des richtigen Statuscodes hilft API-Nutzern, Antworten richtig zu verarbeiten.

Umgang mit fehlenden Ressourcen

Wenn ein Client eine Ressource anfordert, die nicht existiert, sollte die API eine zurückgeben 404-Fehler.

Flask-SQLAlchemy bietet dafür einen praktischen Helfer:

item = Item.query.get_or_404(item_id)

Wenn der Artikel nicht existiert, gibt Flask automatisch eine Antwort wie folgt zurück:

{
  "message": "404 Not Found: The requested URL was not found on the server."
}

Dadurch wird verhindert, dass die API leere oder irreführende Antworten zurückgibt.

Einen globalen Error-Handler hinzufügen

In größeren Anwendungen ist es nützlich, globale Fehlerhandler zu definieren, die konsistente Antworten auf häufig auftretende Fehler zurückgeben.

Zum Beispiel:

@app.errorhandler(400)
def bad_request(error):
    return jsonify({
        "error": "Bad Request",
        "message": "The server could not process the request."
    }), 400


@app.errorhandler(404)
def not_found(error):
    return jsonify({
        "error": "Not Found",
        "message": "The requested resource was not found."
    }), 404

Mit diesen Handlern gibt die API immer strukturierte JSON-Antworten anstelle von Standard-HTML-Fehlerseiten zurück.

Beispiel für eine Fehlerantwort

Wenn ein Kunde versucht, ein Element zu erstellen, ohne die erforderlichen Felder anzugeben, gibt die API möglicherweise Folgendes zurück:

{
  "error": "Bad Request",
  "message": "Both 'name' and 'price' fields are required"
}

Die Bereitstellung klarer Fehlermeldungen hilft Entwicklern, schnell zu verstehen, was schief gelaufen ist und wie sie ihre Anfrage beheben können.

Warum Validierung und Fehlerbehandlung wichtig sind

Die Validierung von Anfragen und die richtige Fehlerbehandlung sind für die Erstellung zuverlässiger APIs unerlässlich. Sie stellen sicher, dass:

  • ungültige Daten gelangen nicht in die Datenbank
  • API-Antworten sind vorhersehbar
  • Entwickler, die in die API integrieren, können Probleme schnell diagnostizieren

Diese Praktiken gelten in der modernen API-Entwicklung als Standard und sollten in jedem produktionsbereiten Backend-Service enthalten sein.

blue arrow to the left
Imaginary Cloud logo

So generieren Sie OpenAPI-Dokumentation für eine Flask-API

Moderne APIs sollten maschinenlesbare Dokumentation bereitstellen, damit Entwickler Endpunkte, Anforderungsformate und Antworten leicht verstehen können. Der am weitesten verbreitete Standard hierfür ist API öffnen, das HTTP-APIs in einem strukturierten Format beschreibt, das Tools automatisch interpretieren können.

In Flask-Anwendungen besteht eine bequeme Möglichkeit, OpenAPI-Dokumentation zu generieren, darin, Flasche, am leichtesten, eine Bibliothek, die Flask mit OpenAPI 3, Anforderungsvalidierung und automatische Swagger-UI-Dokumentation integriert.

Installieren Sie Flask-Smorest und Marshmallow

Installieren Sie zunächst die erforderlichen Pakete.

Führen Sie den folgenden Befehl aus:

pip install flask-smorest marshmallow

Wenn Sie Abhängigkeiten lieber mit einem verwalten möchten requirements.txt Datei, du kannst Folgendes hinzufügen:

Flask
flask-smorest
marshmallow


In diesem Setup:

  • Flasche, am leichtesten generiert die OpenAPI-Dokumentation und verwaltet das API-Routing.
  • Marshmallow kümmert sich um die Validierung von Anfragen und die Serialisierung der Antworten.

Zusammen ermöglichen diese Bibliotheken den Flask-APIs, automatisch interaktive Dokumentationen zu erstellen und die Datenvalidierung durchzusetzen.

Flask für OpenAPI-Dokumentation konfigurieren

Vor dem Erstellen von Endpunkten muss die Flask-Anwendung so konfiguriert werden, dass sie OpenAPI-Dokumentation generiert.

Fügen Sie Ihrer Flask-Anwendung die folgende Konfiguration hinzu:

from flask import Flask
from flask_smorest import Api

app = Flask(__name__)

app.config["API_TITLE"] = "Flask API Demo"
app.config["API_VERSION"] = "v1"
app.config["OPENAPI_VERSION"] = "3.0.3"
app.config["OPENAPI_URL_PREFIX"] = "/"
app.config["OPENAPI_SWAGGER_UI_PATH"] = "/docs"
app.config["OPENAPI_SWAGGER_UI_URL"] = "https://cdn.jsdelivr.net/npm/swagger-ui-dist/"

api = Api(app)

Diese Konfiguration definiert die Metadaten, die zum Generieren der API-Dokumentation verwendet werden.

Zu den wichtigsten Einstellungen gehören:

  • API_TITLE — der Name Ihrer API.
  • API-VERSION — die aktuelle API-Version.
  • API-VERSION ÖFFNEN — die OpenAPI-Spezifikationsversion, die zur Beschreibung der API verwendet wird.
  • OPENAPI_SWAGGER_UI_PATH — die URL, unter der die interaktive Dokumentation verfügbar sein wird.

Sobald die API läuft, ist die Dokumentation unter folgender Adresse zugänglich:

http://localhost:5000/docs

Definieren Sie Anfrage- und Antwortschemas

APIs sollten die Struktur der Daten, die sie akzeptieren und zurückgeben, klar definieren.
Bei flask-smorest erfolgt dies mit Marshmallow-Schemas.

Erstellen Sie ein Schema, um ein Element in der API zu beschreiben:

from marshmallow import Schema, fields

class ItemSchema(Schema):
    name = fields.String(required=True)
    price = fields.Float(required=True)


Schemas dienen mehreren wichtigen Zwecken:

  • Validierung eingehender Anforderungsdaten
  • Dokumentieren des erwarteten Datenformats
  • Serialisieren von Antworten
  • Generierung einer genauen OpenAPI-Dokumentation

Durch die Verwendung von Schemas wird sichergestellt, dass sich API-Endpunkte konsistent verhalten und ungültige Daten zurückweisen.

Dokumentierte API-Endpunkte erstellen

Erstellen Sie als Nächstes API-Endpunkte mit einem Blaupause. Mithilfe von Blueprints können Sie verwandte Routen gruppieren und größere APIs organisieren.

from flask.views import MethodView
from flask_smorest import Blueprint

blp = Blueprint(
    "items",
    "items",
    url_prefix="/items",
    description="Operations on items"
)

items = []


Jeder Blueprint stellt eine Gruppe verwandter Endpunkte dar, die als Abschnitt in der generierten Dokumentation erscheinen.

Implementieren Sie CRUD-Endpunkte mit Validierung und Dokumentation

Jetzt können wir Endpunkte zum Erstellen und Abrufen von Elementen implementieren.

@blp.route("/")
class ItemsResource(MethodView):

    @blp.response(200, ItemSchema(many=True))
    def get(self):
        """Return all items"""
        return items

    @blp.arguments(ItemSchema)
    @blp.response(201, ItemSchema)
    def post(self, new_item):
        """Create a new item"""
        items.append(new_item)
        return new_item


In diesem Beispiel:

  • @blp .arguments (ItemSchema) validiert den Text der eingehenden Anfrage.
  • @blp .antwort () dokumentiert die API-Antwort und serialisiert die Ausgabe.
  • MethodenAnsicht ermöglicht das Gruppieren mehrerer HTTP-Methoden unter derselben Route.

Diese Dekoratoren aktualisieren automatisch die generierte OpenAPI-Dokumentation.

Den Blueprint registrieren

Nachdem Sie die Endpunkte definiert haben, registrieren Sie den Blueprint bei der API-Instanz:

api.register_blueprint(blp)

if __name__ == "__main__":
    app.run(debug=True)


Durch die Registrierung des Blueprints werden die Endpunkte aktiviert und sichergestellt, dass sie in der API-Dokumentation erscheinen.

Sehen Sie sich die interaktive API-Dokumentation an

Sobald die Anwendung ausgeführt wird, öffnen Sie die folgende URL in Ihrem Browser:

http://localhost:5000/docs

Sie werden ein interaktives sehen Swagger UI-Oberfläche generiert aus der OpenAPI-Spezifikation.

Von dieser Schnittstelle aus können Sie:

  • alle API-Endpunkte anzeigen
  • Überprüfen Sie die Anforderungsparameter
  • Testen Sie Endpunkte direkt aus dem Browser
  • Erkunden Sie Anfrage- und Antwortschemas

Dies macht die API verständlicher und vereinfacht die Integration mit anderen Systemen erheblich.

Warum OpenAPI-Dokumentation wichtig ist

Die Verwendung von OpenAPI-basierten Dokumentationstools wie flask-smorest bietet mehrere Vorteile:

  • Automatische Generierung der Dokumentation
  • Integrierte Anforderungsvalidierung
  • Klare API-Struktur für Entwickler
  • Kompatibilität mit Test- und Client-Generierungstools

Da OpenAPI in der gesamten Branche weit verbreitet ist, können viele Entwicklungstools automatisch Clientbibliotheken generieren, API-Tests durchführen und Anfragen mit derselben Spezifikation validieren.

Aus diesen Gründen ist die OpenAPI-Dokumentation zu einer Standardpraxis beim Erstellen moderner APIs geworden.

Bereitstellung einer Flask-API

Sobald Ihre Flask-API bereit ist, besteht der nächste Schritt darin, sie bereitzustellen, damit Benutzer oder andere Dienste darauf zugreifen können. Während der integrierte Flask-Server für die Entwicklung nützlich ist, erfordern Produktionsbereitstellungen eine WSGI-Server und ein Webserver um den Verkehr zuverlässig abzuwickeln.

Ein übliches Bereitstellungs-Setup umfasst:

  • Gunicorn oder UWSGI als WSGI-Server
  • Nginx als Reverse-Proxy
  • ein Cloud-Server oder eine Container-Plattform wie AWS, Azure oder Google Cloud

Sie können beispielsweise eine Flask-Anwendung in der Produktion mit Gunicorn ausführen:

gunicorn -w 4 app:app

In diesem Befehl:

  • -w 4 startet vier Arbeitsprozesse
  • App: App verweist auf das Flask-Anwendungsobjekt

In modernen Umgebungen werden Flask-APIs häufig mithilfe von Docker-Container, was die Skalierung, das Umgebungsmanagement und die kontinuierliche Bereitstellung vereinfacht.

Absichern einer Flask-API mit Authentifizierung

Die meisten Produktions-APIs erfordern eine Authentifizierung, um sicherzustellen, dass nur autorisierte Benutzer oder Dienste auf geschützte Endpunkte zugreifen können.

Zu den gängigen Authentifizierungsansätzen gehören:

  • API-Schlüssel für einfachen Zugriff von Service zu Service
  • JWT (JSON-Web-Tokens) zur Benutzerauthentifizierung
  • OAuth 2.0 für Integrationen von Drittanbietern

Ein üblicher Ansatz in Flask-APIs ist die Verwendung der JWT-basierten Authentifizierung. In diesem Modell:

  1. Ein Benutzer meldet sich mit Anmeldeinformationen an.
  2. Der Server generiert ein signiertes Token.
  3. Der Client sendet das Token in der Autorisierung Header bei jeder Anfrage.

Beispiel für einen Header:

Genehmigung: Inhaber <access_token>

Flaschenerweiterungen wie Flask-JWT-erweitert erleichtern die Implementierung einer tokenbasierten Authentifizierung und schützen API-Routen.

Das Hinzufügen einer Authentifizierung stellt sicher, dass:

  • nur autorisierte Kunden können auf die API zugreifen
  • sensible Daten sind geschützt
  • Die API-Nutzung kann überwacht und gesteuert werden.

blue arrow to the left
Imaginary Cloud logo

Fazit

Trotz seiner Einfachheit ist Flask ein extrem leistungsfähiges Python-Webframework. Es ist viel einfacher und unkomplizierter als die Erstellung kompletter serverseitiger Anwendungen. Außerdem kann es Ihnen so viel Zeit sparen!

Hoffentlich haben Sie am Ende dieses Artikels keine Probleme, eine REST-API mit Flask zu erstellen und automatisch eine Swagger-Dokumentationsseite zu generieren. Darüber hinaus sollten Sie vertraut sein mit bestimmten Funktionen (wie Blueprint-Objekten) und der Einrichtung von Jinja-Vorlagen.

blue arrow to the left
Imaginary Cloud logo

Wichtige Erkenntnisse: APIs mit Flask erstellen

Flask bleibt eine leistungsstarke und flexible Wahl für die Erstellung von Python-APIs. Aufgrund seines leichten Designs, seiner modularen Architektur und seines umfangreichen Ökosystems eignet es sich für alles, von einfachen Diensten bis hin zu skalierbaren Backend-Systemen. In diesem Handbuch haben wir Schritt für Schritt untersucht, wie eine Flask-API erstellt wird, einschließlich Projekteinrichtung, Datenbankintegration, Anforderungsvalidierung, Fehlerbehandlung und OpenAPI-Dokumentation. Dies sind alles wichtige Methoden, die zur Erstellung wartbarer und produktionsbereiter APIs beitragen.

Wenn Sie eine neue API planen oder ein vorhandenes Backend modernisieren, kann die frühzeitige Auswahl der richtigen Architektur einen erheblichen Unterschied ausmachen. Benötigen Sie Hilfe beim Erstellen oder Skalieren einer Flask-API? Kontaktieren Sie Imaginary Cloud um Ihr Projekt zu besprechen.

blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo
blue arrow to the left
Imaginary Cloud logo

Häufig gestellte Fragen

Was ist eine Flask-API?

Eine Flask-API bezieht sich auf einen RESTful-Webdienst, der mit dem Flask-Framework in Python erstellt wurde. Es stellt Endpunkte bereit, mit denen Clients über HTTP interagieren können, und gibt normalerweise Daten im JSON-Format zurück.

Ist Flask eine Backend-API?

Ja, Flask kann als Backend-Framework verwendet werden, um APIs zu erstellen, die Daten für Frontend-Anwendungen oder Dienste von Drittanbietern bereitstellen.

Was ist der Unterschied zwischen Flask und REST?

Flask ist ein Web-Framework, während REST ein Architekturstil für das Entwerfen von Netzwerkanwendungen ist. Sie können Flask verwenden, um REST-APIs zu implementieren.

Ist Python Flask gut für API?

Ja, Flask ist aufgrund seiner Einfachheit, Flexibilität und einer Vielzahl von Erweiterungen, die Dokumentation, Authentifizierung und Bereitstellung unterstützen, eine hervorragende Wahl für die Erstellung von APIs.

Was sind einige häufige Anwendungsfälle für Flask?

Flask wird häufig zum Erstellen von REST-APIs, Microservices, Admin-Dashboards, Prototyping-Anwendungen und zur Integration in Modelle für maschinelles Lernen verwendet.

Kann Flask in der Produktion verwendet werden?

Ja Der Kolben kann in der Produktion verwendet werden und unterstützt viele reale Webanwendungen und APIs. Während der integrierte Flask-Entwicklungsserver nur für die Entwicklung vorgesehen ist, verwenden Produktionsbereitstellungen in der Regel einen WSGI-Server wie Gunicorn oder uWSGI hinter einem Webserver wie Nginx oder Apache.

Bei richtiger Konfiguration können Flask-Anwendungen effektiv skaliert werden und Produktionsworkloads unterstützen, insbesondere in Kombination mit Tools wie Docker, Reverse-Proxys und Datenbankdienste.

Wie stellt man eine Flask-API bereit?

Eine Flask-API wird normalerweise mit einem bereitgestellt WSGI-Server und ein Reverse-Proxy.

Zu den grundlegenden Bereitstellungsschritten gehören:

  1. Verpacken Sie die Flask-Anwendung und installieren Sie Abhängigkeiten.
  2. Führen Sie die Anwendung mit einem WSGI-Produktionsserver aus, z. B. Gunicorn.
  3. Konfigurieren Sie einen Reverse-Proxy wie Nginx um den eingehenden Verkehr abzuwickeln.
  4. Stellen Sie die Anwendung auf einer Hosting-Plattform, einem Cloud-Server oder einer Container-Umgebung bereit.

Ein üblicher Bereitstellungsbefehl mit Gunicorn lautet beispielsweise:

gunicorn -w 4 app: app

In einer modernen Infrastruktur werden Flask-APIs häufig mithilfe von Docker-Container und Cloud-Plattformen wie AWS, Azure oder Google Cloud.

Was ist der Unterschied zwischen Flask und Django REST?

Der Hauptunterschied zwischen Flask und Django REST Framework (DRF) ist die Ebene der Struktur und der eingebauten Funktionalität.

Flasche ist ein leichtes und flexibles Mikroframework, das es Entwicklern ermöglicht, ihre eigenen Bibliotheken und Architekturen auszuwählen. Es bietet nur minimale integrierte Funktionen und ist hochgradig anpassbar.

Django REST-Framework, auf der anderen Seite, ist ein Framework mit vollem Funktionsumfang, das auf Django aufbaut und integrierte Tools enthält für Authentifizierung, Serialisierung, Berechtigungen und API-Ansichten.

Im Allgemeinen gilt:

  • Flasche eignet sich besser für kleine bis mittlere APIs, Microservices und hochgradig maßgeschneiderte Architekturen.
  • Django REST-Framework wird oft für größere Anwendungen bevorzugt, die vom integrierten Ökosystem und den Konventionen von Django profitieren.

Build scalable products with Web and Mobile Development call to action

Fanden Sie diesen Artikel hilfreich? Diese könnten dir auch gefallen!

Pedro Martinho
Pedro Martinho

Assoziierter Entwickler, der hauptsächlich mit Backend-Technologien arbeitet. Ein Unternehmer mit Interesse an Data Science. Liebe zu Sport, Hörbüchern, Kaffee und Memes!

Read more posts by this author
Tiago Franco
Tiago Franco

CEO von Imaginary Cloud und Mitautor des Buches Product Design Process. Ich mag Essen, Wein und Krav Maga (nicht unbedingt in dieser Reihenfolge).

Read more posts by this author
Alexandra Mendes
Alexandra Mendes

Alexandra Mendes ist Senior Growth Specialist bei Imaginary Cloud und verfügt über mehr als 3 Jahre Erfahrung in der Erstellung von Texten über Softwareentwicklung, KI und digitale Transformation. Nach Abschluss eines Frontend-Entwicklungskurses erwarb Alexandra einige praktische Programmierkenntnisse und arbeitet nun eng mit technischen Teams zusammen. Alexandra ist begeistert davon, wie neue Technologien Wirtschaft und Gesellschaft prägen. Sie liebt es, komplexe Themen in klare, hilfreiche Inhalte für Entscheidungsträger umzuwandeln.

LinkedIn

Read more posts by this author

People who read this post, also found these interesting:

arrow left
arrow to the right
Dropdown caret icon