Erfassen von URL-Parametern in request.GET

Ich definiere derzeit reguläre Ausdrücke, um Parameter in einer URL zu erfassen, wie im Tutorial beschrieben. Wie HttpRequest ich auf Parameter von der URL als Teil des HttpRequest Objekts zu? Mein HttpRequest.GET derzeit ein leeres QueryDict Objekt zurück.

Ich würde gerne lernen, wie man das ohne eine Bibliothek macht, damit ich Django besser kennenlernen kann.

   

Wenn URL wie folgt ist: domain/search/?q=haha , dann würden Sie request.GET.get('q', '') .

q ist der gewünschte Parameter, und '' ist der Standardwert, wenn q nicht gefunden wird.

Wenn Sie jedoch nur Ihre URLconf konfigurieren , werden Ihre Captures aus der regex als Argumente (oder benannte Argumente) an die function übergeben.

Sowie:

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

Dann views.py Sie in Ihrer views.py haben

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

Um Camflans Erklärung zu verdeutlichen, nehmen wir an, Sie haben

  • die Regel- url(regex=r'^user/(?P\w{1,50})/$', view='views.profile_page')
  • eine eingehende Anfrage für http://domain/user/thaiyoshi/?message=Hi

Die URL-Dispatcher-Regel fängt Teile des URL- Pfades (hier "user/thaiyoshi/" ) ab und "user/thaiyoshi/" sie zusammen mit dem "user/thaiyoshi/" an die View-function.

Die Abfragezeichenfolge (hier message=Hi ) wird analysiert, und die Parameter werden als QueryDict in request.GET gespeichert. Es wird kein weiterer Abgleich oder keine Verarbeitung für HTTP-GET-Parameter durchgeführt.

Diese Ansichtsfunktion würde sowohl Teile verwenden, die aus dem URL-Pfad extrahiert wurden, als auch einen Abfrageparameter:

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

Als Nebenbemerkung finden Sie die Request-Methode (in diesem Fall "GET" und für die eingereichten Formulare in der Regel "POST" ) in request.method . In einigen Fällen ist es nützlich zu überprüfen, ob es mit dem übereinstimmt, was Sie erwarten.

Update: Wenn Sie entscheiden, ob Sie den URL-Pfad oder die Abfrageparameter zum Übergeben von Informationen verwenden möchten, kann Folgendes hilfreich sein:

  • Verwenden Sie den URL-Pfad zur eindeutigen Identifizierung von Ressourcen, zB /blog/post/15/ (nicht /blog/posts/?id=15 )
  • Verwenden Sie Abfrageparameter, um die Darstellung der Ressource zu ändern, zB /blog/post/15/?show_comments=1 oder /blog/posts/2008/?sort_by=date&direction=desc
  • um menschenfreundliche URLs zu erstellen, vermeiden Sie die Verwendung von ID-Nummern und verwenden Sie zB Daten, Kategorien und / oder Nacktfotos: /blog/post/2008/09/30/django-urls/

Verwenden von GET

 request.GET["id"] 

Verwenden von POST

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

Ich möchte einen Tipp teilen, der Ihnen vielleicht etwas Zeit sparen kann.
Wenn Sie so etwas in Ihrer urls.py Datei verwenden urls.py :

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

Was im Grunde bedeutet, www.example.com/ . Stellen Sie sicher, dass Sie es am Ende Ihrer URL-Einträge platzieren, da es sonst zu Konflikten mit den folgenden URL-Einträgen kommen kann. Wenn Sie z. B. auf eine dieser URLs zugreifen, erhalten Sie den schönen Fehler: Eine User matching query does not exist.

Ich habe es gerade selbst erlebt; ich hoffe es hilft!

Dies ist nicht genau das, wonach Sie gefragt haben, aber dieses Snippet ist hilfreich für die Verwaltung von query_strings in templates .

Für Situationen, in denen Sie nur das request.parser_context['kwargs']['your_param'] haben, können Sie request.parser_context['kwargs']['your_param']

Sie haben zwei übliche Möglichkeiten dies zu tun, falls Ihre URL so aussieht:

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

v1:

Wenn ein bestimmter Schlüssel erforderlich ist, können Sie Folgendes verwenden:

 key_a = request.GET['a'] 

Dies gibt einen Wert a Falls zurück, wenn der Schlüssel existiert, und eine Ausnahme, falls nicht.

v2:

Wenn Ihre Schlüssel optional sind:

 request.GET.get('a') 

Sie können das ohne irgendein Argument versuchen, das wird nicht abstürzen. Sie können es also mit try: except: HttpResponseBadRequest() try: except: und geben HttpResponseBadRequest() im Beispiel zurück. Dies ist ein einfacher Weg, um Ihren Code weniger komplex zu machen, ohne spezielle Exceptions zu verwenden.

Ich möchte hier eine Option von mir hinzufügen. Jemand würde sich fragen, wie man den Pfad in urls.py setzt, wie z

 domain/search/?q=CA 

damit wir die Abfrage aufrufen können.

Tatsache ist, dass es NICHT notwendig ist, eine solche Route in urls.py festzulegen. Was Sie einstellen müssen, ist nur die Route in urls.py

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

und wenn Sie http: // Servername eingeben: Port / Domäne / Suche /? q = CA. Der Abfrageteil ‘? Q = CA’ wird automatisch in der Hash-Tabelle reserviert, auf die Sie sich jedoch beziehen können

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

Hier ist ein Beispiel (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 

Wenn Sie eine Abfragezeichenfolge in URL schreiben

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

Umbrechen Sie die Abfragezeichenfolge nicht in Anführungszeichen, z

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