Domanda

Attualmente sto definendo espressioni regolari per acquisire parametri in un URL, come descritto nel tutorial. Come accedo ai parametri dall'URL come parte dell'oggetto HttpRequest? Il mio HttpRequest.GET attualmente restituisce un oggetto QueryDict vuoto.

Mi piacerebbe imparare come farlo senza una libreria in modo da poter conoscere meglio Django.

È stato utile?

Soluzione

Quando l'URL è come: domain/search/?q=haha ,  Quindi useresti request.GET.get('q', '').

q è il parametro desiderato e '' è il valore predefinito se URLconf non viene trovato.

Tuttavia, se invece stai semplicemente configurando il tuo regex , le tue acquisizioni da views.py vengono passate alla funzione come argomenti (o argomenti denominati).

Ad esempio:

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

Quindi nel tuo <=> avresti

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

Altri suggerimenti

Per chiarire la spiegazione di Camflan, supponiamo che tu abbia

  • la regola url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
  • a nella richiesta in arrivo per http://domain/user/thaiyoshi/?message=Hi

La regola del dispatcher di URL cattura parti dell'URL percorso (qui "user/thaiyoshi/") e le passa alla funzione di visualizzazione insieme all'oggetto richiesta.

La stringa di query (qui message=Hi) viene analizzata e i parametri vengono archiviati come QueryDict in request.GET. Non viene eseguita alcuna ulteriore corrispondenza o elaborazione per i parametri HTTP GET.

Questa funzione di visualizzazione userebbe entrambe le parti estratte dal percorso URL e un parametro di query:

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

Come nota a margine, troverai il metodo di richiesta (in questo caso "GET", e per i moduli inviati di solito "POST") in request.method. In alcuni casi è utile verificare che corrisponda a ciò che ti aspetti.

Aggiornamento: quando si decide se utilizzare il percorso URL o i parametri della query per passare informazioni, potrebbe essere utile quanto segue:

  • utilizza il percorso URL per identificare in modo univoco le risorse, ad es. /blog/post/15/ (non /blog/posts/?id=15)
  • utilizza i parametri della query per modificare la modalità di visualizzazione della risorsa, ad es. /blog/post/15/?show_comments=1 o /blog/posts/2008/?sort_by=date&direction=desc
  • per creare URL umani, evitare l'uso di numeri ID e utilizzare ad es. date, categorie e / o lumache: /blog/post/2008/09/30/django-urls/

Utilizzo di GET

request.GET["id"]

Uso di POST

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

Vorrei condividere un suggerimento che potrebbe farti risparmiare un po 'di tempo.
Se prevedi di utilizzare qualcosa del genere nel tuo file urls.py :

url(r'^(?P<username>\w+)/

Che sostanzialmente significa www.example.com/<username> . Assicurati di posizionarlo alla fine delle voci dell'URL, perché altrimenti è incline a causare conflitti con le voci dell'URL che seguono di seguito, vale a dire l'accesso a una di esse ti darà un bel errore: < code> La query di corrispondenza dell'utente non esiste.

L'ho provato da solo; spero che sia d'aiuto!

, views.profile_page,),

Che sostanzialmente significa www.example.com/<username> . Assicurati di posizionarlo alla fine delle voci dell'URL, perché altrimenti è incline a causare conflitti con le voci dell'URL che seguono di seguito, vale a dire l'accesso a una di esse ti darà un bel errore: < code> La query di corrispondenza dell'utente non esiste.

L'ho provato da solo; spero che sia d'aiuto!

Per le situazioni in cui hai solo l'oggetto request puoi usare request.parser_context['kwargs'[['your_param'[

Hai due modi comuni per farlo nel caso in cui il tuo URL assomigli a quello:

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

V1:

Se la chiave specifica è obbligatoria è possibile utilizzare:

key_a = request.GET['a']

Questo restituirà un valore di a se esiste una chiave e un'eccezione in caso contrario.

v2:

Se le tue chiavi sono opzionali:

request.GET.get('a')

Puoi provarlo senza alcun argomento che non andrà in crash. Quindi puoi avvolgerlo con provare: tranne: e restituire HttpResponseBadRequest () nell'esempio. Questo è un modo semplice per rendere il codice meno complesso, senza utilizzare la gestione delle eccezioni speciale.

Questo non è esattamente quello che hai chiesto, ma questo frammento è utile per la gestione < code> query_strings in modelli .

Vorrei aggiungere qualche opzione di me stesso, qui. Qualcuno si chiederebbe come impostare il percorso in urls.py, come

domain/search/?q=CA

in modo da poter invocare la query.

Il fatto è che NON è necessario impostare un tale percorso in urls.py. Quello che devi impostare è solo il percorso in urls.py

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

e quando inserisci http: // servername: port / domain / search /? q = CA . La parte della query '? Q = CA' verrà automaticamente prenotata nella tabella hash a cui puoi fare riferimento

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

Ecco un esempio (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

Inoltre, quando si scrive una stringa di query in URL

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

Non racchiudere la stringa di query tra virgolette, ad esempio

http://servername:port/domain/search/?q="CA"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top