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.

Sådan opbygges en Flask API med Python: Den komplette guide

Laptop screen showing lines of code

Kolbe er en letvægts Python-webramme, der almindeligvis bruges til at opbygge REST API'er og mikrotjenester. Dens minimale kerne og fleksible arkitektur giver udviklere mulighed for at designe API'er uden at blive begrænset af strenge projektstrukturer.

I denne vejledning bygger du en simpel REST API ved hjælp af Flask, herunder:

  • CRUD-endepunkter
  • en SQLite-database med SQLAlchemy
  • anmodning om validering og fejlhåndtering
  • OpenAPI-dokumentation
  • en modulær projektstruktur

I slutningen af denne tutorial vil du forstå, hvordan du designer og strukturerer en produktionsklar Flask API.

blue arrow to the left
Imaginary Cloud logo

Hvad er Flask, og hvorfor bruge det til at opbygge API'er?

Flask er en let Python-webramme, der bruges til at opbygge API'er og webapplikationer ved at definere HTTP-ruter, der returnerer JSON- eller HTML-svar.

En ramme er et bibliotek, der bruges af udviklere til at opbygge og vedligeholde pålidelige og skalerbare webapplikationer. Der er flere rammer tilgængelig for Python, såsom Tornado, Pyramid og selvfølgelig Django (som ofte sammenlignes med Flask).

Flask er en Python-mikroframework til webudvikling. På trods af at den er bygget med en lille kerne og betragtes som en meget let Web Server Gateway Interface (WSGI), skiller Flask sig ud for sin letudvidede filosofi. Den er designet til at skalere op til komplekse applikationer og til at understøtte en nem og hurtig start.

Desuden er en anden stor fordel ved Flask dens funktion. Selvom det giver forslag, kræver Flask ikke obligatorisk projektlayout eller andre afhængigheder. I stedet giver det udviklere mulighed for at vælge de biblioteker og værktøjer, de ønsker at bruge, og har desuden forskellige udvidelser tilgængelige, som leveres af samfundet.

blue arrow to the left
Imaginary Cloud logo

Hvad er en REST API, og hvordan fungerer den?

API er et akronym for Application Programming Interface, hvilket betyder, at det dybest set er hvordan du kommunikerer med en applikation. En REST (Representational State Transfer) API tillader kommunikation mellem systemer ved hjælp af standard HTTP-metoder og svarer til en arkitektonisk stil der sigter mod statsløs kommunikation og adskiller klient- og serverproblemer. Det udveksler typisk data i JSON-format og fungerer ved hjælp af slutpunkter, der svarer til handlinger som Create (POST), Read (GET), Update (PUT eller PATCH) og Delete (DELETE). REST API'er bruges i vid udstrækning på grund af deres enkelhed, skalerbarhed og kompatibilitet med en bred vifte af klienter og platforme.

Den REST API på denne øvelse vil skabe en falsk implementering af CRUD-handlinger over en enhed. En API med CRUD tillader handlinger Opret, Læs, Opdater og Slet over applikationens elementer.

Hvordan laver man en REST API ved hjælp af Python Flask?

Denne artikel vil guide dig gennem de første trin til at oprette en REST API ved hjælp af Flask.

Hvad du vil bygge

I denne vejledning bygger du en simpel REST API ved hjælp af Flask og Python, der inkluderer:

  • en SQLite-database forbundet via SQLAlchemy
  • CRUD-slutpunkter til styring af elementer
  • anmodning om validering og fejlhåndtering
  • automatisk API-dokumentation ved hjælp af OpenAPI
  • en modulær projektstruktur til vedligeholdelse

Dette eksempel viser de nøglekomponenter, der er nødvendige for at oprette en produktionsklar backend API.

Tekniske krav

Du skal have Python installeret på den aktuelle maskine. Den præsenterede kode vil overveje Python3. Hvis du vil bruge Python2 og/eller følger denne procedure i en Windows-maskine, skal du følge instruktionerne i Installationsvejledning til kolbe.

