Django之新扩展

分页器

Django提供了分页模块,以方便当数据量很大的时候,进行分布处理。

初次使用

使用步骤

一、导入

from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

二、实例化

paginator = Paginator(<分页对象列表>, <每页的条目数量>) # 生成一个Paginator对象

三、使用page方法

page = paginator.page(<页码>):显示对应页码条目,并且生成一个page类

 概述

django提供的分布模块,主要是用到两个类:Paginator和Page类,有各自的属性和方法

Paginator

下面介绍此类的常用属性和方法。

一、创建方法

paginator = Paginator(<分页对象列表>, <每页的条目数量>) # 生成一个Paginator对象

二、常用属性

<Paginator对象>.count:分页对象列表的个数

<Paginator对象>.num_pages:页码数

 <Paginator对象>.page_range:页码范围

Page

一、创建方法

page = <paginator对象>.page(<页码>)

二、常用方法

<page对象>.next_page_number()  # 获取下一页的页码

<page对象>.previous_page_number()  # 获取上一页的页码

<page对象>.has_next()  # 是否有下一页

<page对象>.has_previous()  # 是否有上一页

例子如下:

 views

from django.shortcuts import render
from django.http import HttpResponse
from app01 import models
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger


# Create your views here.


def index(request):
    books = models.Book.objects.all()
    paginator = Paginator(books, 8)
    try:
        num = int(request.GET.get('p', 1))
        # print(paginator.count)
        # print(paginator.num_pages)
        # print(paginator.page_range)
        page = paginator.page(num)
    except Exception as e:
        page = paginator.page(1)
    page_range = paginator.page_range
    # print(page.next_page_number())
    # print(page.previous_page_number())
    # print(page.has_next())
    # print(page.has_previous())
    return render(request, 'index.html', locals())


def add(request):
    books = []
    for i in range(100):
        book = models.Book(name='Book' + str(i), price=30 + i * i)
        books.append(book)
    models.Book.objects.bulk_create(books)
    return HttpResponse('OK')

html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/dist/css/bootstrap.css">
</head>
<body>
<ul>
    {% for book in page %}
        <li>{{ book.name }}</li>
    {% endfor %}
</ul>
<nav aria-label="Page navigation">
    <ul class="pagination">
        {% if page.has_previous %}
            <li>
                <a href="/?p={{ page.previous_page_number }}" aria-label="Previous">
                    上一页
                </a>
            </li>
        {% else %}
            <li class="disabled">
                <a aria-label="Previous">
                    上一页
                </a>
            </li>
        {% endif %}
        {% for i in page_range %}
            {% if i == num %}
                <li class="active"><a href="/?p={{ i }}">{{ i }}</a></li>
            {% else %}
                <li><a href="/?p={{ i }}">{{ i }}</a></li>
            {% endif %}
        {% endfor %}
    {% if page.has_next %}
        <li>
            <a href="/?p={{ page.next_page_number }}" aria-label="Next">
                下一页
            </a>
        </li>
        {% else %}
        <li class="disabled">
            <a href="#" aria-label="Next">
                下一页
            </a>
        </li>
    {% endif %}
{#        <li>#}
        {#            <a href="/?p={{ page.next_page_number }}" aria-label="Next">#}
        {#                下一页#}
        {#            </a>#}
        {#        </li>#}
    </ul>
</nav>
</body>
</html>

认证系统----Cookie和Session

前叙

A用户登录淘宝时,会在“购物车”看到A的购物记录。B登录,则看到自己的记录。服务器好像能智能识别并且记住用户,返回用户相对应的数据,而且不用每一次连接都需要输入用户名密码。但Http协议是一种无状态的协议,它不能保存用户的相关信息。那么以上所说的淘宝的登陆是怎么样实现的?这就需要Cookie和Session这两个东西。

Cookie

什么是Cookie?这是一个存放在客户端浏览器的容器。存放什么呢?当你在登录页面输入用户名密码时,点提交,会带着Cookie过去,服务器会验证。如果验证通过,服务器会返回一个键值对,键是sessionID,而值是随机生成的一串字符串。然后把这个键值对发给客户端浏览器,客户端浏览器则把这个键值对保存在Cookie里。下一次访问服务器时,则带着Cookie访问。服务器则对Cookie进行验证。Cookie除了可放登陆信息,也可以把其他的个人信息发给服务器处理。

Session

什么是Session?其实是一个存放在服务器端的容器,这又是存放什么呢?在上述Cookie中已经说过,浏览器把用户名密码发送,服务器如果验证通过则会生成键值对返回给客户端。但第二次浏览器带着Cookie过来时,服务器又是怎么样验证?其实第一次登陆时,服务器会把生成的Cookie随机字符串保存在session中。这样,以后浏览器访问时,可以把浏览器的Cookie中sessionID值拿来与保存在Session中的键值对进行比对,进行验证。这个Session默认会保存在django_session的数据库中,字段包含session_id、session_data、过期时间。

注意:对于同一个服务器,同一个浏览器只保存一个用户的信息。访问哪个网站就使用哪个网站的cookie。

一般认证流程

注销

注销很简单,就是把django_session数据表中会话的记录清空而已。以下语句即可实现。

request.session.flush()

猜你喜欢

转载自www.cnblogs.com/Treelight/p/12113809.html