我正在定义正则表达式以捕获url中的参数,如教程中所述.如何从URL中访问参数作为HttpRequest
对象的一部分?我HttpRequest.GET
当前返回一个空QueryDict
对象.
我想学习如何在没有库的情况下这样做,这样我就能更好地了解Django.
当url像:domain/search/?q=haha
,那么你会使用request.GET.get('q', '')
.
q
是您想要的参数,''
如果q
找不到则是默认值.
但是,如果您只是配置您的URLconf
,那么您的捕获regex
将作为参数(或命名参数)传递给函数.
如:
(r'^user/(?P\w{0,50})/$', views.profile_page,),
然后在你的views.py
你会有
def profile_page(request, username): # Rest of the method
为了澄清camflan的解释,让我们假设你有
规则 url(regex=r'^user/(?P
a.收到请求 http://domain/user/thaiyoshi/?message=Hi
URL调度程序规则将捕获URL 路径的一部分(此处"user/thaiyoshi/"
),并将它们与请求对象一起传递给视图函数.
message=Hi
解析查询字符串(此处),并将参数存储为QueryDict
in 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号并使用日期,类别和/或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\w+)/$', views.profile_page,),
这基本上意味着www.example.com/
.请务必将其放置在你的URL条目的结束,否则,很容易造成下面下面的URL条目,即访问它们的一个冲突将会给你不错的错误:User matching query does not exist.
我刚刚经历了它自己; 希望能帮助到你!
对于只有request
您可以使用的对象的情况request.parser_context['kwargs']['your_param']
如果您的网址如下所示,您有两种常用的方法:
https://domain/method/?a=x&b=y
V1:
如果特定密钥是强制性的,您可以使用:
key_a = request.GET['a']
这将返回a
if键存在的值,如果不存在,则返回Exception.
V2:
如果您的钥匙是可选的:
request.GET.get('a')
您可以尝试不带任何参数,这不会崩溃.所以你可以用它包装try: except:
并返回HttpResponseBadRequest()
示例.这是一种简单的方法,可以使代码不那么复杂,而无需使用特殊的异常处理.
我想在这里添加一些我自己的选项。有人会想知道如何在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
此外,当您在网址中编写查询字符串时
http://servername:port/domain/search/?q=CA
不要将查询字符串用引号引起来,例如
http://servername:port/domain/search/?q="CA"
这不正是你问什么,但这个片段是管理有帮助query_strings
在templates
.