wake-up-neo.com

URL-Parameter in request.GET erfassen

Ich definiere derzeit reguläre Ausdrücke, um Parameter in einer URL zu erfassen, wie im Lernprogramm beschrieben. Wie greife ich über die URL im Objekt HttpRequest auf Parameter zu? Mein HttpRequest.GET gibt derzeit ein leeres QueryDict Objekt zurück.

Ich möchte lernen, wie man das ohne Bibliothek macht, damit ich Django besser kennenlernen kann.

400
sutee

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

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

Wenn Sie jedoch stattdessen nur Ihr URLconf konfigurieren, werden Ihre Captures aus dem regex als Argumente (oder benannte Argumente) an die Funktion übergeben.

Sowie:

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

Dann hättest du in deinem views.py

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

Nehmen wir an, Sie haben, um die Erklärung von camflan zu verdeutlichen

  • die Regel url(regex=r'^user/(?P<username>\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-Pfads (hier "user/thaiyoshi/") ab und übergibt sie zusammen mit dem Anforderungsobjekt an die Ansichtsfunktion.

Die Abfragezeichenfolge (hier message=Hi) wird analysiert und die Parameter werden als QueryDict in request.GET gespeichert. Es wird kein weiterer Abgleich oder keine weitere 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 Randnotiz finden Sie die Anforderungsmethode (in diesem Fall "GET" und für übermittelte Formulare normalerweise "POST") in request.method. In einigen Fällen ist es hilfreich zu überprüfen, ob es Ihren Erwartungen entspricht.

pdate: Bei der Entscheidung, ob der URL-Pfad oder die Abfrageparameter zum Übergeben von Informationen verwendet werden sollen, kann Folgendes hilfreich sein:

  • verwenden Sie den URL-Pfad zum eindeutigen Identifizieren von Ressourcen, z. /blog/post/15/ (nicht /blog/posts/?id=15)
  • verwenden Sie Abfrageparameter, um die Art der Anzeige der Ressource zu ändern, z. /blog/post/15/?show_comments=1 oder /blog/posts/2008/?sort_by=date&direction=desc
  • vermeiden Sie die Verwendung von ID-Nummern und verwenden Sie z. Daten, Kategorien und/oder Slugs: /blog/post/2008/09/30/Django-urls/
314
akaihola

Mit GET

request.GET["id"]

Verwenden des POST

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

Ich möchte Ihnen einen Tipp geben, der Ihnen möglicherweise Zeit spart.
Wenn Sie vorhaben, so etwas in Ihrer urls.py -Datei zu verwenden:

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

Was im Grunde bedeutet www.example.com/<username>. Stellen Sie sicher, dass es am Ende Ihrer URL-Einträge steht, da es sonst zu Konflikten mit den folgenden URL-Einträgen kommen kann, dh wenn Sie auf einen von ihnen zugreifen wird gibt Ihnen den Fehler Nice: User matching query does not exist.

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

17
DrKaoliN

In Situationen, in denen Sie nur das Objekt request haben, können Sie request.parser_context['kwargs']['your_param'] verwenden.

13

Sie haben zwei 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 den Wert a zurück, wenn der Schlüssel existiert, und eine Ausnahme, wenn nicht.

v2:

Wenn Ihre Schlüssel optional sind:

request.GET.get('a')

Sie können das ohne Argument versuchen, dies wird nicht abstürzen. Sie können es also mit try: except: umschließen und in Beispiel HttpResponseBadRequest() zurückgeben. Dies ist eine einfache Methode, um Ihren Code ohne spezielle Ausnahmebehandlung weniger komplex zu gestalten.

10
Bartłomiej

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

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: port/domain/search /? q = CA eingeben. Der Abfrageteil '? Q = CA' wird automatisch in der Hash-Tabelle reserviert, auf die Sie jedoch verweisen 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

Darüber hinaus, wenn Sie Abfragezeichenfolge in URL schreiben

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

Binden Sie die Abfragezeichenfolge nicht in Anführungszeichen, z

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

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

8
jamting

Diese Abfragen werden derzeit auf zwei Arten durchgeführt. Wenn Sie auf die Abfrageparameter (GET) zugreifen möchten, können Sie Folgendes abfragen:

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

Wenn Sie auf die vom POST übergebenen Parameter zugreifen möchten, müssen Sie folgendermaßen vorgehen:

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

Wenn Sie mit 'get ()' auf das Wörterbuch (QueryDict) zugreifen, können Sie einen Standardwert festlegen. In den oben genannten Fällen lauten die Werte Keine, wenn "Status" oder "Rolle" nicht informiert wurden.

0
mdcg