如何在 Django 中获取 GET 请求值?
- 2024-12-13 08:36:00
- admin 原创
- 153
问题描述:
我目前正在定义正则表达式来捕获 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
)被解析,并将参数存储为QueryDict
。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 号,并使用日期、类别和/或 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)