Lad os starte med oprettelse af en mappe at gemme projektet. I den mappe, du vil have dit projekt, skal du køre følgende kommandoer på skallen:

Vi har skabt flask_demo mappe og flyttede den ind. Før vi begynder at installere afhængigheder, lad os oprette en virtuelt miljø ved at køre følgende kommando:

Dette opretter en mappe i dit projekt med navnet .venv. Derefter skal vi aktivere det respektive miljø ved at køre:

Det betyder, at vi nu overvejer venv virtuelt miljø når du kører en Python-kode. Det kan være vigtigt at angive det miljø, du overvejer, når du kører det i din IDE.

Sørg for, at du har miljøet aktiv før du følger de næste trin. Du kan kontrollere, om du er inde i miljøet ved at se til venstre side af konsollen. Hvis der er navnet på det virtuelle miljø inden for parenteser, er du klar til at gå.

Hvis du vil Deaktiver miljøet, bare kør følgende kommando:

Screenshot of Flask - venv virtual command environment.

API-udviklingsarbejdsgang

En typisk Flask API-udviklingsarbejdsgang inkluderer:

  1. Opsætning af Flask-applikationen.
  2. Definition af API-ruter og slutpunkter.
  3. Tilslutning af applikationen til en database.
  4. Implementering af CRUD-operationer.
  5. Validering af anmodninger og håndtering af fejl.
  6. Dokumentation af API'en ved hjælp af OpenAPI-værktøjer.

Denne struktur hjælper med at holde backend-tjenester organiseret og lettere at vedligeholde.

Byg en Flask API med en rigtig database

I det foregående eksempel gemte API'en data i en Python-liste. Selvom dette er nyttigt til at demonstrere CRUD-slutpunkter, er det ikke egnet til virkelige applikationer, fordi dataene forsvinder, når serveren genstarter.

I praksis gemmer API'er data i en database, så de fortsætter mellem anmodninger og genstart af applikationer. I dette afsnit vil vi bruge SQLite og SQLAkemi at opbygge en simpel database-støttet API.

SQLite er en letvægtsdatabase, der ikke kræver nogen separat server, hvilket gør den ideel til tutorials og små applikationer.

Installer SQLAlchemy og Flask-SQLAlchemy

Først skal du installere de nødvendige afhængigheder.

Kør følgende kommando:

pip install sqlalchemy flask-sqlalchemy

Hvis du administrerer afhængigheder med en requirements.txt fil, tilføj:

Flask
sqlalchemy
flask-sqlalchemy

I denne opsætning:

  • SQLAkemi er Object Relational Mapper (ORM), der bruges til at interagere med databasen.
  • Flask-SQLAchemy forenkler integrationen mellem Flask og SQLAlchemy.

Konfigurer databasen

Konfigurer derefter Flask til at oprette forbindelse til SQLite-databasen.

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)

Her definerer vi databaseforbindelsesstrengen:

sqlite: ///items.db

Dette opretter en lokal SQLite-databasefil med navnet items.db i projektmappen.

Definer databasemodel

Opret derefter en model, der repræsenterer strukturen i databasetabellen.

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
        }

Den Vare Model definerer tre felter:

  • id — entydig identifikator for hvert element
  • navngive — varens navn
  • pris — prisen på varen

Den til_dict () metode konverterer databaseobjektet til en JSON-serialiserbar ordbog.

Oprette databasetabellen

Før du kører API'en, skal du oprette databasetabellerne ved hjælp af SQLAlchemy.

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

Dette slutpunkt henter alle elementer, der er gemt i databasen.

Opret et nyt element

@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

Dette endepunkt:

  1. læser JSON-anmodningsteksten
  2. validerer input
  3. opretter en ny databasepost
  4. returnerer det oprettede element

Få en enkelt vare

@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())

Dette slutpunkt henter et bestemt element ved dets ID.

Hvis varen ikke findes, returnerer Flask automatisk en 404 fejl.

Opdatere et element

@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())

