Wie man eine Flask- oder FastAPI-API auf OuiPanel bereitstellt
Geschätzte Zeit: 15 Minuten
Schwierigkeit: Mittel ⭐⭐
Servertyp: Python
📋 Einführung
Dieser Leitfaden erklärt Ihnen, wie Sie eine mit Flask oder FastAPI entwickelte REST-API auf OuiPanel hosten. Ihre API wird rund um die Uhr, 7 Tage die Woche erreichbar sein und die Möglichkeit bieten, eine benutzerdefinierte Domain und HTTPS hinzuzufügen.
Flask vs FastAPI
| Kriterium | Flask | FastAPI |
|---|---|---|
| Schwierigkeit | Anfänger | Mittel |
| Installation | Einfach (keine Kompilierung) | Aufwendig (Rust-Kompilierung) |
| Benötigter Festplattenspeicher | ~100 MB | Mindestens ~5 GB |
| Leistung | Gut | Hervorragend (async) |
| Automatische Dokumentation | Nein (Erweiterung) | Ja (Swagger/OpenAPI) |
| Datenvalidierung | Manuell | Automatisch (Pydantic) |
| Ideal für | Einfache APIs, kleine Server | Moderner APIs, große Server |
💡 Empfehlung: Wenn Sie einen Server mit wenig Speicherplatz (< 5 GB) haben, verwenden Sie Flask.
Was Sie benötigen
| Voraussetzung | Beschreibung |
|---|---|
| 📁 Ihren API-Code | Python-Dateien (app.py, main.py...) |
| 🐍 Einen Python-Server | Auf OuiHeberg bestellt |
| 🌐 Eine Domain | (Optional) Für den Zugriff über eine benutzerdefinierte URL |
💡 Sie haben noch keinen Python-Server?
Bestellen Sie einen unter: https://www.ouiheberg.com/fr/hebergement-python
📁 Schritt 1: Vorbereiten der API-Dateien
Dateistruktur
Ihre API sollte diese Struktur haben:
📁 MeineAPI/
├── 📄 app.py ← Hauptdatei (oder main.py)
├── 📄 requirements.txt ← Python-Abhängigkeiten
├── 📄 .env ← Umgebungsvariablen (auf dem Server erstellt)
└── 📁 routes/ ← (Optional) Ordner für Routen
🌶️ Option A: API mit Flask
Datei requirements.txt (Flask)
flask==2.3.3
python-dotenv==1.0.0
werkzeug==2.3.7
| Paket | Beschreibung |
|---|---|
flask | Minimalistisches Webframework |
python-dotenv | Lädt Variablen aus .env |
werkzeug | WSGI-Hilfsprogramme (im Lieferumfang von Flask enthalten) |
⚠️ Wichtig: Verwenden Sie diese genauen Versionen, um Kompatibilitätsprobleme zu vermeiden.
Hauptdatei (app.py) - Flask
import os
from dotenv import load_dotenv
# Variablen aus .env laden
load_dotenv()
from flask import Flask, jsonify, request
# Flask-Anwendung erstellen
app = Flask(__name__)
# ============================================
# API-ROUTEN
# ============================================
# Hauptroute
@app.route('/')
def home():
return jsonify({
'status': 'online',
'message': 'Willkommen bei meiner Flask-API!',
'version': '1.0.0'
})
# Gesundheitsroute (Health Check)
@app.route('/health')
def health():
return jsonify({
'status': 'gesund',
'service': 'Meine Flask-API'
})
# Beispieldaten (simuliert eine Datenbank)
items = [
{'id': 1, 'name': 'Artikel 1', 'price': 10.99},
{'id': 2, 'name': 'Artikel 2', 'price': 24.99},
{'id': 3, 'name': 'Artikel 3', 'price': 5.49}
]
# GET alle Elemente
@app.route('/api/items', methods=['GET'])
def get_items():
return jsonify({
'success': True,
'data': items,
'count': len(items)
})
# GET ein Element nach ID
@app.route('/api/items/<int:item_id>', methods=['GET'])
def get_item(item_id):
for item in items:
if item['id'] == item_id:
return jsonify({
'success': True,
'data': item
})
return jsonify({
'success': False,
'error': 'Element nicht gefunden'
}), 404
# POST ein Element erstellen
@app.route('/api/items', methods=['POST'])
def create_item():
data = request.get_json()
if not data or 'name' not in data:
return jsonify({
'success': False,
'error': 'Das Feld "name" ist erforderlich'
}), 400
new_id = max(item['id'] for item in items) + 1 if items else 1
new_item = {
'id': new_id,
'name': data['name'],
'price': data.get('price', 0)
}
items.append(new_item)
return jsonify({
'success': True,
'message': 'Element erfolgreich erstellt',
'data': new_item
}), 201
# PUT ein Element aktualisieren
@app.route('/api/items/<int:item_id>', methods=['PUT'])
def update_item(item_id):
data = request.get_json()
for item in items:
if item['id'] == item_id:
item['name'] = data.get('name', item['name'])
item['price'] = data.get('price', item['price'])
return jsonify({
'success': True,
'message': 'Element erfolgreich aktualisiert',
'data': item
})
return jsonify({
'success': False,
'error': 'Element nicht gefunden'
}), 404
# DELETE ein Element löschen
@app.route('/api/items/<int:item_id>', methods=['DELETE'])
def delete_item(item_id):
for index, item in enumerate(items):
if item['id'] == item_id:
items.pop(index)
return jsonify({
'success': True,
'message': f'Element {item_id} erfolgreich gelöscht'
})
return jsonify({
'success': False,
'error': 'Element nicht gefunden'
}), 404
# ============================================
# FEHLERBEHANDLUNG
# ============================================
@app.errorhandler(404)
def not_found(error):
return jsonify({
'success': False,
'error': 'Ressource nicht gefunden'
}), 404
@app.errorhandler(500)
def internal_error(error):
return jsonify({
'success': False,
'error': 'Interner Serverfehler'
}), 500
# ============================================
# SERVERSTART
# ============================================
if __name__ == '__main__':
# Port: Verwenden Sie SERVER_PORT (OuiPanel) oder standardmäßig 5000
port = int(os.getenv('SERVER_PORT', 5000))
# WICHTIG: Auf 0.0.0.0 für OuiPanel hören
app.run(host='0.0.0.0', port=port)
⚠️ WICHTIG: Die API muss auf
0.0.0.0und nicht auflocalhostoder127.0.0.1hören, um von außen erreichbar zu sein.
⚡ Option B: API mit FastAPI
⚠️ Achtung: FastAPI erfordert
pydantic, das kompiliert werden muss. Dies erfordert viel Festplattenspeicher (mehrere GB) während der Installation. Wenn Sie einen FehlerNo space left on deviceerhalten, verwenden Sie stattdessen Flask oder erhöhen Sie den Speicherplatz Ihres Servers.
Datei requirements.txt (FastAPI)
fastapi==0.104.1
uvicorn==0.24.0
python-dotenv==1.0.0
| Paket | Beschreibung |
|---|---|
fastapi | Modernes und schnelles Webframework |
uvicorn | ASGI-Server für FastAPI |
python-dotenv | Lädt Variablen aus .env |
💡 Speicherempfehlung: Planen Sie mindestens 5 GB freien Speicherplatz für die Installation von FastAPI ein.
Hauptdatei (app.py) - FastAPI
import os
from dotenv import load_dotenv
# Lade Umgebungsvariablen aus .env
load_dotenv()
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Optional, List
# Erstelle die FastAPI-Anwendung
app = FastAPI(
title="Meine FastAPI-API",
description="Eine moderne REST-API mit FastAPI",
version="1.0.0",
docs_url="/docs", # Swagger-Dokumentation
redoc_url="/redoc" # ReDoc-Dokumentation
)
# ============================================
# PYDANTIC-MODELLE (Datenvalidierung)
# ============================================
class ItemCreate(BaseModel):
name: str
price: float = 0
description: Optional[str] = None
class Item(BaseModel):
id: int
name: str
price: float
description: Optional[str] = None
# ============================================
# BEISPIELDATEN (simuliert eine Datenbank)
# ============================================
items_db = [
{"id": 1, "name": "Artikel 1", "price": 10.99, "description": "Erster Artikel"},
{"id": 2, "name": "Artikel 2", "price": 24.99, "description": "Zweiter Artikel"},
{"id": 3, "name": "Artikel 3", "price": 5.49, "description": "Dritter Artikel"},
]
# ============================================
# API-ROUTEN
# ============================================
# Hauptroute
@app.get("/", tags=["Allgemein"])
async def home():
return {
"status": "online",
"message": "Willkommen bei meiner FastAPI-API!",
"version": "1.0.0",
"docs": "/docs"
}
# Gesundheitsroute (Health Check)
@app.get("/health", tags=["Allgemein"])
async def health():
return {
"status": "gesund",
"service": "Meine FastAPI-API"
}
# GET alle Elemente
@app.get("/api/items", tags=["Elemente"])
async def get_items():
return {
"success": True,
"data": items_db,
"count": len(items_db)
}
# GET ein Element nach ID
@app.get("/api/items/{item_id}", tags=["Elemente"])
async def get_item(item_id: int):
for item in items_db:
if item["id"] == item_id:
return {"success": True, "data": item}
raise HTTPException(status_code=404, detail="Element nicht gefunden")
# POST erstelle ein Element
@app.post("/api/items", status_code=201, tags=["Elemente"])
async def create_item(item: ItemCreate):
new_id = max(i["id"] for i in items_db) + 1 if items_db else 1
new_item = {
"id": new_id,
"name": item.name,
"price": item.price,
"description": item.description
}
items_db.append(new_item)
return {
"success": True,
"message": "Element erfolgreich erstellt",
"data": new_item
}
# PUT aktualisiere ein Element
@app.put("/api/items/{item_id}", tags=["Elemente"])
async def update_item(item_id: int, item: ItemCreate):
for index, existing_item in enumerate(items_db):
if existing_item["id"] == item_id:
updated_item = {
"id": item_id,
"name": item.name,
"price": item.price,
"description": item.description
}
items_db[index] = updated_item
return {
"success": True,
"message": "Element erfolgreich aktualisiert",
"data": updated_item
}
raise HTTPException(status_code=404, detail="Element nicht gefunden")
# DELETE lösche ein Element
@app.delete("/api/items/{item_id}", tags=["Elemente"])
async def delete_item(item_id: int):
for index, item in enumerate(items_db):
if item["id"] == item_id:
items_db.pop(index)
return {"success": True, "message": f"Element {item_id} gelöscht"}
raise HTTPException(status_code=404, detail="Element nicht gefunden")
# ============================================
# SERVERSTART
# ============================================
if __name__ == "__main__":
import uvicorn
# Port: Verwenden Sie SERVER_PORT (OuiPanel) oder standardmäßig 8000
port = int(os.getenv('SERVER_PORT', 8000))
# WICHTIG: Auf 0.0.0.0 für OuiPanel hören
uvicorn.run(app, host="0.0.0.0", port=port)
💡 FastAPI-Bonus: Die interaktive Dokumentation wird automatisch generiert!
- Swagger UI:
http://your-ip:port/docs- ReDoc:
http://your-ip:port/redoc
📤 Schritt 2: Dateien auf OuiPanel hochladen
Über den Dateimanager
- Melden Sie sich bei OuiPanel an
- Wählen Sie Ihren Python-Server aus
- Klicken Sie im Seitenmenü auf Dateimanager

