Python: Een REST API maken

Stapsgewijze handleiding voor het bouwen van een REST API met Flask in Python

👋 Welkom bij de Stackhero-documentatie!

Stackhero biedt een kant-en-klare Python cloud oplossing die uw deploymentproces vereenvoudigt:

  • Deploy uw applicatie naar productie in enkele seconden met een simpele git push.
  • Gebruik uw eigen domeinnaam, met automatische HTTPS-certificaatconfiguratie voor veilige verbindingen die volledig voor u geregeld worden.
  • Profiteer van automatische back-ups, one-click updates en voorspelbare prijzen, zodat u zich kunt richten op uw code en niet op infrastructuurbeheer.
  • Geniet van uitstekende performance en security op een private, dedicated infrastructuur. Uw omgeving is geïsoleerd en beveiligd.

Bespaar tijd en vereenvoudig uw workflow: uw code draait binnen 5 minuten op Stackhero's Python cloud hosting.

Deze handleiding laat zien hoe u een eenvoudige REST API maakt met Python en Flask. Flask is een lichtgewicht micro-framework waarmee u snel webapplicaties en API's kunt ontwikkelen.

Zorg ervoor dat u de volgende tools hebt geïnstalleerd voordat u begint:

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

Heeft u hulp nodig bij het opzetten van uw omgeving? Raadpleeg dan de Development platform handleiding. U kunt ook direct aan de slag met de online Code-Hero omgeving. Code-Hero biedt een online IDE en terminal, met alle essentiële tools vooraf geïnstalleerd. Zo kunt u zich richten op uw code in plaats van installatie en configuratie.

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

Begin met het aanmaken van een nieuwe projectmap. In dit voorbeeld heet het project myRestApi:

mkdir myRestApi
cd myRestApi

Stel de Python-versie in op de nieuwste beschikbare versie met asdf en initialiseer een 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 heeft u slechts één hoofddependency nodig: Flask.

Flask is ontworpen om eenvoudig en snel te zijn, zodat u web-API's kunt bouwen en uitrollen zonder extra overhead. Het biedt standaard ondersteuning voor routing, templating en HTTP request handling, waardoor u in enkele minuten van idee naar werkende API kunt gaan.

U kunt Flask en python-dotenv installeren met pip:

pip install Flask python-dotenv

We voegen python-dotenv toe om omgevingsvariabelen veilig en gemakkelijk te beheren. U ziet het gebruik hiervan in de volgende stappen.

Na installatie kunt u uw dependencies vastleggen in een requirements.txt bestand:

pip freeze > requirements.txt

Door dependencies vast te leggen, zorgt u ervoor dat iedereen dezelfde pakketversies gebruikt. Deze kleine stap kan u later uren aan troubleshooting besparen.

Nu bent u klaar om uw API-code te schrijven.

Maak een bestand genaamd app.py aan en voeg deze code toe:

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

# Laad omgevingsvariabelen uit .env voor niet-productieomgevingen
if os.environ.get('ENV') != 'production':
    load_dotenv()

app = Flask(__name__)

# Voorbeeld taken-data
tasks = [
    {
        'id': 1,
        'title': 'Buy groceries',
        'description': 'Milk, Cheese, Pizza, Fruits',
        'done': False
    },
    {
        'id': 2,
        'title': 'Learn Python',
        'description': 'Learn Python programming basics',
        'done': False
    }
]

@app.route('/api/tasks', methods=['GET'])
def get_tasks():
    return jsonify({'tasks': tasks})

@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 not task:
        return jsonify({'error': 'Task not found'}), 404
    return jsonify({'task': task[0]})

@app.route('/api/tasks', methods=['POST'])
def create_task():
    if not request.json or 'title' not in request.json:
        return jsonify({'error': 'Title is required'}), 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

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

U kunt de server starten met:

python app.py

Met host='0.0.0.0' is uw API toegankelijk via uw browser wanneer u Code-Hero gebruikt. Ga naar http://<XXXXXX>.stackhero-network.com:8080/api/tasks, waarbij u <XXXXXX> vervangt door uw Code-Hero domein.

