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.
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
Pour clarifier l'explication de camflan, supposons que vous ayez
url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
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:
/blog/post/15/
(pas /blog/posts/?id=15
)/blog/post/15/?show_comments=1
ou /blog/posts/2008/?sort_by=date&direction=desc
/blog/post/2008/09/30/Django-urls/
Utiliser GET
request.GET["id"]
Utiliser POST
request.POST["id"]
def some_view(request, *args, **kwargs):
if kwargs.get('q', None):
# Do something here ..
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!
Dans les cas où vous ne disposez que de l'objet request
, vous pouvez utiliser request.parser_context['kwargs']['your_param']
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.
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"
Ce n'est pas exactement ce que vous avez demandé, mais cet extrait est utile pour gérer query_strings
dans templates
.
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.