在request.GET中捕获url参数
我正在定义正则expression式,以便捕获url中的参数,如教程中所述。 作为HttpRequest
对象的一部分,如何从url访问参数? 我的HttpRequest.GET
当前返回一个空的QueryDict
对象。
我想学习如何在没有库的情况下做到这一点,所以我可以更好地了解Django。
如果你的url是类似于domain/search/?q=haha
,那么你可以使用request.GET.get('q', '')
。
q
是你想要的参数,而''
是没有findq
的默认值。
如果你只是configuration你的URLconf
,那么来自regex
的捕获被作为参数(或命名参数)传递给函数。
如:
(r'^user/(?P<username>\w{0,50})/$', views.profile_page,),
然后在你的views.py
你会有
def profile_page(request, username): # Rest of the method
为了澄清camflan的解释,让我们假设你有
- 规则
url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
- 一个在
http://domain/user/thaiyoshi/?message=Hi
传入请求中
URL调度规则将捕获URL path的一部分 (这里是"user/thaiyoshi/"
),并将它们与请求对象一起传递给view函数。
查询string(这里是message=Hi
)被parsing,参数作为QueryDict
存储在request.GET
。 HTTP GET参数没有进一步的匹配或处理完成。
该视图函数将使用从URLpath提取的两个部分和一个查询参数:
def profile_page(request, username=None): user = User.objects.get(username=username) message = request.GET.get('message')
作为一个方面说明,您可以在request.method
find请求方法(在本例中为"GET"
,对于提交的表单通常为"POST"
)。 在某些情况下,检查它是否符合您的预期是很有用的。
更新:在决定是否使用URLpath或查询parameter passing信息时,以下内容可能有所帮助:
- 使用URLpath来唯一标识资源,例如
/blog/post/15/
(not/blog/posts/?id=15
) - 使用查询参数来改变资源的显示方式,比如
/blog/post/15/?show_comments=1
或者/blog/posts/2008/?sort_by=date&direction=desc
- 使用人性化的url,避免使用身份证号码,并使用date,类别和/或slu::
/blog/post/2008/09/30/django-urls/
使用GET
request.GET["id"]
使用POST
request.POST["id"]
def some_view(request, *args, **kwargs): if kwargs.get('q', None): # Do something here ..
我想分享一个可以节省您一些时间的小费。
如果你打算在你的urls.py
文件中使用这样的东西:
url(r'^(?P<username>\w+)/$', views.profile_page,),
这基本上意味着www.example.com/<username>
。 一定要把它放在你的URL条目的末尾,因为否则,它很容易与下面的URL条目发生冲突,即访问其中的一个会给你很好的错误: User matching query does not exist.
我自己也经历过 希望它有帮助!
这不是你所要求的,但是这个片段对pipe理templates
query_strings
。
对于只有request
对象的情况,你可以使用request.parser_context['kwargs']['your_param']
你有两种常见的方法来防止你的url看起来像这样:
https://domain/method/?a=x&b=y
V1:
如果特定的键是强制性的,你可以使用:
key_a = request.GET['a']
这将返回一个if键的值,如果不存在则返回一个Exception。
V2:
如果您的密钥是可选的:
request.GET.get('a')
你可以尝试,没有任何争论,这不会崩溃。 所以你可以用try: except:
来包装try: except:
并且在例子中返回HttpResponseBadRequest()
。 这是一个简单的方法,使您的代码更简单,没有使用特殊的例外处理。