- Löschen Sie die Standarddateien (falls vorhanden)
- Klicken Sie auf Hochladen
- Laden Sie Ihre Dateien hoch:
app.py(odermain.py)requirements.txt- Ihre Ordner (
routes/,models/...) falls erforderlich

⚠️ Nicht hochladen: Die Datei
.envwird direkt auf dem Server erstellt (sicherer).
Über SFTP (Empfohlen für mehrere Dateien)
- Melden Sie sich mit FileZilla über SFTP an
- Ziehen Sie den gesamten Inhalt Ihres API-Ordners per Drag & Drop
- Überprüfen Sie, ob alle Dateien erfolgreich hochgeladen wurden
📖 Lesen Sie den Leitfaden "SFTP-Zugriff mit FileZilla" für detaillierte Anweisungen.
🔑 Schritt 3: Erstellen der .env-Datei
Erstellen der .env-Datei
- Klicken Sie im Dateimanager auf Neue Datei
- Benennen Sie sie
.env(mit Punkt davor) - Fügen Sie Ihre Variablen hinzu:
# API-Konfiguration
DEBUG=false
PORT=8000
# Datenbank (falls erforderlich)
DATABASE_URL=mysql://user:password@host:3306/database
# API-Schlüssel (Beispiele)
API_KEY=your_secret_api_key
SECRET_KEY=your_secret_key_for_jwt

