捕获请求中的URL参数。得到

我目前正在定义正则表达式,以便捕获URL中的参数,如教程中所述。我如何访问参数从URL作为HttpRequest对象的一部分?

我的HttpRequest.GET当前返回一个空的QueryDict对象。

我想学习如何在没有库的情况下做到这一点,这样我就可以更好地了解Django。

802467 次浏览

当URL类似domain/search/?q=haha时,您应该使用request.GET.get('q', '')

q是您想要的参数,如果没有找到q,则''是默认值。

但是,如果您只是配置URLconf**,那么从regex捕获的数据将作为参数(或命名参数)传递给函数。

如:

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

然后在views.py

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

这并不完全是您所要求的,但是这个代码片段有助于在templates中管理query_strings

为了澄清camflan解释,让我们假设你有

  • 规则url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
  • http://domain/user/thaiyoshi/?message=Hi的传入请求

URL分派器规则将捕获URL 路径(这里是"user/thaiyoshi/")的部分,并将它们与请求对象一起传递给视图函数。

查询字符串(这里是message=Hi)被解析,参数被存储为request.GET中的QueryDict。不对HTTP GET参数进行进一步的匹配或处理。

这个视图函数将使用从URL路径和查询参数中提取的两个部分:

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

作为旁注,您将在request.method中找到请求方法(在本例中是"GET",对于提交的表单通常是"POST")。在某些情况下,检查它是否符合您的期望是有用的。

当决定是否使用URL路径或查询参数来传递信息时,以下命令可能会有所帮助:

  • 使用URL路径唯一标识资源,例如/blog/post/15/(而不是/blog/posts/?id=15)
  • 使用查询参数来改变资源的显示方式,例如/blog/post/15/?show_comments=1/blog/posts/2008/?sort_by=date&direction=desc
  • 要创建人性化的url,请避免使用ID号,并使用日期、类别和/或段码:/blog/post/2008/09/30/django-urls/
def some_view(request, *args, **kwargs):
if kwargs.get('q', None):
# Do something here ..

我想分享一个技巧,可能会节省你一些时间 如果你计划在urls.py文件中使用这样的东西:

url(r'^(?P<username>\w+)/$', views.profile_page,),
这基本上意味着www.example.com/<username>。一定要把它放在URL条目的末尾,因为否则,它很容易与下面的URL条目发生冲突,即访问其中一个会给你一个漂亮的错误:User matching query does not exist.

我自己也经历过;希望能有所帮助!< / p >

使用GET

request.GET["id"]

使用POST

request.POST["id"]

对于只有request对象的情况,可以使用request.parser_context['kwargs']['your_param']

你有两种常见的方法来做到这一点,以防你的URL看起来像这样:

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

版本1:

如果一个特定的键是强制性的,你可以使用:

key_a = request.GET['a']

如果键存在,则返回值为a,如果不存在则返回值为异常

版本2:

如果你的键是可选的:

request.GET.get('a')

你可以尝试没有任何参数,这将不会崩溃。 所以你可以用try: except:来包装它,然后在示例中返回HttpResponseBadRequest()。 这是一种让你的代码不那么复杂的简单方法,不需要使用特殊的异常处理

有人会想知道如何在文件urls . py中设置路径,例如

domain/search/?q=CA

这样我们就可以调用查询。

事实上,在文件urls . py中设置这样的路由是所必需的。你只需要在urls . py中设置路由:

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

当你输入http://servername:port/domain/search/?q=CA。查询部分'?q=CA'将自动保留在你可以引用的哈希表中

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

下面是一个例子(文件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

此外,当你在URL中写入查询字符串时:

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

不要将查询字符串用引号括起来。例如,

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

这些查询目前有两种方式。如果您想访问查询参数(GET),您可以查询以下命令:

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

如果你想访问POST传递的参数,你需要通过这种方式访问:

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

使用'get()'访问字典(QueryDict),可以设置一个默认值。在上述情况下,如果没有通知'status'或'role',则值为None。

这是另一个可以实现的替代解决方案:

在URL配置中:

urlpatterns = [path('runreport/<str:queryparams>', views.get)]

视图中:

list2 = queryparams.split("&")

如果你只能访问视图对象,那么你可以通过这种方式获取URL路径中定义的参数:

view.kwargs.get('url_param')

如果你只有访问请求对象的权限,使用下面的方法:

request.resolver_match.kwargs.get('url_param')

在Django 3上测试。

你不妨检查一下request。META字典可以访问很多有用的东西 PATH_INFO, QUERY_STRING < / p >
# for example
request.META['QUERY_STRING']


# or to avoid any exceptions provide a fallback


request.META.get('QUERY_STRING', False)


你说它返回空的查询字典

我认为你需要调整你的url来接受必要或可选的args或kwargs Django为你提供了所有你需要的懊悔功能,比如:

url(r'^project_config/(?P<product>\w+)/$', views.foo),


更多信息请访问django-optional-url-parameters

如果你不知道参数的名称,想要使用它们,你可以使用request.GET.keys()dict(request.GET)函数

views.py

from rest_framework.response import Response


def update_product(request, pk):
return Response({"pk":pk})

pk表示primary_key

urls . py

from products.views import update_product
from django.urls import path


urlpatterns = [
...,
path('update/products/<int:pk>', update_product)
]

url参数可能被request.query_params捕获

似乎更推荐使用request.query_params。例如,

当URL类似domain/search/?q=haha时,您应该使用request.query_params.get('q', None)

https://www.django-rest-framework.org/api-guide/requests/

“请求。query_params是request.GET的同义词。

为了代码内部清晰,我们建议使用request。query_params而不是Django标准的request.GET。这样做将有助于保持你的代码库更加正确和明显-任何HTTP方法类型都可能包括查询参数,而不仅仅是GET请求。