ChatGPT解决这个技术问题 Extra ChatGPT

在 request.GET 中捕获 URL 参数

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

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

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


P
Peter Mortensen

当 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

'?param=' 是 Django 识别参数的唯一方法吗?有没有办法将 URLconf 与 HTTP.GET 一起使用?我想做/param/2。
检查我关于您的 URLconf 和正则表达式捕获的回复的第二部分。
没问题。如果您使用 GET 提交表单,请使用 request.GET,如果您使用 POST 提交表单,请使用 request.POST,如果您只想将 URL 配置为具有可变部分,那么它是 URLconf/view 参数。
基于类的视图呢?
对于基于类的视图,您可以使用 self.kwargs['parameter']
S
Sabito 錆兎 stands with Ukraine

为了澄清 camflanexplanation,假设您有

规则 url(regex=r'^user/(?P\w{1,50})/$', view='views.profile_page')

对 http://domain/user/thaiyoshi/?message=Hi 的传入请求

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

解析查询字符串(此处为 message=Hi)并将参数作为 QueryDict 存储在 request.GET 中。没有对 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 号并使用例如日期、类别和/或 slug:/blog/post/2008/09/30/django-urls/


这是一个写得很好的答案。它确实帮助我更好地理解了 Django。
我们如何在不提及名称的情况下获取所有参数值
@numerah request.GET 是一个 Python 字典。例如,您可以遍历 request.GET.items()。
有什么理由为什么更喜欢遵循更新中写的习惯? (何时使用 URL 路径与 GET 参数)
@m0etaz 真是个好问题。我想你很难找到这个概念的起源。根据我的经验,这几乎是以部落的方式传给我的,我也很想找到起源。
D
Dadaso Zanzane

使用 GET

request.GET["id"]

使用 POST

request.POST["id"]

虽然这适用于现有密钥,但 camflan 和 akaihola 的答案已使用 .get() 来避免在缺少密钥的情况下出现 KeyError 异常。这样做是明智的(例如request.POST.get('id', ''))。
P
Peter Mortensen

有人会好奇如何在文件 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"

嗨,埃里克!我是 Django 的新手。您能否更深入地了解“queryset = queryset.filter(state__name=state_name)”。 state__name 中的双下划线表示什么。
这里“state”是一个表,“name”是这个表中的一个字段。在 Django 的过滤器中,state__name 将引用“state”表中字段“name”的值。
A
Alireza Savand
def some_view(request, *args, **kwargs):
    if kwargs.get('q', None):
        # Do something here ..

O
Ole Henrik Skogstrøm

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


P
Peter Mortensen

如果您的 URL 看起来像这样,您有两种常用的方法来做到这一点:

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

版本 1:

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

key_a = request.GET['a']

如果键存在,则返回值 a,否则返回 exception

版本 2:

如果您的密钥是可选的:

request.GET.get('a')

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


如何从模板中检测查询参数?
M
Mike S

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

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

这基本上意味着www.example.com/<username>。请务必将它放在您的 URL 条目的末尾,否则,它很容易与下面的 URL 条目发生冲突,即访问其中一个给您一个不错的错误:{ 2}

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


另外,在这种情况下,您可能需要检查用户名是否与其他 url 条目冲突。
m
mdcg

这些查询目前以两种方式完成。如果要访问查询参数 (GET),可以查询以下内容:

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

如果要访问POST传递的参数,需要这样访问:

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

使用 'get()' 访问字典 (QueryDict),您可以设置默认值。在上述情况下,如果未通知“状态”或“角色”,则值为无。


M
Martín De la Fuente

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

view.kwargs.get('url_param')

如果您只能访问请求对象,请使用以下内容:

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

在 Django 3 上测试。


A
Arseniy Lebedev

如果您不知道参数的名称并希望全部使用它们,您可以使用 request.GET.keys()dict(request.GET) 函数


i
imreal

这不是您所要求的,但 this snippet 有助于管理 templates 中的 query_strings


P
Peter Mortensen

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

在 URL 配置中:

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

在视图中:

list2 = queryparams.split("&")

帮助我理解,我可以通过 "" 传递 int
A
Ahmed Shehab

您不妨检查 request.META 字典以访问许多有用的东西,例如 PATH_INFO、QUERY_STRING

# for example
request.META['QUERY_STRING']

# or to avoid any exceptions provide a fallback

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

你说它返回空查询字典

我认为您需要调整您的 url 以接受必需或可选的 args 或 kwargs Django 为您提供了 regrex 所需的所有功能,例如:

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

django-optional-url-parameters 上有关此的更多信息


O
Omar Magdy

视图.py

from rest_framework.response import Response def update_product(request, pk): return Response({"pk":pk})

pk 表示primary_key。

网址.py

from products.views import update_product from django.urls import path urlpatterns = [ ..., path('update/products/', update_product) ]


我认为这是编写路径的最干净的方法,您可以扩展更多关于答案的信息,例如解释一下文档的可选参数,并解释一下添加的代码片段,仅针对框架中的新手。
感谢您的评论。我真的很感激。 :) .URL 参数不能是可选的(据我所知)。因为它们指定了将执行哪个函数。可选的是请求正文中的查询参数和数据。这可以通过序列化程序(在 Django REST 框架中)进行控制。 @allexiusw
当然可以,您必须使用:def update_product(request, pk=None): pk 是可选的...
你是对的。 :) :) 但是,恐怕这可能会创建一个像这样的端点:update/products//,最后带有双斜杠,因为它是空的。那么路径应该是这样的:path('update/products/<int:pk>', update_product),而不是这样的:path('update/products/<int:pk>/', update_product),我已经更新了。我删除了问题答案中的最后一个斜杠。差异是最后一个斜线。 :) :)
我很高兴你让我意识到这一点。 :) :) 我以前没有意识到。 :) :)
O
Odiljon Djamalov

url 参数可能被 request.query_params 捕获


请考虑为您的 anwsers 进行更好的阐述......一些事情的背景。谢谢