- Klicken Sie auf Erstellen oder Speichern
⚠️ Wichtig:
- Keine Leerzeichen um das
=- Keine Anführungszeichen um einfache Werte
- Teilen Sie diese Datei niemals
⚙️ Schritt 4: Konfigurieren der Startdatei
OuiPanel muss wissen, welche Python-Datei beim Start ausgeführt werden soll.
Zugriff auf die Einstellungen
- Im Seitenmenü auf Konfiguration klicken
- Auf Servereinstellungen klicken

Datei zum Ausführen konfigurieren
Suchen Sie das Feld Ausführungsdatei (oder Main File / Startup File):
| Ihre Hauptdatei | Zu setzender Wert |
|---|---|
app.py | app.py |
main.py | main.py |
api.py | api.py |
src/app.py | src/app.py |
⚠️ Wichtig: Der Name muss genau mit Ihrer Datei übereinstimmen (Groß-/Kleinschreibung beachten).
🚀 Schritt 5: Starten der API
Server starten
- Im Seitenmenü auf Konsole klicken
- Auf Starten klicken
Automatische Installation von Abhängigkeiten
Beim ersten Start installiert der Server automatisch die Pakete:
Flask :
Installing requirements from requirements.txt...
Successfully installed flask-3.0.0 python-dotenv-1.0.0 gunicorn-21.2.0
Running app.py...
* Running on http://0.0.0.0:25639
FastAPI :
Installing requirements from requirements.txt...
Successfully installed fastapi-0.109.0 uvicorn-0.27.0 python-dotenv-1.0.0
Running app.py...
INFO: Uvicorn running on http://0.0.0.0:25639 ✅ Schritt 6: API testen
Adresse abrufen
- Notieren Sie den Port, der in der Konsole angezeigt wird (z. B.:
25639) - Holen Sie sich die IP Ihres Servers aus der Übersicht
- Die Adresse Ihrer API lautet:
http://IP:PORT
Beispiel: http://51.77.xxx.xxx:25639


