6
votes

Qu'est-ce qu'un bon moyen de gérer les paramètres d'URL?

Imaginez une application avec le url.py code>: xxx pré>

et ce vues.py code>: p>

def double(request, number=42):
    return HttpResponse(2*number)


0 commentaires

3 Réponses :


1
votes

Ce fil dit que la conversion automatique n'est pas une bonne solution:

Notez que la conversion automatique ne serait pas un bon plan, non plus. Pour exemple, la prochaine version de mon blog convertit les URL comme 2008/2/25 / à 2008/02/25 / parce que je veux une forme canonique. Donc j'ai besoin de savoir si \ d {1,2} correspond à l'un des deux chiffres, même si le premier est 0. La conversion automatique en un entier supprimerait cette capacité (et c'est pas difficile à penser à d'autres cas comme celui-ci). Donc, vous auriez besoin Configurabiliy.

Il suggère également une solution basée sur un décorateur, mais je ne suis pas vraiment convaincu, cela semble un peu lourd:

Une solution à votre problème pourrait être d'écrire un décorateur qui prend une liste de types (plus quelque chose comme aucun pour "ne pas s'en soucier") et convertit automatiquement l'argument n sur le type dans l'élément N-T ème de la liste avant d'appeler votre fonction


0 commentaires

2
votes

Voici une solution à base de décorateur:

def param_type(**type_spec):
    def deco(f):
        def view(request, **kwargs):
            for k, type_ in type_spec.items():
                kwargs[k] = type_(kwargs[k])
            return f(request, **kwargs)
        return view
    return deco

@param_type(number=int)
def double(request, number=42):
    return HttpResponse(2*number)


2 commentaires

Merci ! Mais est-il considéré comme une bonne pratique? Ou si les paramètres URL doivent-ils être considérés comme quelque chose à éviter?


@Anto, je n'utilise personnellement pas de décorateur de conversion de type automatique. Je viens de le convertir manuellement dans le code de vue.



0
votes

anto,

Je pense que votre question est plus liée à l'URL. (? p \ d +) est une expression régulière indiquant \ d uniquement en permettant des chiffres, il est identique à celui [0-9] . Le symbole + indique qu'il a besoin de 1 ou plusieurs chiffres. Donc, si vous essayez d'insérer quelque chose comme double / notanacher / il ne fonctionnera pas.

Connaissant cela, vous pouvez supposer que:

1: le nombre aura toujours une valeur

2: le nombre sera toujours un entier (même que Django le renonce comme unicode)

J'ai fait une petite modification à votre fonction: xxx


2 commentaires

J'ai compris que, mais ma question est vraiment à propos de: Quelle est la la meilleure pratique pour gérer le type de ce numéro argore savoir que 1 / il sera toujours renvoyé par le résolveur URL En tant que chaîne et 2 / je aura toujours besoin d'un entier. C'est vraiment une question sur la meilleure pratique, désolé si je n'étais pas assez clair;)


Je pense que si vous savez que c'est toujours un numéro et la veut toujours comme un integer Vous pouvez simplement utiliser int ()