Python: Een REST API maken

Hoe een REST API te maken met Flask

👋 Welkom bij de Stackhero-documentatie!

Stackhero biedt een kant-en-klare Python cloud oplossing die tal van voordelen biedt, waaronder:

  • Implementeer uw applicatie in seconden met een eenvoudige git push.
  • Gebruik uw eigen domeinnaam en profiteer van de automatische configuratie van HTTPS-certificaten voor verbeterde beveiliging.
  • Geniet van gemoedsrust met automatische back-ups, updates met één klik, en eenvoudige, transparante en voorspelbare prijzen.
  • Krijg optimale prestaties en robuuste beveiliging dankzij een privé en dedicated VM.

Bespaar tijd en vereenvoudig uw leven: het kost slechts 5 minuten om de Python cloud hosting oplossing van Stackhero te proberen!

Deze documentatie is een gebruiksvriendelijke gids voor beginners over het maken van een REST API in Python.

In dit voorbeeld gebruiken we Flask, een lichtgewicht en eenvoudig te gebruiken micro-framework waarmee u snel webapplicaties kunt maken.

Voordat u begint, zorg ervoor dat uw computer is uitgerust met de volgende tools:

  1. Python
  2. pip
  3. git
  4. asdf

Als uw ontwikkelomgeving nog niet is ingesteld, raadpleeg dan de Development platform gids voor gedetailleerde instructies. U kunt ook het online Code-Hero platform gebruiken. Code-Hero biedt een online IDE en terminal, met alle essentiële tools vooraf geïnstalleerd, zodat u direct kunt beginnen met coderen zonder enige installatie.

Python REST API draaiend in Code-Hero, direct toegankelijk vanuit de browserPython REST API draaiend in Code-Hero, direct toegankelijk vanuit de browser

De eerste stap is het maken van een nieuwe projectdirectory. Voor deze gids noemen we het myRestApi:

mkdir myRestApi
cd myRestApi

Stel vervolgens de Python-versie in op de nieuwste beschikbare versie met behulp van asdf, en initialiseer de Git-repository:

asdf install python latest \
  && asdf local python latest

echo "__pycache__/" >> .gitignore

git init
git add -A .
git commit -m "First commit"

Voor dit voorbeeld hebben we slechts één afhankelijkheid nodig: Flask.

Flask is een lichtgewicht webframework dat snelle ontwikkeling van webapplicaties mogelijk maakt. Het is ontworpen om eenvoudig en gemakkelijk te gebruiken te zijn, waardoor ontwikkelaars snel webservices kunnen bouwen en implementeren. Ingebouwde ondersteuning voor routing, templating en het afhandelen van HTTP-verzoeken maakt Flask een uitstekende keuze voor het maken van REST API's.

Installeer Flask (en python-dotenv) met behulp van pip:

pip install Flask python-dotenv

We installeren hier de Flask en python-dotenv modules. U zult snel zien waarom we python-dotenv gebruiken (spoiler: het is voor het beheren van omgevingsvariabelen).

Na de installatie, bevries de pakketversies naar een requirements.txt bestand:

pip freeze > requirements.txt

Het bevriezen van uw afhankelijkheden zorgt ervoor dat uw productie server of collega's dezelfde versies gebruiken als u. Slechts een paar seconden werk kan veel toekomstige hoofdpijn voorkomen.

Laten we nu in de code duiken!

Maak een bestand genaamd app.py en voeg de volgende code in:

import os
from dotenv import load_dotenv
from flask import Flask, jsonify, request

# Laad omgevingsvariabelen uit het .env bestand wanneer niet in productie
if os.environ.get('ENV') != 'production':
    load_dotenv()

# Maak de Flask app
app = Flask(__name__)

# Voorbeeld dataset
tasks = [
    {
        'id': 1,
        'title': 'Boodschappen doen',
        'description': 'Melk, Kaas, Pizza, Fruit',
        'done': False
    },
    {
        'id': 2,
        'title': 'Python leren',
        'description': 'Leer de basis van Python programmeren',
        'done': False
    }
]

# Route '/api/tasks' (GET) om alle taken te lijst
@app.route('/api/tasks', methods=['GET'])
def get_tasks():
    return jsonify({'tasks': tasks})

