在request.GET中捕获url参数

时间:2008-09-29 20:29:55

标签: django url rest

我正在定义正则表达式以捕获url中的参数,如教程中所述。如何从作为HttpRequest对象的一部分的URL访问参数?我的HttpRequest.GET当前返回一个空的QueryDict对象。

我想学习如何在没有图书馆的情况下这样做,这样我就能更好地了解Django。

15 个答案:

答案 0 :(得分:576)

当网址如下:domain/search/?q=haha 时,  然后你会使用request.GET.get('q', '')

q是您想要的参数,''是默认值,如果找不到q

但是,如果您只是配置URLconf ,那么regex中的捕获将作为参数(或命名参数)传递给函数。

如:

(r'^user/(?P<username>\w{0,50})/$', views.profile_page,),

然后在你的views.py中你会有

def profile_page(request, username):
    # Rest of the method

答案 1 :(得分:306)

为了澄清camflan的解释,让我们假设你有

  • 规则url(regex=r'^user/(?P<username>\w{1,50})/$', view='views.profile_page')
  • a来自http://domain/user/thaiyoshi/?message=Hi
  • 的传入请求

URL调度程序规则将捕获URL path (此处为"user/thaiyoshi/")的部分内容,并将它们与请求对象一起传递给view函数。

解析查询字符串(此处为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路径来唯一标识资源,例如: /blog/post/15/(不是/blog/posts/?id=15
  • 使用查询参数来改变资源的显示方式,例如: /blog/post/15/?show_comments=1/blog/posts/2008/?sort_by=date&direction=desc
  • 制作人性化的网址,避免使用ID号并使用例如日期,类别和/或slu :: /blog/post/2008/09/30/django-urls/

答案 2 :(得分:46)

使用GET

request.GET["id"]

使用POST

request.POST["id"]

答案 3 :(得分:20)

def some_view(request, *args, **kwargs):
    if kwargs.get('q', None):
        # Do something here ..

答案 4 :(得分:16)

我想分享一个可能为您省时的提示 如果您打算在urls.py文件中使用此类内容:

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

这基本上意味着www.example.com/<username>。请务必将其放在URL条目的末尾,否则,它很容易导致与下面的URL条目冲突,即访问其中一个给您一个很好的错误:{ {1}}

我自己刚刚体验过它;希望它有所帮助!

答案 5 :(得分:11)

对于只有request对象的情况,您可以使用request.parser_context['kwargs']['your_param']

答案 6 :(得分:10)

如果您的网址如下所示,您有两种常用方法:

https://domain/method/?a=x&b=y

V1:

如果特定密钥是强制性的,您可以使用:

key_a = request.GET['a']

如果密钥存在,则返回a的值,否则返回异常。

V2:

如果您的钥匙是可选的:

request.GET.get('a')

你可以尝试不带任何参数,这不会崩溃。 因此,您可以使用try: except:将其换行并在示例中返回HttpResponseBadRequest()。 这是一种简单的方法,可以使代码不那么复杂,而无需使用特殊的异常处理。

答案 7 :(得分:8)

这不是您要求的,但this snippet有助于管理query_strings中的templates

答案 8 :(得分:5)

我想在这里添加一些自己的选项。有人会想知道如何在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时。查询部分&#39;?q = CA&#39;将自动保留在您可以引用的哈希表中

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"

答案 9 :(得分:3)

如果您仅有权访问视图对象,则可以通过以下方式获取URL路径中定义的参数:

view.kwargs.get('url_param')

如果您只能访问请求对象,请使用以下命令:

request.resolver_match.kwargs.get('url_param')

在Django 3上测试。

答案 10 :(得分:3)

如果您不知道参数的名称并希望使用它们,您可以使用 request.GET.keys()dict(request.GET) 函数

答案 11 :(得分:1)

这是可以实现的另一种替代解决方案:

在URL配置中:

urlpatterns = [path('runreport/<str:queryparams>', views.get)]

在视图中:

list2 = queryparams.split("&")

答案 12 :(得分:0)

这些查询当前以两种方式完成。如果要访问查询参数(GET),可以查询以下内容:

http://myserver:port/resource/?status=1
request.query_params.get('status', None) => 1

如果要访问POST传递的参数,则需要使用以下方式进行访问:

request.data.get('role', None)

使用“ get()”访问字典(QueryDict),可以设置默认值。在上述情况下,如果未告知'状态'或'角色',则值为None。

答案 13 :(得分:0)

您也可以检查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)

您说它返回空查询字典

我认为您需要调整网址以接受必需或可选的args或kwargs Django通过regrex获得了所需的全部功能,

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

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

答案 14 :(得分:0)

要执行此操作,只需在javascript中键入以下内容即可:

function getParams(url) {
    var params = {};
    var parser = document.createElement('a');
    parser.href = url;
    var query = parser.search.substring(1);
    var vars = query.split('&');
    for (var i = 0; i < vars.length; i++) {
        var pair = vars[i].split('=');
        params[pair[0]] = decodeURIComponent(pair[1]);
    }
    return params;
};
var url = window.location.href;
getParams(url);