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

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

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


当前回答

你不妨检查一下请求。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为你提供了处理后悔的所有能力,比如:

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

更多信息请访问django-optional-url-parameters

其他回答

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

我想分享一个可以节省你时间的小窍门。 如果你计划在urls.py文件中使用这样的东西:

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

这意味着www.example.com/<用户名>。一定要把它放在URL条目的末尾,否则,它很容易与下面的URL条目发生冲突,即访问其中一个URL条目会给你一个漂亮的错误:用户匹配查询不存在。 我自己也经历过;希望能有所帮助!

为了澄清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/

这并不是您所需要的,但是这段代码有助于管理模板中的query_strings。

Url参数可能被request.query_params捕获