Dette slutpunkt opdaterer et eksisterende element.

Kun de angivne felter ændres.

Slet et element

@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"})

Dette slutpunkt fjerner det angivne element fra databasen.

Kør programmet

Start Flask-udviklingsserveren:

python app.py

Din API vil nu være tilgængelig lokalt.

Eksempel på anmodning og svar

Opret et nyt element

Forespørgsel:

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

Svar:

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

Hent alle elementer

Svar:

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

Hvorfor bruge en database i stedet for en hukommelsesliste?

Lister i hukommelsen er nyttige til enkle demonstrationer, men har flere begrænsninger:

  • data går tabt, når programmet genstarter
  • flere applikationsinstanser kan ikke dele data
  • Data kan ikke søges effektivt

Brug af en database som SQLite giver API'en mulighed for at gemme og hente vedvarende data, hvilket får applikationen til at opføre sig mere som en rigtig backend-tjeneste.

Til produktionssystemer bruger udviklere typisk databaser som f.eks PostgreSQL, MySQL, eller MongoDB, men den overordnede API-struktur forbliver den samme.

Begynderstruktur: Et simpelt Flask API-projekt

For små applikationer eller tutorials er det almindeligt at opbevare hele API'en i kun få filer. Denne tilgang holder opsætningen ligetil og let at forstå.

En typisk nybegynder Flask API-struktur kan se sådan ud:

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

I denne struktur:

  • app.py opretter Flask-programmet og konfigurerer udvidelser.
  • models.py definerer databasemodellerne ved hjælp af SQLAlchemy.
  • routes.py indeholder API-slutpunkterne.
  • requirements.txt viser projektafhængigheder.
  • items.db er SQLite-databasen, der bruges til udvikling.

Dette layout er let at følge og fungerer godt til små API'er, prototyper og læringsprojekter.

Men efterhånden som applikationen vokser, kan denne struktur blive vanskelig at vedligeholde.

Eksempel: Hvad hver fil indeholder

For at gøre strukturen lettere at forstå, er her, hvordan hver fil kan bruges.

app.py

Denne fil opretter Flask-applikationen, konfigurerer databasen og registrerer ruterne.

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

Denne fil definerer databasemodellen.

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

Denne fil indeholder API-slutpunkterne.

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

Hvorfor denne struktur er bedre

Adskillelse af applikationen i filer giver flere fordele:

  • Det holder ansvaret klart
  • Det gør koden nemmere at vedligeholde
  • Det understøtter fremtidig vækst
  • det reducerer rod i hovedapplikationsfilen

Hvis du f.eks. senere tilføjer godkendelse, brugere eller ordrer, kan du udvide strukturen uden at omskrive hele projektet.

Produktionsstruktur: En modulær Flask API-arkitektur

Større applikationer drager fordel af at organisere koden i pakker. Dette adskiller forskellige dele af systemet, hvilket gør projektet lettere at skalere og vedligeholde.

En mere produktionsklar Flask API-struktur kan se sådan ud:

For større projekter er det almindeligt at organisere koden i mapper i stedet for individuelle filer på øverste niveau.

En mere skalerbar struktur kan se sådan ud:

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

I denne arkitektur:

  • Den app-pakke indeholder den vigtigste applikationslogik.
  • modeller/ definerer databasemodeller.
  • ruter/ indeholder API-slutpunkter grupperet efter ressource.
  • skemaer/ definerer anmodning og svarvalidering ved hjælp af Marshmallow.
  • run.py starter programmet Flask.

Denne modulære tilgang gør det lettere at:

  • administrere store kodebaser
  • organisere slutpunkter efter ressource
  • tilføje nye funktioner såsom godkendelse eller baggrundsjob
  • samarbejde med andre udviklere

Bedste praksis

Når du bygger en Flask API, er det en god ide at starte med en simpel struktur og kun udvide den, når applikationen vokser. For små projekter er nogle få tydeligt navngivne filer ofte nok. For større API'er gør det meget nemmere at flytte til et pakkebaseret layout vedligeholdelsen.

