如何在 Django 中获取 GET 请求值?

2024-12-13 08:36:00
admin
原创
153
摘要:问题描述:我目前正在定义正则表达式来捕获 URL 中的参数,如教程中所述。如何从 URL 中访问参数作为HttpRequest对象的一部分?我的HttpRequest.GET当前返回一个空QueryDict对象。我想学习如何在没有库的情况下做到这一点,这样我就可以更好地了解 Django。解决方案 1:给出 ...

问题描述:

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

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

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


解决方案 1:

给出 URL:

domain/search/?q=haha

使用:

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

q是参数,如果未找到'default'则为默认值。q

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

例如:

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

那么在你的views.py你会有

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

解决方案 2:

为了澄清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)被解析,并将参数存储为QueryDictrequest.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 号,并使用日期、类别和/或 slug:/blog/post/2008/09/30/django-urls/

解决方案 3:

使用 GET

request.GET["id"]

使用 POST

request.POST["id"]

解决方案 4:

有人会疑惑如何在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"

解决方案 5:

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

解决方案 6:

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

解决方案 7:

如果你的 URL 如下所示,则有两种常用方法可以实现此目的:

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

版本 1:

如果特定键是必需的,则可以使用:

key_a = request.GET['a']

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

版本 2:

如果您的密钥是可选的:

request.GET.get('a')

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

解决方案 8:

我想分享一个可以帮你节省时间的技巧。

如果你打算在urls.py文件中使用类似这样的内容:

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

这基本上意味着www.example.com/<username>。确保将其放在 URL 条目的末尾,否则,它很容易与下面的 URL 条目发生冲突,即访问其中一个会给您带来错误:User matching query does not exist.

我刚刚自己经历过;希望对您有所帮助!

解决方案 9:

这些查询目前以两种方式完成。如果您想访问查询参数(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。

解决方案 10:

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

解决方案 11:

这不完全是您所要求的,但此代码片段query_strings对于管理很有帮助templates

解决方案 12:

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

view.kwargs.get('url_param')

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

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

在 Django 3 上测试。

解决方案 13:

视图.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)
]

解决方案 14:

您也可以检查 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 以接受必需或可选的参数或 kwargs,Django 通过正则表达式为你提供了所需的所有功能,例如:

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

有关此内容的更多信息,请参阅django-optional-url-parameters

解决方案 15:

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

在 URL 配置中:

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

在观点中:

list2 = queryparams.split("&")

解决方案 16:

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

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

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

“request.query_params 是 request.GET 更正确的同义词。

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

解决方案 17:

例如,如果你访问下面的 URL:

https://example.com/?fruits=apple&meat=beef

views.py然后,您可以像下面这样获取参数。 *我的回答解释了如何GET在 Django 中获取请求值列表,我的回答解释了如何POST在 Django 中获取请求值:

# "views.py"

from django.shortcuts import render

def index(request):

    print(request.GET['fruits']) # apple
    print(request.GET.get('meat')) # beef
    print(request.GET.get('fish')) # None
    print(request.GET.get('fish', "Doesn't exist")) # Doesn't exist
    print(request.GET.getlist('fruits')) # ['apple']
    print(request.GET.getlist('fish')) # []
    print(request.GET.getlist('fish', "Doesn't exist")) # Doesn't exist
    print(request.GET._getlist('meat')) # ['beef']
    print(request.GET._getlist('fish')) # []
    print(request.GET._getlist('fish', "Doesn't exist")) # Doesn't exist
    print(list(request.GET.keys())) # ['fruits', 'meat']
    print(list(request.GET.values())) # ['apple', 'beef']
    print(list(request.GET.items())) # [('fruits', 'apple'), ('meat', 'beef')]
    print(list(request.GET.lists())) # [('fruits', ['apple']), ('meat', ['beef'])]
    print(request.GET.dict()) # {'fruits': 'apple', 'meat': 'beef'}
    print(dict(request.GET)) # {'fruits': ['apple'], 'meat': ['beef']}
    print(request.META['QUERY_STRING']) # fruits=apple&meat=beef
    print(request.META.get('QUERY_STRING')) # fruits=apple&meat=beef

    return render(request, 'index.html')

index.html然后,您可以获取如下所示的参数:

{# "index.html" #}

{{ request.GET.fruits }} {# apple #}
{{ request.GET.meat }} {# beef #}
{{ request.GET.dict }} {# {'fruits': 'apple', 'meat': 'beef'} #}
{{ request.META.QUERY_STRING }} {# fruits=apple&meat=beef #}

解决方案 18:

url 参数可能被捕获request.query_params

解决方案 19:

在 Django 中,视图会为您解析路径。

但除此之外,如果您需要解析路径,您可以使用解析模块

例如-requestedPath是-domain/search/?userName=myUserName
domain/search/<userName>/product/<productName>

from django.urls import resolve
resolveMatcher = resolve(request.path)
userName = resolveMatcher.kwargs.get('userName', None)
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1989  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1446  
  在当今快速发展的IT行业中,项目管理工具的选择对于项目的成功至关重要。随着技术的不断进步,项目经理们需要更加高效、灵活的工具来应对复杂的项目需求。本文将介绍2025年IT项目经理力推的10款管理工具,帮助您在项目管理中取得更好的成果。信创国产项目管理软件 - 禅道禅道是一款国产开源的项目管理软件,禅道开源版不限人数,功...
项目管理工具   0  
  在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目成功的关键工具。随着技术的不断进步,市场上涌现出众多功能各异的项目管理工具,每一款都有其独特的优势和适用场景。本文将深入评测2025年最受欢迎的10款项目管理软件,帮助您根据自身需求做出明智的选择。信创国产项目管理软件 - 禅道禅道是一款...
项目管理平台   2  
  产品开发效率对于企业的竞争力至关重要。在当今复杂多变的商业环境中,如何有效提升产品开发效率成为众多企业关注的焦点。产品生命周期管理(PLM)作为一种整合产品全生命周期信息的管理理念和技术,为提升产品开发效率提供了有力的支持。通过合理运用PLM,企业能够优化流程、加强协作、提高数据管理水平,从而实现产品开发的高效运作。接...
plm开发流程软件   3  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用