在request.GET中捕获url参数

django url rest

448662 观看

10回复

4819 作者的声誉

我正在定义正则表达式以捕获url中的参数,如教程中所述。如何从URL中访问参数作为HttpRequest对象的一部分?我HttpRequest.GET当前返回一个空QueryDict对象。

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

作者: sutee 的来源 发布者: 2008 年 9 月 29 日

回应 (10)


585

11992 作者的声誉

决定

当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
作者: camflan 发布者: 29.09.2008 08:31

8

1275 作者的声誉

这不正是你问什么,但这个片段是管理有帮助query_stringstemplates

作者: jamting 发布者: 30.09.2008 09:19

312

21322 作者的声誉

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

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

URL调度程序规则将捕获URL 路径的一部分(此处"user/thaiyoshi/"),并将它们与请求对象一起传递给视图函数。

message=Hi解析查询字符串(此处),并将参数存储为QueryDictin request.GET。不进行HTTP GET参数的进一步匹配或处理。

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

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

作为旁注,您将找到请求方法(在这种情况下"GET",通常是提交的表单"POST"request.method。在某些情况下,检查它是否与您期望的相匹配是有用的。

更新:在决定是使用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号并使用例如日期,类别和/或slu :: /blog/post/2008/09/30/django-urls/
作者: akaihola 发布者: 01.10.2008 12:11

20

201 作者的声誉

def some_view(request, *args, **kwargs):
    if kwargs.get('q', None):
        # Do something here ..
作者: Kevin 发布者: 18.11.2010 06:40

16

941 作者的声誉

我想分享一个可能为您节省一些时间的提示。
如果您打算在urls.py文件中使用以下内容:

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

这基本上意味着www.example.com/<username>。请务必将其放置在你的URL条目的结束,否则,很容易造成下面下面的URL条目,即访问它们的一个冲突将会给你不错的错误:User matching query does not exist.

我刚刚经历了它自己; 希望能帮助到你!

作者: DrKaoliN 发布者: 05.02.2013 02:05

45

4140 作者的声誉

使用GET

request.GET["id"]

使用POST

request.POST["id"]
作者: Dadaso Zanzane 发布者: 21.01.2015 08:08

13

3859 作者的声誉

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

作者: Ole Henrik Skogstrøm 发布者: 05.05.2017 01:54

10

159 作者的声誉

如果您的网址如下所示,您有两种常用的方法:

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

V1:

如果特定密钥是强制性的,您可以使用:

key_a = request.GET['a']

这将返回aif键存在的值,如果不存在,则返回Exception。

V2:

如果您的钥匙是可选的:

request.GET.get('a')

您可以尝试不带任何参数,这不会崩溃。所以你可以用它包装try: except:并返回HttpResponseBadRequest()示例。这是一种简单的方法,可以使代码不那么复杂,而无需使用特殊的异常处理。

作者: Bartłomiej 发布者: 04.10.2017 12:05

7

114 作者的声誉

我想在这里添加一些我自己的选项。有人会想知道如何在urls.py中设置路径,例如

domain/search/?q=CA

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

事实是,没有必要在urls.py中设置这样的路由。你需要设置的只是urls.py中的路由

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

当你输入http://服务器:端口/域/搜索/ 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"
作者: Eric Andrews 发布者: 06.06.2018 07:20

0

15 作者的声誉

目前通过访问HttpRequest对象的“query_params”字典来执行这些查询。

http://myserver:port/resource/?status=1
status = request.query_params.get('status', None)
作者: mdcg 发布者: 22.07.2019 02:35
32x32