Endpunkte testen
Mit einem Browser:
- Öffnen Sie
http://51.77.xxx.xxx:25639/→ Sollte das Willkommens-JSON anzeigen - Öffnen Sie
http://51.77.xxx.xxx:25639/health→ Health-Check - (FastAPI) Öffnen Sie
http://51.77.xxx.xxx:25639/docs→ Swagger-Dokumentation
Mit curl:
# GET - Startseite
curl http://51.77.xxx.xxx:25639/
# GET - Liste der Elemente
curl http://51.77.xxx.xxx:25639/api/items
# GET - Ein bestimmtes Element
curl http://51.77.xxx.xxx:25639/api/items/1
# POST - Ein Element erstellen
curl -X POST http://51.77.xxx.xxx:25639/api/items \
-H "Content-Type: application/json" \
-d '{"name": "Neues Element", "price": 29.99}'
# PUT - Ein Element bearbeiten
curl -X PUT http://51.77.xxx.xxx:25639/api/items/1 \
-H "Content-Type: application/json" \
-d '{"name": "Geändertes Element", "price": 39.99}'
# DELETE - Ein Element löschen
curl -X DELETE http://51.77.xxx.xxx:25639/api/items/1
Mit Postman / Insomnia:
- Importieren Sie die Basis-URL:
http://51.77.xxx.xxx:25639 - Testen Sie Ihre verschiedenen Endpunkte