En ren projektstruktur hjælper andre udviklere med at forstå koden hurtigt og gør applikationen lettere at udvide i fremtiden.

Tegninger

Før vi præsenterer andre Flask-styrker, lad os tale om tegninger. En blueprint er et objekt, der meget ligner et Flask-applikationsobjekt, men i stedet for at oprette et nyt, tillader det udvidelsen af det aktuelle program. Dette kan være nyttigt, hvis du vil oprette flere versioner af en API eller blot opdele tjenester inden for den samme applikation.

Vi bruger denne klassetype til at præsentere forskellige brugsscenarier for en Flask-applikation. Lad os konvertere koden ovenfor, der skal indsættes i en plan og indlæses i hovedapplikationen.

Opret en ny mappe med navnet blueprints for at begynde at indsætte blueprint-moduler, når vi skrider frem i blogindlægget. Inde i det skal du oprette en mappe med navnet grundlæggende slutpunkter og derefter en fil med navnet __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!'})

Nu main.py filen skal bare indlæse den oprettede blueprint og registrere den til applikationsobjektet:

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

Nu skal du have nøjagtigt de samme slutpunkter, men bruge strukturen leveret af Blueprints. Dette vil gøre din applikation lettere at administrere og skalere, efterhånden som den vokser.

Digital Transformation Service CTA

Tilføj anmodningsvalidering og fejlhåndtering

Når du bygger API'er, er det vigtigt at validere indgående anmodninger og returnere meningsfulde fejlsvar, når noget går galt. Uden validering kan en API acceptere ufuldstændige eller ugyldige data, hvilket kan føre til inkonsekvente poster i databasen eller uventet applikationsadfærd.

En veludviklet API skal:

  • validere indgående anmodningsdata
  • returnere klare fejlmeddelelser
  • Brug passende HTTP-statuskoder

Dette forbedrer pålideligheden og gør API'en lettere for andre udviklere at bruge.

Valider indgående anmodningsdata

Når en klient sender data til API'en, skal serveren kontrollere, at de krævede felter er til stede og korrekt formateret.

For eksempel, når du opretter et nyt element, skal anmodningen indeholde både a navngive og en pris.

Her er et simpelt valideringseksempel:

@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

I dette eksempel kontrollerer API'en, om:

  • anmodningsteksten indeholder JSON
  • De obligatoriske felter er til stede

Hvis valideringen mislykkes, returnerer API'en en 400 Dårlig anmodning svar.

Brug meningsfulde HTTP-statuskoder

HTTP-statuskoder hjælper klienter med at forstå, om en anmodning lykkedes eller mislykkedes.

Nogle almindelige koder, der bruges i REST API'er, omfatter:

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

Brug af den korrekte statuskode hjælper API-forbrugere med at håndtere svar korrekt.

Håndter manglende ressourcer

Når en klient anmoder om en ressource, der ikke findes, skal API'en returnere en 404 fejl.

Flask-SQLAlchemy giver en bekvem hjælper til dette:

item = Item.query.get_or_404(item_id)

Hvis elementet ikke findes, returnerer Flask automatisk et svar som:

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

Dette forhindrer API'en i at returnere tomme eller vildledende svar.

Tilføj en global fejlbehandler

I større applikationer er det nyttigt at definere globale fejlbehandlere, der returnerer ensartede svar for almindelige fejl.

For eksempel:

@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

Med disse handlere returnerer API'en altid strukturerede JSON-svar i stedet for standard HTML-fejlsider.

Eksempel Fejlsvar

Hvis en klient forsøger at oprette et element uden at angive de krævede felter, kan API'en returnere:

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

At give klare fejlmeddelelser hjælper udviklere med hurtigt at forstå, hvad der gik galt, og hvordan de løser deres anmodning.

Hvorfor validering og fejlhåndtering betyder noget

