A lightweight Python web server library with zero external dependencies
Project description
QuickServe
Une librairie Python légère pour créer un serveur web simple sans dépendances externes.
Améliorations v1.1.0
✨ Cookies - Support natif de lecture/écriture de cookies
✨ CORS - Activation facile de CORS
✨ Logging - Logging structuré en mode debug
✨ Réponses HTML - Classe HtmlResponse pour HTML
✨ Redirections - Classe RedirectResponse pour redirects
✨ Middleware - Système extensible de middleware
✨ Fichiers statiques - Classe StaticFileServer
✨ OPTIONS - Support de la méthode OPTIONS
Caractéristiques
✅ Serveur HTTP - Lance sur n'importe quel port et host
✅ Routes simples - Utilisez des décorateurs pour définir les routes
✅ Réponses flexibles - Texte, JSON, HTML ou réponses personnalisées
✅ Zéro dépendances - Utilise uniquement la stdlib Python
✅ Paramètres de route - Support des chemins dynamiques (ex: /users/{id})
✅ Méthodes HTTP - GET, POST, PUT, DELETE, PATCH, OPTIONS
✅ Requêtes complètes - Accès aux paramètres, body, headers, cookies
✅ Cookies - Lecture et écriture facile de cookies
✅ CORS - Support natif de CORS
✅ Logging - Logging configurable
✅ Middleware - Système de middleware extensible
✅ Fichiers statiques - Support pour servir des fichiers statiques
Installation
cd quickserve
python example.py
Utilisation rapide
from quickserve import QuickServer, JsonResponse, TextResponse, HtmlResponse
app = QuickServer(port=5000, host='localhost', cors=True, debug=True)
# Route simple
@app.get('/')
def hello(request):
return 'Hello, World!'
# Réponse JSON
@app.get('/api/data')
def get_data(request):
return JsonResponse({'key': 'value'})
# Paramètres de route
@app.get('/users/{user_id}')
def get_user(request, user_id):
return JsonResponse({'id': user_id, 'name': f'User {user_id}'})
# POST avec body
@app.post('/api/users')
def create_user(request):
data = request['body'] # JSON body
return JsonResponse({'created': True, 'id': 1}, status_code=201)
# Requête GET avec paramètres
@app.get('/search')
def search(request):
query = request['query'].get('q', '') # ?q=terme
return JsonResponse({'query': query, 'results': []})
# Gestion des cookies
@app.get('/login')
def login(request):
response = JsonResponse({'logged_in': True})
response.set_cookie('session', 'abc123', max_age=3600)
return response
if __name__ == '__main__':
app.run(debug=True)
API
QuickServer
app = QuickServer(
port=8000, # Port du serveur
host='localhost', # Host (127.0.0.1, 0.0.0.0, etc)
cors=True, # Activer CORS
cors_origin='*', # Origine CORS
debug=True # Mode debug
)
app.run(debug=True) # Lance le serveur
app.enable_cors('*') # Active CORS
app.stop() # Arrête le serveur
Décorateurs
@app.get(path)
@app.post(path)
@app.put(path)
@app.delete(path)
@app.patch(path)
def handler(request, **params):
return response
Objet Request
{
'method': 'GET', # Méthode HTTP
'path': '/api/users', # Chemin
'query': {'page': '1'}, # Paramètres URL
'body': {...}, # Données JSON ou texte
'headers': {...}, # Headers HTTP
'cookies': {...} # Cookies
}
Réponses
# Réponse texte
TextResponse(content, status_code=200, headers={})
# Réponse JSON
JsonResponse(data, status_code=200, headers={})
# Réponse HTML
HtmlResponse(content, status_code=200, headers={})
# Redirection
RedirectResponse(location, status_code=302, headers={})
# Ou retournez simplement une chaîne ou un dictionnaire
def handler(request):
return 'Simple text' # → TextResponse
return {'key': 'value'} # → JsonResponse
Gestion des Cookies
@app.get('/set-cookie')
def set_cookie(request):
response = JsonResponse({'message': 'Cookie set'})
response.set_cookie(
name='user_id',
value='12345',
max_age=3600, # Secondes
path='/',
domain=None,
secure=False,
http_only=True
)
return response
@app.get('/read-cookie')
def read_cookie(request):
cookies = request['cookies']
user_id = cookies.get('user_id')
return JsonResponse({'user_id': user_id})
Exemples avancés
API REST complète
from quickserve import QuickServer, JsonResponse
app = QuickServer(port=5000, debug=True)
users = {
1: {'id': 1, 'name': 'Alice'},
2: {'id': 2, 'name': 'Bob'}
}
@app.get('/users')
def list_users(request):
return JsonResponse(list(users.values()))
@app.get('/users/{user_id}')
def get_user(request, user_id):
user = users.get(int(user_id))
if not user:
return JsonResponse({'error': 'Not found'}, status_code=404)
return JsonResponse(user)
@app.post('/users')
def create_user(request):
data = request['body']
new_id = max(users.keys()) + 1
users[new_id] = {'id': new_id, **data}
return JsonResponse(users[new_id], status_code=201)
@app.put('/users/{user_id}')
def update_user(request, user_id):
uid = int(user_id)
if uid not in users:
return JsonResponse({'error': 'Not found'}, status_code=404)
users[uid].update(request['body'])
return JsonResponse(users[uid])
@app.delete('/users/{user_id}')
def delete_user(request, user_id):
uid = int(user_id)
if uid in users:
del users[uid]
return JsonResponse({'deleted': True})
if __name__ == '__main__':
app.run(debug=True)
Serveur avec HTML
from quickserve import QuickServer, HtmlResponse
app = QuickServer(port=8000, debug=True)
@app.get('/')
def home(request):
html = '''
<html>
<head><title>Accueil</title></head>
<body>
<h1>Bienvenue</h1>
<p>Serveur QuickServe actif !</p>
</body>
</html>
'''
return HtmlResponse(html)
if __name__ == '__main__':
app.run(debug=True)
Validation de données
from quickserve import QuickServer, JsonResponse
app = QuickServer(port=5000, debug=True)
@app.post('/api/validate')
def validate_data(request):
data = request['body']
errors = []
if not data.get('name'):
errors.append('Name is required')
if not data.get('email'):
errors.append('Email is required')
if errors:
return JsonResponse({'errors': errors}, status_code=422)
return JsonResponse({'valid': True, 'data': data})
if __name__ == '__main__':
app.run(debug=True)
Gestion des erreurs
from quickserve import QuickServer, JsonResponse
app = QuickServer(port=5000, debug=True)
@app.get('/api/divide/{a}/{b}')
def divide(request, a, b):
try:
result = int(a) / int(b)
return JsonResponse({'result': result})
except ValueError:
return JsonResponse({'error': 'Invalid numbers'}, status_code=400)
except ZeroDivisionError:
return JsonResponse({'error': 'Division by zero'}, status_code=400)
except Exception as e:
return JsonResponse({'error': str(e)}, status_code=500)
if __name__ == '__main__':
app.run(debug=True)
Middleware
QuickServe propose un système de middleware extensible :
from quickserve import QuickServer, AuthenticationMiddleware
app = QuickServer(port=5000)
# Utiliser middleware d'authentification
auth = AuthenticationMiddleware(required_token='secret123')
@app.get('/api/protected')
def protected(request):
return {'message': 'Accès accordé'}
Middlewares disponibles :
AuthenticationMiddleware- Vérification de token BearerCORSMiddleware- Gestion CORSJsonErrorMiddleware- Erreurs au format JSONCompressionMiddleware- Compression gzip
Fichiers statiques
from quickserve import QuickServer, StaticFileServer
app = QuickServer(port=8000)
static = StaticFileServer('public', url_prefix='/static')
@app.get('/static/{file}')
def serve_static(request, file):
content, mime_type = static.read_file(request['path'])
if content is None:
return JsonResponse({'error': 'Not found'}, status_code=404)
return Response(content, headers={'Content-Type': mime_type})
Structure du projet
quickserve/
├── quickserve/
│ ├── __init__.py # Exports principales
│ ├── server.py # Classe QuickServer + RequestHandler
│ ├── routes.py # Gestion des routes
│ ├── response.py # Classes de réponse
│ ├── middleware.py # Système de middleware
│ └── static.py # Serveur de fichiers statiques
├── example.py # Exemples complets
└── README.md # Cette documentation
Notes
- Le serveur utilise
http.server.HTTPServerde la stdlib Python - Aucune dépendance externe requise
- Idéal pour des prototypes, tests et petits projets
- Non recommandé pour la production (utiliser Flask, Django, FastAPI pour cela)
- Support natif CORS pour développement frontend
- Logging intégré en mode debug
- Gestion complète des cookies
- Compression gzip optionnelle (middleware)
Licence
Libre d'utilisation
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file quickserve-1.2.0.tar.gz.
File metadata
- Download URL: quickserve-1.2.0.tar.gz
- Upload date:
- Size: 22.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
799556d22c69a1f142989aee1cefa8af2c94340bdfb988c0a9de988aa28ca4ba
|
|
| MD5 |
a19c574924100f5104cc2a2aa5200491
|
|
| BLAKE2b-256 |
aa6d69e22c5f93b31eab9b7c80a8dc98b93d53f70e3dd92f0a45578d935182c3
|
File details
Details for the file quickserve-1.2.0-py3-none-any.whl.
File metadata
- Download URL: quickserve-1.2.0-py3-none-any.whl
- Upload date:
- Size: 15.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eb5ea360d40e357f5289e25c8cfe6f7c3a267ce61966cfbce6eade60e9904600
|
|
| MD5 |
bd798a1285a42a2134cc0ae6ae74ebb4
|
|
| BLAKE2b-256 |
8b82486882e4bf8473b5a46563a28a8ca3bc1f800ce1ca57259740f206b3c5e6
|