🌐 Schritt 7: Konfigurieren eines Domainnamens (Proxy Manager)
Um auf Ihre API über eine saubere URL mit HTTPS zuzugreifen (z. B.: https://api.monsite.com), verwenden Sie den Proxy Manager.
DNS konfigurieren
- In OuiPanel → Proxy Manager, notieren Sie die IP des Proxys
- Bei Ihrem Registrar (OVH, Cloudflare, etc.) erstellen Sie einen DNS-Eintrag:
| Typ | Name | Wert |
|---|---|---|
A | api | IP des Proxys |
Domain in OuiPanel hinzufügen
- Im Seitenmenü auf Proxy Manager klicken
- Auf Hinzufügen klicken
- Ausfüllen:
| Feld | Wert |
|---|---|
| Domainname | api.monsite.com |
| Port | Der Port Ihrer API (z. B.: 25639) |
| SSL | ✅ Aktiviert |

- Auf Weiterleitung erstellen klicken
Ergebnis
Ihre API ist jetzt erreichbar über:
- ✅
https://api.monsite.com(mit automatischem HTTPS) - ✅ Kostenloses SSL-Zertifikat (Let's Encrypt)
Beispielaufruf:
curl https://api.monsite.com/api/items
📖 Lesen Sie den Leitfaden "Konfigurieren eines Domainnamens mit dem Proxy Manager" für weitere Details.
🗄️ Bonus: Verbindung zu einer Datenbank
MySQL mit Flask (PyMySQL)
Fügen Sie in requirements.txt hinzu:
pymysql==1.1.0
Beispielverbindung:
import pymysql
import os
# Verbindung zu MySQL
connection = pymysql.connect(
host=os.getenv('DB_HOST', 'localhost'),
user=os.getenv('DB_USER', 'root'),
password=os.getenv('DB_PASSWORD', ''),
database=os.getenv('DB_NAME', 'mydb'),
charset='utf8mb4'
)
# Beispielabfrage
with connection.cursor() as cursor:
cursor.execute("SELECT * FROM items")
result = cursor.fetchall()
Zu ergänzende .env-Variablen:
DB_HOST=mysql-host.ouiheberg.com
DB_USER=your_user
DB_PASSWORD=your_password
DB_NAME=your_db
📖 Lesen Sie den Leitfaden "Erstellen und Verwalten einer MySQL-Datenbank", um Ihre Datenbank zu erstellen.
🔧 Fehlerbehebung
Die API startet nicht
| ❌ Fehler | ✅ Lösung |
|---|---|
ModuleNotFoundError: No module named 'flask' | Überprüfen Sie requirements.txt und starten Sie neu |
ModuleNotFoundError: No module named 'fastapi' | Überprüfen Sie requirements.txt und starten Sie neu |
ModuleNotFoundError: No module named 'dotenv' | Fügen Sie python-dotenv zu requirements.txt hinzu |
SyntaxError | Fehler in Ihrem Python-Code |
Fehler "No space left on device" (FastAPI)
Dieser Fehler tritt auf, wenn pydantic-core (eine Abhängigkeit von FastAPI) mit Rust kompiliert werden muss:
Fehler: No space left on device (os error 28)
ERROR: Failed building wheel for pydantic-core
| ✅ Lösungen |
|---|
| 1. Utilisez Flask à la place (ne nécessite pas de compilation) |
| 2. Augmentez le stockage de votre serveur (5+ Go recommandés) |
| 3. Nettoyez les fichiers temporaires et réessayez |
💡 Recommandation : Pour les petits serveurs avec peu de stockage, Flask est plus adapté que FastAPI.
L'API démarre mais n'est pas accessible
| ❌ Cause | ✅ Solution |
|---|---|
Écoute sur localhost | Changez pour 0.0.0.0 |
| Mauvais port | Utilisez os.getenv('SERVER_PORT') |
Vérifiez votre code :
# ❌ MAUVAIS - écoute uniquement en local
app.run(host='localhost', port=5000)
app.run(host='127.0.0.1', port=5000)
# ✅ BON - écoute sur toutes les interfaces
app.run(host='0.0.0.0', port=port)
uvicorn.run(app, host='0.0.0.0', port=port)
Erreur 502 Bad Gateway (Proxy Manager)
| ❌ Cause | ✅ Solution |
|---|---|
| API non démarrée | Démarrez le serveur dans OuiPanel |
| Mauvais port dans Proxy Manager | Vérifiez le port configuré |
| API crashée | Consultez la Console |
Le fichier .env n'est pas lu
| ❌ Cause | ✅ Solution |
|---|---|
| python-dotenv pas installé | Vérifiez requirements.txt |
| load_dotenv() pas appelé | Ajoutez load_dotenv() au début du fichier |
| Fichier mal nommé | Le fichier doit s'appeler exactement .env |
Erreur CORS
Si vous appelez votre API depuis un frontend (React, Vue, etc.) :
| ❌ Erreur | ✅ Solution |
|---|---|
Access-Control-Allow-Origin | Ajoutez Flask-CORS ou CORSMiddleware (voir section Sécurité) |
🔒 Sécurité
Fichier .env
| ✅ À faire | ❌ À ne pas faire |
|---|---|
Créer le .env sur le serveur | Uploader le .env depuis votre PC |
Ajouter .env au .gitignore | Commit le .env sur GitHub |
| Utiliser des variables pour les secrets | Mettre les clés API dans le code |
Bonnes pratiques API
- ✅ Validez toujours les entrées utilisateur
- ✅ Utilisez HTTPS en production (Proxy Manager)
- ✅ Ne pas exposer les erreurs détaillées en production
- ✅ Ajoutez une authentification pour les routes sensibles
Activer CORS (si nécessaire)
Si votre API est appelée depuis un frontend (React, Vue, etc.) sur un autre domaine :
Flask - Ajoutez flask-cors :
# requirements.txt
flask-cors==4.0.0
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
FastAPI - Le middleware est déjà disponible :
from fastapi.middleware.cors import CORSMiddleware
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"],
)
📂 Structure Avancée (Recommandée)
Pour une API plus complexe, organisez votre code :
📁 MonAPI/
├── 📄 app.py ← Point d'entrée
├── 📄 requirements.txt
├── 📄 .env
├── 📁 routes/
│ ├── 📄 __init__.py
│ ├── 📄 items.py ← Routes /api/items
│ └── 📄 users.py ← Routes /api/users
├── 📁 models/
│ └── 📄 item.py ← Modèle Item
└── 📁 utils/
└── 📄 helpers.py ← Fonctions utilitaires
💡 Pour les grosses APIs, cette structure permet de mieux organiser le code et facilite la maintenance.
📝 Récapitulatif
1. Choisir le framework (Flask ou FastAPI)
2. Préparer les fichiers (app.py + requirements.txt avec python-dotenv)
3. S'assurer que le serveur écoute sur 0.0.0.0:PORT
4. Uploader les fichiers sur OuiPanel (sans le .env)
5. Créer le fichier .env sur le serveur
6. Configurer le fichier de démarrage (app.py, main.py...)
7. Démarrer le serveur
8. Tester via http://IP:PORT
9. (Optionnel) Configurer le Proxy Manager pour HTTPS
ENDPOINTS DE TEST :
├── GET / → Page d'accueil
├── GET /health → Health check
├── GET /api/items → Liste des items
├── GET /api/items/1 → Un item
├── POST /api/items → Créer un item
├── PUT /api/items/1 → Modifier un item
└── DELETE /api/items/1 → Supprimer un item
(FastAPI) Documentation auto :
├── /docs → Swagger UI
└── /redoc → ReDoc