Zodra de server draait, kunt u met cURL communiceren met uw API. Hier enkele voorbeeldcommando's:

  • Alle taken ophalen:

    curl -s http://localhost:8080/api/tasks
    # Output:
    # {
    #   "tasks": [
    #     ...
    #   ]
    # }
    
  • Een specifieke taak ophalen (ID 2):

    curl -s http://localhost:8080/api/tasks/2
    # Output:
    # {
    #   "task": {
    #     ...
    #   }
    # }
    
  • Een nieuwe taak aanmaken:

    curl -s -X POST -H "Content-Type: application/json" \
    -d '{"title": "New task", "description": "Created with cURL"}' \
    http://localhost:8080/api/tasks
    # Output:
    # {
    #   "task": {
    #     ...
    #   }
    # }
    

Tip: Voor overzichtelijkere output kunt u het resultaat doorsturen naar jq. Bijvoorbeeld, curl -s http://localhost:8080/api/tasks/2 | jq maakt de JSON beter leesbaar.

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

Omgevingsvariabelen helpen u om gevoelige gegevens zoals databasewachtwoorden of API-sleutels te beschermen. Door ze te gebruiken, houdt u gevoelige data buiten uw codebase en Git-geschiedenis, en kunt u eenvoudig verschillende instellingen per omgeving toepassen.

Voor het beheren van omgevingsvariabelen kunt u de module python-dotenv gebruiken. Als u deze eerder niet heeft geïnstalleerd, kunt u dat nu alsnog doen:

pip install python-dotenv
pip freeze > requirements.txt

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

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

Voeg .env toe aan uw .gitignore zodat dit bestand niet in Git wordt opgenomen:

echo ".env" >> .gitignore

U kunt deze variabelen in Python benaderen met os.environ.get():

import os

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

Het .env bestand is alleen bedoeld voor ontwikkeling. Voor productie of staging kunt u omgevingsvariabelen direct instellen in uw Stackhero dashboard bij de configuratie van uw Python-service.

De ingebouwde server van Flask is ideaal voor ontwikkeling. Voor productie gebruikt u bij voorkeur een robuuste WSGI-server zoals Gunicorn. Zo bereidt u zich voor:

  1. Installeer Gunicorn:

    pip install gunicorn
    pip freeze > requirements.txt
    
  2. Start uw app met Gunicorn:

    ENV=production gunicorn app:app \
      --error-logfile - \
      -b 0.0.0.0:8080
    

    Hier verwijst app:app naar uw bestand (app.py) en de Flask applicatie-instantie (app).

  3. U kunt een Makefile toevoegen om eenvoudig te schakelen tussen ontwikkel- en productiemodus:

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

U kunt de server starten in ontwikkelmodus met make dev (of gewoon make), of in productiemodus met make prod.

Stackhero maakt cloud deployment eenvoudig en veilig. U kunt uw Python-project uitrollen met de Python cloud hosting service. Functionaliteiten zijn onder andere:

  • Deployen met één enkele git push
  • Automatische TLS (HTTPS) met aanpasbare domeinen
  • Dedicated infrastructuur voor veiligheid
  • Ondersteuning voor HTTP/2, TLS 1.3, WebSockets, GZIP & Brotli, ETag, en zowel TCP/UDP poorttoegang

Volg deze stappen om te deployen:

  1. Haal uw publieke SSH-sleutel op:

    cat ~/.ssh/id_*.pub
    
  2. Open in het Stackhero dashboard uw "Stackhero for Python" service en kies "Configure".

  3. Plak uw publieke sleutel in het veld "SSH public keys" of "Key".

  4. Klik op "Validate" om uw configuratie te bevestigen.

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

Heeft u nog geen SSH-sleutels? U kunt ze genereren met:

ssh-keygen -t ed25519

Voeg een Git remote toe aan uw project met het commando uit uw Stackhero-service (vervang <XXXXXX> door uw servicedomein):

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

Git remote commandoGit remote commando

Wanneer u klaar bent om te deployen, pusht u uw code met:

git push stackhero main

Vergeet niet uw wijzigingen te committen voordat u gaat deployen. In Stackhero Code-Hero kunt u de Command Palette (Ctrl+Shift+P of Cmd+Shift+P) gebruiken en Git: Commit typen voor snelle commits.

Na deployment is uw API live op https://<XXXXXX>.stackhero-network.com/api/tasks. Vervang <XXXXXX> door uw servicedomein om toegang te krijgen tot uw Flask API.

U heeft nu een werkende REST API gebouwd met Flask. Met deze basis is het eenvoudig om uw applicatie uit te breiden, te koppelen aan databases of te integreren met andere diensten. Flask biedt u de flexibiliteit om van een eenvoudig prototype door te groeien naar een volwaardige productie-API.