我目前正在定义正则表达式,以便捕获URL中的参数,如教程中所述。我如何访问参数从URL作为HttpRequest对象的一部分?
我的HttpRequest。GET当前返回一个空的QueryDict对象。
我想学习如何在没有库的情况下做到这一点,这样我就可以更好地了解Django。
我目前正在定义正则表达式,以便捕获URL中的参数,如教程中所述。我如何访问参数从URL作为HttpRequest对象的一部分?
我的HttpRequest。GET当前返回一个空的QueryDict对象。
我想学习如何在没有库的情况下做到这一点,这样我就可以更好地了解Django。
当前回答
你有两种常见的方法来做到这一点,以防你的URL看起来像这样:
https://domain/method/?a=x&b=y
版本1:
如果一个特定的键是强制性的,你可以使用:
key_a = request.GET['a']
如果键存在,则返回值为a,如果不存在则返回异常。
版本2:
如果你的键是可选的:
request.GET.get('a')
你可以尝试没有任何参数,这不会崩溃。 所以你可以用try: except:来包装它,并返回HttpResponseBadRequest()。 这是一种使代码不那么复杂的简单方法,不需要使用特殊的异常处理。
其他回答
如果你只能访问视图对象,那么你可以通过这种方式获取URL路径中定义的参数:
view.kwargs.get('url_param')
如果你只有访问请求对象的权限,使用下面的方法:
request.resolver_match.kwargs.get('url_param')
在Django 3上测试。
views.py
从rest_framework。response import响应 Def update_product(请求,pk): 返回响应({“pk”:pk})
Pk表示主键。
urls . py
从产品。视图导入update_product django。url导入路径 Urlpatterns = [ …, 路径(更新/产品/ < int: pk >”,update_product) ]
为了澄清camflan的解释,让我们假设你有
规则的url (regex = r ' ^用户/ (? P <用户名> \ w 50{1,}) / $”,查看=“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中找到request方法(在本例中为“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/
当URL是domain/search/?q=哈哈,你会使用request.GET。(‘问’,”)。
Q是您想要的参数,如果没有找到Q,则“”是默认值。
然而,如果你只是配置你的URLconf**,那么你从regex捕获的信息将作为参数(或命名参数)传递给函数。
如:
(r'^user/(?P<username>\w{0,50})/$', views.profile_page,),
那么在你的视图。py中
def profile_page(request, username):
# Rest of the method
你有两种常见的方法来做到这一点,以防你的URL看起来像这样:
https://domain/method/?a=x&b=y
版本1:
如果一个特定的键是强制性的,你可以使用:
key_a = request.GET['a']
如果键存在,则返回值为a,如果不存在则返回异常。
版本2:
如果你的键是可选的:
request.GET.get('a')
你可以尝试没有任何参数,这不会崩溃。 所以你可以用try: except:来包装它,并返回HttpResponseBadRequest()。 这是一种使代码不那么复杂的简单方法,不需要使用特殊的异常处理。