# Route '/api/tasks/<task_id>' (GET) om een specifieke taak op te halen via ID
@app.route('/api/tasks/<int:task_id>', methods=['GET'])
def get_task(task_id):
    task = [task for task in tasks if task['id'] == task_id]
    if len(task) == 0:
        return jsonify({'error': 'Taak niet gevonden'}), 404
    return jsonify({'task': task[0]})

# Route '/api/tasks' (POST) om een nieuwe taak te maken
@app.route('/api/tasks', methods=['POST'])
def create_task():
    if not request.json or 'title' not in request.json:
        return jsonify({'error': 'Titel is vereist'}), 400
    task = {
        'id': tasks[-1]['id'] + 1,
        'title': request.json['title'],
        'description': request.json.get('description', ""),
        'done': False
    }
    tasks.append(task)
    return jsonify({'task': task}), 201

# Start de API server
if __name__ == '__main__':
    if os.environ.get('ENV') == 'production':
        app.run()
    else:
        app.run(host='0.0.0.0', port=8080, debug=True)

Om de server te starten, voert u uit:

python app.py

Met de host='0.0.0.0' optie kunt u ook uw API openen met uw browser wanneer u Code-Hero gebruikt. Navigeer eenvoudig naar http://<XXXXXX>.stackhero-network.com:8080/api/tasks, waarbij u <XXXXXX> vervangt door uw Code-Hero domein.

Zodra de server draait, kunt u ermee communiceren met behulp van cURL. Hier zijn enkele voorbeelden:

  • Alle taken ophalen:

    curl -s http://localhost:8080/api/tasks
    {
      "tasks": [
        {
          "description": "Melk, Kaas, Pizza, Fruit",
          "done": false,
          "id": 1,
          "title": "Boodschappen doen"
        },
        {
          "description": "Leer de basis van Python programmeren",
          "done": false,
          "id": 2,
          "title": "Python leren"
        }
      ]
    }
    
  • Taak met ID 2 ophalen:

    curl -s http://localhost:8080/api/tasks/2
    {
      "task": {
        "description": "Leer de basis van Python programmeren",
        "done": false,
        "id": 2,
        "title": "Python leren"
      }
    }
    
  • Een nieuwe taak maken:

    curl -s -X POST -H "Content-Type: application/json" \
    -d '{"title": "Nieuwe taak", "description": "Gemaakt met cURL"}' \
    http://localhost:8080/api/tasks
    {
      "task": {
        "description": "Gemaakt met cURL",
        "done": false,
        "id": 3,
        "title": "Nieuwe taak"
      }
    }
    

Tip: Leid de uitvoer om naar jq om de JSON te verfraaien. Bijvoorbeeld, curl -s http://localhost:8080/api/tasks/2 | jq produceert een beter leesbaar resultaat.

Voorbeeld van Python REST API met Flask, draaiend in Stackhero Code-Hero, met de server (1) en de client die cURL gebruikt (2)Voorbeeld van Python REST API met Flask, draaiend in Stackhero Code-Hero, met de server (1) en de client die cURL gebruikt (2)

Omgevingsvariabelen zijn essentieel voor het beschermen van gevoelige informatie, zoals database-inloggegevens of API-sleutels. Er zijn twee belangrijke voordelen aan het gebruik van omgevingsvariabelen:

  1. Uw geheimen worden niet opgeslagen in uw Git-repository, waardoor onbevoegden geen toegang hebben tot uw gevoelige gegevens, zelfs als ze toegang krijgen tot uw broncode.
  2. U kunt verschillende inloggegevens gebruiken voor verschillende omgevingen (bijvoorbeeld productie versus ontwikkeling).

Om omgevingsvariabelen te beheren, gebruiken we de python-dotenv module. Installeer deze eerst als u dat nog niet heeft gedaan:

pip install python-dotenv
pip freeze > requirements.txt

Maak vervolgens een .env bestand in de hoofdmap van uw project en voeg uw ontwikkelomgevingsvariabelen toe. Bijvoorbeeld:

ENV="development"
DATABASE_PASSWORD="secretPassword"
THIRD_API_PRIVATE_KEY="secretKey"