Anmodningsvalidering og korrekt fejlhåndtering er afgørende for at opbygge pålidelige API'er. De sikrer, at:

  • ugyldige data kommer ikke ind i databasen
  • API-svar er forudsigelige
  • udviklere, der integrerer med API'en, kan diagnosticere problemer hurtigt

Denne praksis betragtes som standard i moderne API-udvikling og bør inkluderes i enhver produktionsklar backend-tjeneste.

blue arrow to the left
Imaginary Cloud logo

Sådan genereres OpenAPI-dokumentation til en Flask API

Moderne API'er bør afsløre maskinlæsbar dokumentation, så udviklere let kan forstå slutpunkter, anmodningsformater og svar. Den mest udbredte standard for dette er OpenAPI, som beskriver HTTP-API'er i et struktureret format, som værktøjer automatisk kan fortolke.

I Flask-applikationer er en bekvem måde at generere OpenAPI-dokumentation ved at bruge flask-smorest, et bibliotek, der integrerer Flask med OpenAPI 3, anmodning om validering og automatisk Swagger UI-dokumentation.

Installer flask-smorest og marshmallow

Først skal du installere de nødvendige pakker.

Kør følgende kommando:

pip install flask-smorest marshmallow

Hvis du foretrækker at administrere afhængigheder med en requirements.txt fil, du kan tilføje følgende:

Flask
flask-smorest
marshmallow


I denne opsætning:

  • flask-smorest genererer OpenAPI-dokumentation og administrerer API-routing.
  • skumfidus håndterer anmodningsvalidering og responsserialisering.

Sammen giver disse biblioteker Flask API'er mulighed for automatisk at producere interaktiv dokumentation og håndhæve datavalidering.

Konfigurer Flask til OpenAPI-dokumentation

Før du opretter slutpunkter, skal Flask-programmet konfigureres til at generere OpenAPI-dokumentation.

Føj følgende konfiguration til din Flask-applikation:

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)

Denne konfiguration definerer de metadata, der bruges til at generere API-dokumentationen.

Nøgleindstillinger omfatter:

  • API_TITEL — navnet på din API.
  • API_VERSION — den aktuelle API-version.
  • OPENAPI_VERSION - OpenAPI-specifikationsversionen, der bruges til at beskrive API'en.
  • OPENAPI_SWAGGER_UI_PATH — URL'en, hvor den interaktive dokumentation vil være tilgængelig.

Når API'en kører, vil dokumentationen være tilgængelig på:

http://localhost:5000/docs

Definer anmodnings- og svarskemaer

API'er skal klart definere strukturen af de data, de accepterer og returnerer.
Med flask-smorest gøres dette ved hjælp af Marshmallow-skemaer.

Opret et skema til at beskrive et element i API'en:

from marshmallow import Schema, fields

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


Skemaer tjener flere vigtige formål:

  • validering af indgående anmodningsdata
  • dokumentation af det forventede dataformat
  • serialisering af svar
  • generering af nøjagtig OpenAPI-dokumentation

Brug af skemaer sikrer, at API-slutpunkter opfører sig konsekvent og afviser ugyldige data.

Opret dokumenterede API-slutpunkter

Opret derefter API-slutpunkter ved hjælp af en Blueprint. Blueprints giver dig mulighed for at gruppere relaterede ruter og organisere større API'er.

from flask.views import MethodView
from flask_smorest import Blueprint

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

items = []


Hver blueprint repræsenterer en gruppe af relaterede slutpunkter, der vises som et afsnit i den genererede dokumentation.

Implementere CRUD-slutpunkter med validering og dokumentation

Nu kan vi implementere slutpunkter til oprettelse og hentning af elementer.

@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


I dette eksempel:

  • @blp .argumenter (itemSchema) validerer det indgående anmodningsorgan.
  • @blp .svar () dokumenterer API-svaret og serialiserer output.
  • Metodevisning tillader gruppering af flere HTTP-metoder under samme rute.

Disse dekoratører opdaterer automatisk den genererede OpenAPI-dokumentation.

Registrer Blueprint

Når du har defineret slutpunkterne, skal du registrere planen med API-forekomsten:

