分页器
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()