request.GET.get在做什么?

时间:2018-07-16 15:55:09

标签: django

我正在通过示例chapter1看A.Mele Django

def post_list(request, category=None):
    object_list = Post.published.all()
    paginator = Paginator(object_list, 3) # 3 posts in each page
    page = request.GET.get('page')
    try:
        posts = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer deliver the first page
        posts = paginator.page(1)
    except EmptyPage:
        # If page is out of range deliver last page of results
        posts = paginator.page(paginator.num_pages)
    return render(request, 'blog/post/list.html', {'page': page,
                                                   'posts': posts})

这行页面是我真正不明白的。

page = request.GET.get('page')

Get方法将用户信息与请求一起发送。但是实际会做什么? 这是blog / post / list.html

{% extends "blog/base.html" %}

{% block title  %}My blog{% endblock %}
{% block content %}

  {% include "pagination.html" with page=posts %}

  <h1>My Blog</h1>

  {% for post in posts %}
    <h2>
      <a href="{{ post.get_absolute_url }}">{{ post.title }}</a>
    </h2>
    <p class="date">
      Published {{ post.publish }} by {{ post.author }}
    </p>
    {{ post.body|truncatewords:30|linebreaks }}
  {% endfor %}
{% endblock %}

1 个答案:

答案 0 :(得分:6)

您可以在URL中发送参数。例如:

https://www.example.com/some/path/foo.html?key1=val1&key2=val2

黑体部分包含两个参数:key1key2,其值分别为val1val2

request.GET对这些参数进行解码并将其存储在QueryDict中。这基本上是某种字典(但是键可以映射到多个值)。

因此,我们在这里寻找一个?page=1参数,并使用request.GET.get('page')获得该参数。如果没有给出此类参数,则返回None

我们可以将其用于分页,因为例如页面可以包含下一页和上一页的URL,其中?page=参数将递增或递减。

因此,base.html可能包含一些逻辑,这些逻辑会在第二页上生成与?page=1?page=3的链接,从而链接到 same URL,但参数不同。然后Django解码这些参数,并相应地对查询集进行分页。

通常情况下,如果URL没有副作用,则对URL中的参数进行编码(这意味着数据库中没有任何重要数据会发生变化)。在URL中编码数据的优点是,例如,如果您与朋友共享URL,他/她将看到相同的分页(因此该页面本身将 not 本身不显示第一个博客文章)

这与例如用于登录或执行某些效果的URL相反:然后,通常将数据编码在请求标头中。结果,您将与共享URL的人共享敏感数据,并且第二次发出请求通常没有任何作用。