Partage

Middleware Django genre ParamConverter Doctrine

26 juin 2013 à 22:46:28

Bonjour à tous !

J’ai créé un petit middleware Django qui agit comme le ParamConverter Doctrine de Symfony et j’ai voulu le partager avec vous.

Pour ceux qui ne connaissent pas, il s’agit d’un convertisseur de paramètre du contrôleur qui converti un paramètre en l’instance du modèle correspondant au type fourni.

Voici un exemple tiré du tutoriel Symfony :

<?php
// src/Sdz/BlogBundle/Controller/BlogController.php
use Sdz\BlogBundle\Entity\Article;
 
public function voirAction($id, Article $article)
{
  // Ici, $article est une instance de l'entité Article, portant l'id $id
}

Comme l’indique le commentaire, la variable $article sera une instance de l’entité Article.

J’ai fait la même chose avec Django grâce aux annotations de Python 3.

Voici le middleware en question :

from django.db import models

class ModelViewArgumentsMiddleware(object):
    def process_view(self, request, view_func, view_args, view_kwargs):
        for key in view_kwargs:
            if key in view_func.__annotations__ and issubclass(view_func.__annotations__[key], models.Model):
                view_kwargs[key] = get_object_or_404(view_func.__annotations__[key], pk=view_kwargs[key])

Il s’utilise d’une façon très simple. Il suffit d’annoter un paramètre d’une vue avec la classe correspondant au modèle.

Par exemple, pour reprendre l’exemple du TP du raccourcisseur d’URL du tutoriel de Django, on pourrait ajouter une vue voir qui utilise une annotation afin d’éviter l’appel à get_object_or_404() :

def voir(request, mini_url : MiniURL):
    #mini_url = get_object_or_404(MiniURL, pk=mini_url) # Maintenant inutile grâce à l’annotation.
    return render(request, 'mini_url/voir.html', {'mini_url': mini_url})

et ajouter ceci dans votre URLconf :

url(r'^voir/(?P<mini_url>\d+)/$', 'voir', name='url_voir'),

Et c’est tout.

Le paramètre mini_url sera une instance de MiniURL.

Si l’instance de MiniURL n’existe pas, une page d’erreur 404 sera affichée.

N’oubliez pas d’ajouter le middleware à la variable MIDDLEWARE_CLASSES du fichier settings.py de votre projet.

Si vous ne savez pas comment utiliser les middlewares, allez lire le tutoriel en question.

J’espère que cela vous sera utile.

-
Edité par antoyo 26 juin 2013 à 22:53:27

Middleware Django genre ParamConverter Doctrine

× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
  • Editeur
  • Markdown