api.register_blueprint(blp)

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


Registrering af planen aktiverer slutpunkterne og sikrer, at de vises i API-dokumentationen.

Se den interaktive API-dokumentation

Når programmet kører, skal du åbne følgende URL i din browser:

http://localhost:5000/docs

Du vil se en interaktiv Swagger UI-grænseflade genereret fra OpenAPI-specifikationen.

Fra denne grænseflade kan du:

  • se alle API-slutpunkter
  • inspicere anmodningsparametre
  • test slutpunkter direkte fra browseren
  • udforske anmodnings- og svarskemaer

Dette gør API'en lettere at forstå og forenkler integrationen med andre systemer betydeligt.

Hvorfor OpenAPI-dokumentation betyder noget

Brug af OpenAPI-baserede dokumentationsværktøjer som flask-smorest giver flere fordele:

  • Automatisk dokumentationsgenerering
  • Indbygget anmodning validering
  • Klar API-struktur for udviklere
  • Kompatibilitet med test- og klientgenereringsværktøjer

Fordi OpenAPI er bredt anvendt i hele branchen, kan mange udviklingsværktøjer automatisk generere klientbiblioteker, udføre API-test og validere anmodninger ved hjælp af den samme specifikation.

Af disse grunde er OpenAPI-dokumentation blevet en standardpraksis, når man bygger moderne API'er.

Implementering af en Flask API

Når din Flask API er klar, er det næste trin at implementere det, så det kan tilgås af brugere eller andre tjenester. Mens den indbyggede Flask-server er nyttig til udvikling, kræver produktionsinstallationer en WSGI-server og en webserver at håndtere trafikken pålideligt.

En almindelig installationsopsætning omfatter:

  • Gunikorn eller UWSGi som WSGI-serveren
  • Nginx som en omvendt proxy
  • en cloud-server eller containerplatform som f.eks AWS, Azure eller Google Cloud

Du kan f.eks. køre et Flask-program i produktion ved hjælp af Gunicorn:

gunicorn -w 4 app:app

I denne kommando:

  • -w4 starter fire arbejderprocesser
  • app:app henviser til Flask-applikationsobjektet

I moderne miljøer implementeres Flask API'er ofte ved hjælp af Docker-containere, hvilket forenkler skalering, miljøstyring og kontinuerlig implementering.

Sikring af en Flask API med godkendelse

De fleste produktions-API'er kræver godkendelse for at sikre, at kun autoriserede brugere eller tjenester kan få adgang til beskyttede slutpunkter.

Almindelige godkendelsesmetoder omfatter:

  • API-nøgler til nem adgang fra tjeneste til tjeneste
  • JWT (JSON-webtokens) til brugergodkendelse
  • OAuth 2.0 til tredjepartsintegrationer

En almindelig tilgang i Flask API'er er at bruge JWT-baseret godkendelse. I denne model:

  1. En bruger logger ind med legitimationsoplysninger.
  2. Serveren genererer et signeret token.
  3. Klienten sender tokenet i Tilladelse header med hver anmodning.

Eksempel overskrift:

Tilladelse: Bærer <access_token>

Flaskeudvidelser såsom Flask-JWT-udvidet gøre det nemmere at implementere tokenbaseret godkendelse og beskytte API-ruter.

Tilføjelse af godkendelse sikrer, at:

  • Kun autoriserede kunder kan få adgang til API'en
  • Følsomme data er beskyttet
  • API-brug kan overvåges og kontrolleres.

blue arrow to the left
Imaginary Cloud logo

Flask vs FastAPI: Hvilken ramme skal du bruge?

Flask er en af de mest anvendte Python-webrammer til opbygning af API'er, men det er ikke den eneste mulighed. I de senere år FastAPI har vundet popularitet som en moderne ramme designet specielt til opbygning af højtydende API'er.

Begge rammer er magtfulde, men de adskiller sig i filosofi og funktioner.

Side-by-Side Feature Matrix

