Erfassen von URL-Parameter in request.GET
Frage
Ich bin die Definition zur Zeit reguläre Ausdrücke, um Parameter in einer URL zu erfassen, wie in der Anleitung beschrieben. Wie kann ich Parameter aus der URL als Teil des HttpRequest
Objekt? Mein HttpRequest.GET
derzeit gibt ein leeres QueryDict
Objekt.
Ich möchte lernen, wie man dies ohne eine Bibliothek zu tun, so kann ich besser kennen zu lernen Django bekommen.
Lösung
Wenn url ist wie: domain/search/?q=haha
,
Dann würden Sie request.GET.get('q', '')
verwenden.
q
ist der Parameter, den Sie mögen, und ''
ist der Standardwert, wenn q
nicht gefunden wird.
Wenn Sie jedoch stattdessen Ihre URLconf
nur konfigurieren , dann Ihre Aufnahmen aus der regex
werden die Funktion als Argumente übergeben (oder benannten Argumente).
Wie zum Beispiel:
(r'^user/(?P<username>\w{0,50})/$', views.profile_page,),
Dann in Ihrem views.py
würden Sie haben
def profile_page(request, username):
# Rest of the method
Andere Tipps
Um camflan Erklärung zu verdeutlichen, nehmen wir an, Sie haben
- die Regel
url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
- a in eingehender Anfrage für
http://domain/user/thaiyoshi/?message=Hi
Der URL Dispatcher Regel werden Teile der URL fangen Pfad (hier "user/thaiyoshi/"
) und übergeben sie an die View-Funktion zusammen mit dem Request-Objekt.
Der Abfrage-String (hier message=Hi
) wird analysiert und Parameter werden als QueryDict
in request.GET
gespeichert. Keine weitere Anpassung oder Verarbeitung für HTTP-GET-Parameter erfolgt.
Diese Ansicht Funktion würde beiden Teile aus dem URL-Pfad und Abfrageparameter extrahierten verwenden:
def profile_page(request, username=None):
user = User.objects.get(username=username)
message = request.GET.get('message')
Als Seite beachten, werden Sie die Request-Methode finden (in diesem Fall "GET"
und für eingereicht Formen in der Regel "POST"
) in request.method
. In manchen Fällen ist es sinnvoll zu prüfen, ob es passt, was Sie erwartet.
Update: Bei der Entscheidung, ob der URL-Weg oder die Abfrageparameter für Informationsvermittlung zu verwenden, können die folgenden helfen:
- verwenden, um den URL-Pfad zur eindeutigen Identifizierung Ressourcen, z.B.
/blog/post/15/
(nicht/blog/posts/?id=15
) - verwenden Abfrageparameter für die Änderung der Art und Weise die Ressource angezeigt wird, z.B.
/blog/post/15/?show_comments=1
oder/blog/posts/2008/?sort_by=date&direction=desc
- human-freundliche URLs zu machen, vermeidet ID-Nummern und verwendet z.B. Daten, Kategorien und / oder Schnecken:
/blog/post/2008/09/30/django-urls/
Mit GET
request.GET["id"]
Mit POST
request.POST["id"]
def some_view(request, *args, **kwargs):
if kwargs.get('q', None):
# Do something here ..
Ich möchte einen Tipp teilen, die Sie Zeit sparen können.
Wenn Sie planen, in Ihrer urls.py
Datei, so etwas zu verwenden:
url(r'^(?P<username>\w+)/$', views.profile_page,),
Das bedeutet im Grunde www.example.com/<username>
. Seien Sie sicher, dass es am Ende Ihrer URL-Einträge zu platzieren, denn sonst ist es anfällig für die URL-Einträge verursachen Konflikte mit der unten aufgeführten folgen, das heißt einer von ihnen den Zugriff auf geben Sie den schönen Fehler: User matching query does not exist.
Ich habe es einfach selbst erlebt; hoffe, es hilft!
Für Situationen, in denen Sie nur das request
Objekt haben Sie request.parser_context['kwargs']['your_param']
verwenden können,
Sie haben zwei gemeinsame Wege, dass Ihre URL zu tun, falls sieht wie folgt aus:
https://domain/method/?a=x&b=y
v1:
Wenn bestimmte Schlüssel obligatorisch ist, können Sie verwenden:
key_a = request.GET['a']
Dies wird einen Wert von a
zurück, wenn Schlüssel vorhanden ist und eine Ausnahme, wenn es nicht.
v2:
Wenn Sie Ihre Schlüssel sind optional:
request.GET.get('a')
Sie können versuchen, dass ohne Argument dies wird nicht abstürzen.
So können Sie es mit try: except:
wickeln und HttpResponseBadRequest()
in Beispiel zurück.
Dies ist ein einfacher Weg, um Ihren Code weniger komplex zu machen, ohne Umgang mit speziellen Ausnahmen zu verwenden.
Dies ist nicht genau das, was Sie gefragt, aber dieser Schnipsel ist hilfreich für die Verwaltung von query_strings
in templates
.
Ich möchte einige Möglichkeit, mich an, hier. Jemand würde sich fragen, wie Pfad in urls.py zu setzen, wie
domain/search/?q=CA
, damit wir Abfrage aufrufen könnte.
Die Tatsache ist, dass es nicht notwendig ist, eine solche Strecke in urls.py. einstellen Was Sie einstellen müssen, ist nur der Weg in urls.py
urlpatterns = [
path('domain/search/', views.CityListView.as_view()),
]
und bei der Eingabe von http: // server: port / Domain / search / q = CA . Die Abfrage Teil ‚? Q = CA‘ automatisch in der Hash-Tabelle reserviert werden, die Sie wenn
referenzierenrequest.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
Darüber hinaus, wenn Sie Query-String in URL schreiben
http://servername:port/domain/search/?q=CA
Sie keine Abfrage-String in Anführungszeichen wickeln z
http://servername:port/domain/search/?q="CA"