web-dev-qa-db-fra.com

Capture des paramètres d'URL dans request.GET

Je suis en train de définir des expressions régulières afin de capturer des paramètres dans une URL, comme décrit dans le tutoriel. Comment accéder aux paramètres de l'URL dans l'objet HttpRequest? Mon HttpRequest.GET renvoie actuellement un objet QueryDict vide.

J'aimerais apprendre à faire cela sans bibliothèque afin de mieux connaître Django.

400
sutee

Quand url est comme: domain/search/?q=haha, Vous utiliseriez alors request.GET.get('q', '').

q est le paramètre souhaité, et '' est la valeur par défaut si q n'est pas trouvé.

Cependant, si vous configurez simplement votre URLconf, vos captures de la regex sont alors transmises à la fonction sous forme d'arguments (ou d'arguments nommés).

Tel que:

(r'^user/(?P<username>\w{0,50})/$', views.profile_page,),

Ensuite, dans votre views.py vous auriez

def profile_page(request, username):
    # Rest of the method
589
camflan

Pour clarifier l'explication de camflan, supposons que vous ayez

  • la règle url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
  • une demande entrante pour http://domain/user/thaiyoshi/?message=Hi

La règle de répartition d'URL intercepte des parties du chemin de l'URL (ici "user/thaiyoshi/") et les transmet à la fonction de vue avec l'objet de requête.

La chaîne de requête (ici message=Hi) est analysée et les paramètres sont stockés en tant que QueryDict dans request.GET. Aucune correspondance ou traitement supplémentaire pour les paramètres HTTP GET n'est effectué.

Cette fonction de vue utiliserait les deux parties extraites du chemin d'URL et un paramètre de requête:

def profile_page(request, username=None):
    user = User.objects.get(username=username)
    message = request.GET.get('message')

En guise de remarque, vous trouverez la méthode de requête (dans ce cas "GET", et pour les formulaires soumis généralement "POST") dans request.method. Dans certains cas, il est utile de vérifier que cela correspond à ce que vous attendez.

pdate: Lorsque vous décidez d'utiliser le chemin de l'URL ou les paramètres de requête pour transmettre des informations, les éléments suivants peuvent vous aider:

  • utilisez le chemin d'URL pour identifier les ressources de manière unique, par exemple. /blog/post/15/ (pas /blog/posts/?id=15)
  • utilisez des paramètres de requête pour modifier le mode d'affichage de la ressource, par ex. /blog/post/15/?show_comments=1 ou /blog/posts/2008/?sort_by=date&direction=desc
  • pour créer des URL conviviales, évitez d’utiliser des numéros d’identification et utilisez par exemple dates, catégories et/ou limaces: /blog/post/2008/09/30/Django-urls/
314
akaihola

Utiliser GET

request.GET["id"]

Utiliser POST

request.POST["id"]
47
Dadaso Zanzane
def some_view(request, *args, **kwargs):
    if kwargs.get('q', None):
        # Do something here ..
22
Kevin

J'aimerais partager un conseil qui pourrait vous faire gagner du temps.
Si vous envisagez d’utiliser quelque chose comme ceci dans votre fichier urls.py:

url(r'^(?P<username>\w+)/$', views.profile_page,),

Ce qui signifie fondamentalement www.example.com/<username>. Assurez-vous de le placer à la fin de vos entrées d'URL, car sinon, il est susceptible de provoquer des conflits avec les entrées d'URL ci-dessous, c'est-à-dire d'accéder à l'un d'eux will vous donnera l'erreur de Nice: User matching query does not exist.

Je viens de faire l'expérience moi-même; J'espère que ça aide!

17
DrKaoliN

Dans les cas où vous ne disposez que de l'objet request, vous pouvez utiliser request.parser_context['kwargs']['your_param']

13

Vous avez deux façons courantes de le faire si votre URL ressemble à ça:

https://domain/method/?a=x&b=y

v1:

Si une clé spécifique est obligatoire, vous pouvez utiliser:

key_a = request.GET['a']

Cela retournera une valeur de a si la clé existe et une exception si ce n'est pas le cas.

v2:

Si vos clés sont facultatives:

request.GET.get('a')

Vous pouvez essayer cela sans aucun argument, cela ne plantera pas. Ainsi, vous pouvez l'envelopper avec try: except: et renvoyer HttpResponseBadRequest() dans l'exemple. C'est un moyen simple de rendre votre code moins complexe, sans utiliser la gestion des exceptions spéciale.

10
Bartłomiej

Je voudrais ajouter une option de moi-même, ici. Quelqu'un se demanderait comment définir un chemin dans urls.py, tel que

domain/search/?q=CA

afin que nous puissions appeler une requête.

Le fait est qu'il n'est PAS nécessaire de définir une telle route dans urls.py. Ce que vous devez définir est simplement la route dans urls.py

urlpatterns = [
    path('domain/search/', views.CityListView.as_view()),
]

et lorsque vous entrez http: // nom_serveur: port/domaine/recherche /? q = CA . La partie de la requête '? Q = CA' sera automatiquement réservée dans la table de hachage à laquelle vous pourrez vous référer

request.GET.get('q', None).

Voici un exemple (views.py)

class CityListView(generics.ListAPIView):
    serializer_class = CityNameSerializer

    def get_queryset(self):
        if self.request.method == 'GET':
            queryset = City.objects.all()
            state_name = self.request.GET.get('q', None)
            if state_name is not None:
                queryset = queryset.filter(state__name=state_name)
            return queryset

De plus, lorsque vous écrivez une chaîne de requête dans une URL

http://servername:port/domain/search/?q=CA

Ne mettez pas la chaîne de requête entre guillemets

http://servername:port/domain/search/?q="CA"
9
Eric Andrews

Ce n'est pas exactement ce que vous avez demandé, mais cet extrait est utile pour gérer query_strings dans templates.

8
jamting

Ces requêtes sont actuellement effectuées de deux manières. Si vous souhaitez accéder aux paramètres de requête (GET), vous pouvez interroger les éléments suivants:

http://myserver:port/resource/?status=1
request.query_params.get('status', None) => 1

Si vous souhaitez accéder aux paramètres transmis par POST, vous devez accéder de cette manière:

request.data.get('role', None)

En accédant au dictionnaire (QueryDict) avec 'get ()', vous pouvez définir une valeur par défaut. Dans les cas ci-dessus, si "statut" ou "rôle" n'est pas renseigné, les valeurs sont None.

0
mdcg