A granular look at the technical differences between Flask and FastAPI, highlighting tooling, architecture, and developer experience.

Feature Category Flask FastAPI
Release History Established (2010) Modern (2018)
Asynchronous Capabilities Limited Support Native ASGI
Data Integrity Requires Marshmallow Built-in (Pydantic)
Self-Documenting Requires Extensions Automatic OpenAPI
Complexity to Learn Low Moderate (Type Hints)

Hvornår skal man bruge kolbe

Flask er ofte det bedste valg, når du har brug for en fleksibel ramme, der kan tilpasse sig forskellige typer applikationer.

Kolbe er velegnet til:

  • små og mellemstore API'er
  • mikrotjenester
  • backend-tjenester til webapplikationer
  • projekter, der kræver fuld kontrol over arkitekturen
  • hold, der allerede er bekendt med Flask eller Python-økosystemet

Fordi Flask er let og meningsløs, kan udviklere nemt tilpasse, hvordan applikationen er struktureret.

Hvornår skal du bruge FastAPI

FastAPI er designet specielt til opbygning af API'er og indeholder mange funktioner ud af boksen.

FastAPI er et stærkt valg til:

  • højtydende API'er
  • asynkrone applikationer
  • API'er, der er stærkt afhængige af tip af Python-typen
  • projekter, der kræver automatisk validering og dokumentation

FastAPI genererer automatisk interaktiv API-dokumentation og udfører anmodningsvalidering ved hjælp af Pydantiske modeller, hvilket reducerer mængden af boilerplate-kode, som udviklere skal skrive.

Hvilken ramme er bedre?

Der er ikke noget universelt svar på dette spørgsmål. Begge rammer bruges i vid udstrækning og er i stand til at drive produktionsapplikationer.

  • Kolbe giver maksimal fleksibilitet og et modent økosystem.
  • FastAPI tilbyder moderne funktioner og indbyggede ydelsesoptimeringer.

For mange teams afhænger valget af eksisterende erfaring, projektkrav og foretrukken udviklingsstil.

Framework Selection Engine

Align your project goals with the right technology stack using the interactive tool below.

Your Project Profile

?

Define Your Needs

Select at least one requirement to calculate the strategic fit for your team.

Flask Ecosystem Fit 0%
FastAPI Modern Fit 0%

Vigtige takeaways

  • Flask er en let Python-ramme, der er velegnet til opbygning af REST API'er og mikrotjenester.
  • En produktionsklar Flask API inkluderer typisk databasepersistens, anmodningsvalidering og struktureret fejlhåndtering.
  • SQLAlchemy forenkler databaseinteraktioner og understøtter flere relationelle databaser.
  • Værktøjer som flask-smorest giver udviklere mulighed for automatisk at generere OpenAPI-dokumentation.
  • Valget mellem Flask og FastAPI afhænger af projektkrav, ydeevnebehov og teamerfaring.
blue arrow to the left
Imaginary Cloud logo

Key Takeaways: Building APIs with Flask

Flask remains a powerful and flexible choice for building Python APIs. Its lightweight design, modular architecture, and extensive ecosystem make it well suited for everything from simple services to scalable backend systems. In this guide, we explored how to build a Flask API step by step, including project setup, database integration, request validation, error handling, and OpenAPI documentation, all key practices that help create maintainable and production-ready APIs.

If you are planning a new API or modernising an existing backend, choosing the right architecture early can make a significant difference. Need help building or scaling a Flask API? Contact Imaginary Cloud to discuss your project.

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

Ofte stillede spørgsmål

Hvad er en Flask API?

En Flask API henviser til en RESTful-webtjeneste bygget ved hjælp af Flask-rammen i Python. Det afslører slutpunkter, som klienter kan interagere med over HTTP, hvilket typisk returnerer data i JSON-format.

Er Flask en backend API?

Ja, Flask kan bruges som en backend-ramme til at opbygge API'er, der leverer data til frontend applikationer eller tredjepartstjenester.

Hvad er forskellen mellem Flask og REST?