Voeg ten slotte het .env bestand toe aan uw .gitignore om de veiligheid te waarborgen:

echo ".env" >> .gitignore

Om toegang te krijgen tot deze omgevingsvariabelen in Python, gebruikt u eenvoudig os.environ.get():

import os

print(os.environ.get('ENV'))

Het .env bestand wordt alleen gebruikt voor de ontwikkelomgeving. Voor staging of productie stelt u de omgevingsvariabelen in op het Stackhero dashboard in uw Python serviceconfiguratie.

Hoewel deze gids de ingebouwde ontwikkelserver van Flask gebruikt, is het voor productie essentieel om een productieklare WSGI-server zoals Gunicorn te gebruiken. Volg deze stappen:

  1. Installeer Gunicorn:

    pip install gunicorn
    pip freeze > requirements.txt
    
  2. Start uw app met Gunicorn met het app:app argument (waarbij de eerste app de bestandsnaam is en de tweede app de Flask-instantie):

    ENV=production gunicorn app:app \
      --error-logfile - \
      -b 0.0.0.0:8080
    
  3. Maak een Makefile om het schakelen tussen ontwikkel- en productiemodi te vereenvoudigen:

    .DEFAULT_GOAL := dev
    
    # Standaard voert Stackhero voor Python de "run" regel uit. We overschrijven deze om de 'prod' regel uit te voeren.
    run: prod
    
    prod:
     	ENV=production gunicorn app:app \
     	  --error-logfile - \
     	  -b 0.0.0.0:8080
    
    dev:
     	python app.py
    

U kunt uw server in ontwikkelmodus uitvoeren met make dev (of gewoon make), en in productiemodus met make prod.

De eenvoudigste manier om uw Python-project te implementeren is door gebruik te maken van de Stackhero Python cloud hosting service. Belangrijke kenmerken zijn:

  • Implementatie met een eenvoudige git push
  • Aanpasbaar domein met automatische TLS-certificaatbeheer (HTTPS)
  • Draait op een privé en toegewijde VM voor maximale veiligheid
  • Ondersteunt HTTP/2, TLS 1.3 (HTTPS), WebSockets, GZIP & Brotli compressie, ETag, en toegang tot TCP/UDP poorten

Om uw code naar Stackhero te implementeren, volgt u deze stappen:

  1. Haal uw publieke sleutel op met:

    cat ~/.ssh/id_*.pub
    
  2. Ga in het Stackhero dashboard naar uw "Stackhero for Python" service en klik op de "Configure" knop.

  3. Kopieer de publieke sleutel van de eerste stap en plak deze in het veld "SSH public keys" of "Key".

  4. Valideer de configuratie door op de "Validate" knop onderaan de pagina te klikken.

"Stackhero for Python" publieke sleutel configuratie"Stackhero for Python" publieke sleutel configuratie

Heeft u geen SSH-sleutels? Maak ze aan door uit te voeren:

ssh-keygen -t ed25519

Configureer ten slotte uw repository om naar Stackhero te implementeren. Voeg in uw projectmap een Git remote toe met behulp van het commando dat in uw Stackhero-service wordt verstrekt (vervang <XXXXXX> door het domein van uw service):

git remote add stackhero ssh://stackhero@<XXXXXX>.stackhero-network.com:222/project.git

Git remote commandoGit remote commando

Zodra alles is geconfigureerd, implementeert u uw code naar productie met een enkel commando:

git push stackhero main

Zorg ervoor dat u uw wijzigingen toevoegt en commit voordat u uw code naar productie pusht. In Stackhero Code-Hero, kunt u snel wijzigingen committen met behulp van de Command Palette (druk op Ctrl+Shift+P op Windows/Linux of Cmd+Shift+P op macOS en typ Git: Commit).

Na implementatie bezoekt u uw API-URL op https://<XXXXXX>.stackhero-network.com/api/tasks (vervang <XXXXXX> door het domein van uw service) om uw Flask API in actie te zien.

Door deze gids te volgen, begrijpt u nu hoe u een REST API kunt maken met Flask. Met deze kennis kunt u vol vertrouwen uw RESTful applicaties ontwikkelen en uitbreiden, en ze integreren met verschillende front-end en back-end services.