Vue d'ensemble
Pyramid 2.0, publié le 2 mars 2021, abandonne le support de Python 2, renforce la sécurité et ajoute des annotations de type à travers le framework.
Fonctionnalités principales
Abandon de Python 2 et annotations de type
Le code source de Pyramid est désormais entièrement compatible Python 3 uniquement (3.6+). Des annotations de type ont été ajoutées sur les API publiques, facilitant l'utilisation avec mypy et les IDE modernes.
python
from wsgiref.simple_server import make_server
from pyramid.config import Configurator
from pyramid.request import Request
from pyramid.response import Response
def accueil(request: Request) -> Response:
nom = request.params.get('nom', 'le monde')
return Response(f'Bonjour {nom} !')
def api_info(request: Request) -> dict:
"""Les vues peuvent retourner un dict (rendu JSON)."""
return {'version': '2.0', 'framework': 'Pyramid'}
with Configurator() as config:
config.add_route('accueil', '/')
config.add_route('api', '/api/info')
config.add_view(accueil, route_name='accueil')
config.add_view(api_info, route_name='api', renderer='json')
app = config.make_wsgi_app()
# server = make_server('0.0.0.0', 8080, app)
# server.serve_forever()
Refonte de la sécurité
Le système de sécurité a été revu avec une nouvelle API de politique de sécurité (SecurityPolicy) qui remplace les anciens systèmes d'authentification et d'autorisation séparés. L'approche unifiée est plus simple à configurer et plus sûre.
python
from pyramid.authorization import ACLHelper
from pyramid.request import Request
class MaPolitiqueSecurite:
"""Politique de sécurité unifiée Pyramid 2.0."""
def __init__(self, secret: str):
self.secret = secret
self.acl = ACLHelper()
def identity(self, request: Request):
"""Retourne l'identité de l'utilisateur."""
token = request.cookies.get('auth_token')
if token:
return self.verifier_token(token)
return None
def authenticated_userid(self, request: Request):
identity = self.identity(request)
return identity.get('id') if identity else None
def permits(self, request, context, permission):
return self.acl.permits(context, request.identity, permission)
def verifier_token(self, token: str) -> dict | None:
... # vérification du token
