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

Sources