Flask er en webramme, mens REST er en arkitektonisk stil til design af netværksapplikationer. Du kan bruge Flask til at implementere REST API'er.

Er Python Flask godt til API?

Ja, Flask er et fremragende valg til opbygning af API'er på grund af dets enkelhed, fleksibilitet og en bred vifte af udvidelser, der understøtter dokumentation, godkendelse og implementering.

Hvad er nogle almindelige brugssager for Flask?

Flask bruges ofte til opbygning af REST API'er, mikrotjenester, admin dashboards, prototyping applikationer og integration med maskinlæringsmodeller.

Kan kolbe bruges i produktionen?

Ja, Kolbe kan bruges i produktionen og driver mange virkelige webapplikationer og API'er. Mens den indbyggede Flask-udviklingsserver kun er beregnet til udvikling, bruger produktionsinstallationer typisk en WSGI-server såsom Gunicorn eller uWSGI bag en webserver som Nginx eller Apache.

Med korrekt konfiguration kan Flask-applikationer skalere effektivt og understøtte produktionsarbejdsbelastninger, især når de kombineres med værktøjer som Docker, reverse proxies og databasetjenester.

Hvordan implementerer du en Flask API?

En Flask API implementeres typisk ved hjælp af en WSGI-server og en omvendt proxy.

De grundlæggende implementeringstrin omfatter:

  1. Pakk Flask-applikationen og installer afhængigheder.
  2. Kør applikationen ved hjælp af en WSGI-produktionsserver, f.eks. Gunikorn.
  3. Konfigurer en omvendt proxy som f.eks Nginx til at håndtere indgående trafik.
  4. Implementer applikationen på en hostingplatform, cloud-server eller containermiljø.

For eksempel er en almindelig implementeringskommando ved hjælp af Gunicorn:

gunicorn -w 4 app: app

I moderne infrastruktur implementeres Flask API'er ofte ved hjælp af Docker-containere og skyplatforme som AWS, Azure eller Google Cloud.

Hvad er forskellen mellem Flask og Django REST?

Den største forskel mellem Flask og Django REST Framework (DRF) er niveauet af struktur og indbygget funktionalitet.

Kolbe er en let og fleksibel mikroramme, der giver udviklere mulighed for at vælge deres egne biblioteker og arkitektur. Det giver minimale indbyggede funktioner og er meget tilpasselig.

Django REST-ramme, på den anden side, er en komplet ramme bygget oven på Django, der inkluderer indbyggede værktøjer til godkendelse, serialisering, tilladelser og API-visninger.

Generelt:

  • Kolbe er bedre til små til mellemstore API'er, mikrotjenester og meget tilpassede arkitekturer.
  • Django REST-ramme foretrækkes ofte til større applikationer, der drager fordel af Djangos integrerede økosystem og konventioner.

Build scalable products with Web and Mobile Development call to action

Fandt du denne artikel nyttig? Du kan måske også lide disse!

Pedro Martinho
Pedro Martinho

Associeret udvikler, der arbejder mest med Backend-teknologier. En iværksætter med datavidenskabsinteresse. Kærlighed til sport, lydbøger, kaffe og memes!

Read more posts by this author
Tiago Franco
Tiago Franco

CEO @ Imaginary Cloud og medforfatter af bogen Product Design Process. Jeg nyder mad, vin og Krav Maga (ikke nødvendigvis i denne rækkefølge).

Read more posts by this author
Alexandra Mendes
Alexandra Mendes

Alexandra Mendes er Senior Growth Specialist hos Imaginary Cloud med 3+ års erfaring med at skrive om softwareudvikling, AI og digital transformation. Efter at have gennemført et frontend-udviklingskursus fik Alexandra nogle praktiske kodningsevner og arbejder nu tæt sammen med tekniske teams. Alexandra brænder for, hvordan nye teknologier former erhvervslivet og samfundet, og hun nyder at omdanne komplekse emner til klart og nyttigt indhold for beslutningstagere.

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