python学习点滴记录-Day20(分页、cookie/session、ajax)

  • 上节课内容回顾:ORM增删改查
  • Django提供的分页器使用以及分析讲解
  • Cookie和session讲解与在Django中的使用
  • ajax的讲解与简单使用

Django分页器(paginator)

要使用Django实现分页器,必须从Django中导入Paginator模块

from django.core.paginator import Paginator

假如现在有150条记录要显示,每页显示10条

>>> from django.core.paginator import Paginator#导入Paginator模块
>>> list1=[i for i in range(0,150)]#使用列表生成器生成一个包含150个数字的列表
>>> page1=Paginator(list1,10)#生成一个Paginator对象
>>> print(page1.count)#打印总的记录数,即列表list1的长度
150
>>> print(page1.num_pages)#打印总的页数,即总记录数除以每页显示的条目数
15
>>> print(page1.page_range)#页数的列表
range(1, 16)
>>> print(page1.page(1))#打印第一页的page对象
<Page 1 of 15>
>>> page1.page(1).object_list#打印第一页的所有记录
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> page1.page(2).object_list#打印第二页的所有记录
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
>>> page1.page(2).next_page_number()#打印当前的页(第2页)的下一页的页码
3
>>> page1.page(2).has_next()#第2页是否有下一页
True
>>> page1.page(2).has_previous()#第2页是否有上一页
True
>>> page1.page(2).has_other_pages()#第2是否有其他页
True
>>> page1.page(2).start_index()#第2页第一条记录的序号
11
>>> page1.page(2).end_index()#第2页最后一条记录的序号
20
>>> page1.page(0)#第0页是否有记录,会报错
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
    ...
    raise EmptyPage(_(‘That page number is less than 1‘))
django.core.paginator.EmptyPage: <exception str() failed>
>>> page1.page(15)#打印第15页的对象
<Page 15 of 15>

例子,使用Django实现一个分页效果

前端代码:

{% load staticfiles %}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="{% static ‘bootstrap/css/bootstrap.css‘ %}">
</head>
<body>
<div class="container">
    <h4>分页器</h4>
    <ul>
        #遍历boot_list中的所有元素
        {% for book in book_list %}
            #打印书籍的名称和价格
            <li>{{ book.title }}{{ book.price }}</li>
        {% endfor %}
    </ul>
    <ul class="pagination" id="pager">
        {#上一页按钮开始#}{# 如果当前页有上一页#}{% if book_list.has_previous %}{#  当前页的上一页按钮正常使用#}
            <li class="previous"><a href="/?page={{ book_list.previous_page_number }}">上一页</a></li>
        {% else %}{# 当前页的不存在上一页时,上一页的按钮不可用#}
            <li class="previous disabled"><a href="#">上一页</a></li>
        {% endif %}{#上一页按钮结束#}{# 页码开始#}{% for num in paginator.page_range %}{% if num == currentPage %}
                <li class="item active"><a href="/?page={{ num }}">{{ num }}</a></li>
            {% else %}
                <li class="item"><a href="/?page={{ num }}">{{ num }}</a></li>

            {% endif %}{% endfor %}{#页码结束#}{# 下一页按钮开始#}{% if book_list.has_next %}
            <li class="next"><a href="/?page={{ book_list.next_page_number }}">下一页</a></li>
        {% else %}
            <li class="next disabled"><a href="#">下一页</a></li>
        {% endif %}{# 下一页按钮结束#}
    </ul>
</div>
</body>
</html>

后端代码:

#导入render和HttpResponse模块
from django.shortcuts import render,HttpResponse

#导入Paginator,EmptyPage和PageNotAnInteger模块
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger

#从Django项目的应用中导入模块
from app01.models import *

def index(request):

    #获取Book数据表中的所有记录
    book_list=Book.objects.all()

    #生成paginator对象,定义每页显示10条记录
    paginator = Paginator(book_list, 10)

    #从前端获取当前的页码数,默认为1
    page = request.GET.get(‘page‘,1)

    #把当前的页码数转换成整数类型
    currentPage=int(page)

    try:
        print(page)
        book_list = paginator.page(page)#获取当前页码的记录
    except PageNotAnInteger:
        book_list = paginator.page(1)#如果用户输入的页码不是整数时,显示第1页的内容
    except EmptyPage:
        book_list = paginator.page(paginator.num_pages)#如果用户输入的页数不在系统的页码列表中时,显示最后一页的内容

    return render(request,"index.html",locals())

效果图

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

import os

from django.core.paginator import Paginator
objects = [‘john‘,‘paul‘,‘george‘,‘ringo‘,‘lucy‘,‘meiry‘,‘checy‘,‘wind‘,‘flow‘,‘rain‘]<br>
p = Paginator(objects,3)  # 3条数据为一页,实例化分页对象
print p.count  # 10 对象总共10个元素
print p.num_pages  # 4 对象可分4页
print p.page_range  # xrange(1, 5) 对象页的可迭代范围

page1 = p.page(1)  # 取对象的第一分页对象
print page1.object_list  # 第一分页对象的元素列表[‘john‘, ‘paul‘, ‘george‘]
print page1.number  # 第一分页对象的当前页值 1

page2 = p.page(2)  # 取对象的第二分页对象
print page2.object_list  # 第二分页对象的元素列表 [‘ringo‘, ‘lucy‘, ‘meiry‘]
print page2.number  # 第二分页对象的当前页码值 2

print page1.has_previous()  # 第一分页对象是否有前一页 False
print page1.has_other_pages()  # 第一分页对象是否有其它页 True

print page2.has_previous()  # 第二分页对象是否有前一页 True
print page2.has_next()  # 第二分页对象是否有下一页 True
print page2.next_page_number()  # 第二分页对象下一页码的值 3
print page2.previous_page_number()  # 第二分页对象的上一页码值 1
print page2.start_index()  # 第二分页对象的元素开始索引 4
print page2.end_index()  # 第2分页对象的元素结束索引 6

更多

https://www.cnblogs.com/kongzhagen/p/6640975.html 参考


摘自:https://www.cnblogs.com/chenchao1990/p/5283725.html

老师的博客:http://www.cnblogs.com/yuanchenqi/articles/7609586.html

cookie与session的实现原理

  

  HTTP被设计为”无状态”,每次请求都处于相同的空间中。 在一次请求和下一次请求之间没有任何状态保持,我们无法根据请求的任何方面(IP地址,用户代理等)来识别来自同一人的连续请求。上图很明显的展示了Django的session与cookie的实现原理。服务器会生成两份相同的cookie字符串,一份保存在本地,一份发向请求的浏览器。浏览器将收到的cookie字符串保存下来,当下次再发请求时,会将信息与这段cookie一同发送到服务器,服务器得到这段cookie会与本地保存的那份判断是否相同,如果相同就表示用户已经登录成功,保存用户登录成功的状态。Django的session保存在数据库中的数据相当于一个大字典,key为cookie的字符串,value仍是一个字典,字典的key和value为用户设置的相关信息。这样就可以方便的存取session里面的信息。

Cookies

cookies 是浏览器为 Web 服务器存储的一小段信息。 每次浏览器从某个服务器请求页面时,它向服务器回送之前收到的cookies。它保存在浏览器下的某个文件夹下。

浏览器下的cookie:

Session  

  Django的Session机制会向请求的浏览器发送cookie字符串。同时也会保存到本地一份,用来验证浏览器登录是否为同一用户。它存在于服务器,Django默认会把session存入到数据库中。

  Session依赖于Cookie,如果浏览器不能保存cooki那么session就失效了。因为它需要浏览器的cooki值去session里做对比。session就是用来在服务器端保存用户的会话状态。

操作session

根据网友lvusyy的友情提示,在操作session之前,你需要同步一下Django的数据库。我用的是Django自带的sqlite3.所以需要执行同步的命令:

还有一点,在django处理请求的过程中,需要经过中间件的过滤,涉及到跨站请求伪造时,django会把请求阻止过滤掉,所以我们要在setting.py中禁用跨站请求伪造的中间件,如果不禁用,记得好像会报一个403的错误黄页。关于跨站请求伪造,之后的章节我会详细说明其功能用处:

Django中操作session:

  获取session:request.session[key]     request.session.get(key)

  设置session:reqeust.session[key] = value

  删除session:del request[key]

  request.session是每一个客户端相当于在上图中对应的value

一段简单的Django中实现session的代码,判断用户是否已经成功登录:

 1 def login(request):
 2     if request.method ==‘POST‘:
 3         username = request.POST.get(‘username‘)
 4         pwd = request.POST.get(‘pwd‘)
 5         if username ==‘lisi‘ and pwd == ‘12345‘:
 6             request.session[‘IS_LOGIN‘] = True       设置session
 7             return redirect(‘/app01/home/‘)
 8
 9     return render(request,‘login.html‘)
10
11 def home(request):
12     is_login = request.session.get(‘IS_LOGIN‘,False)   获取session里的值
13     if is_login:
14         return HttpResponse(‘order‘)
15     else:
16         return redirect(‘/app01/login/‘)

过期时间

cookie可以有过期时间,这样浏览器就知道什么时候可以删除cookie了。 如果cookie没有设置过期时间,当用户关闭浏览器的时候,cookie就自动过期了。 你可以改变 SESSION_EXPIRE_AT_BROWSER_CLOSE 的设置来控制session框架的这一行为。缺省情况下, SESSION_EXPIRE_AT_BROWSER_CLOSE 设置为 False ,这样,会话cookie可以在用户浏览器中保持有效达 SESSION_COOKIE_AGE 秒(缺省设置是两周,即1,209,600 秒)。 如果你不想用户每次打开浏览器都必须重新登陆的话,用这个参数来帮你。如果 SESSION_EXPIRE_AT_BROWSER_CLOSE 设置为 True ,当浏览器关闭时,Django会使cookie失效。

SESSION_COOKIE_AGE:设置cookie在浏览器中存活的时间

在settings.py中添加:

例子

结合前端实现的cookie与session会话机制:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <form action="/app01/login/" method="post">
        <input type="text" name="username" />
        <input type="password" name="pwd" />
        <input type="submit" value="submit"/>
    </form>

</body>
</html>

login.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
        .header{
            height: 48px;
        }
    </style>
</head>
<body>
    <div class="header">

        <div style="float: right">{{ username }}</div>
        <div style="float: right"><a href="/app01/logout/">注销</a></div>
    </div>
    <div style="height: 500px;background-color: #ddd"></div>
</body>
</html>

home.html

views.py

def login(request):
    if request.method == "POST":
        username = request.POST.get(‘username‘)
        pwd = request.POST.get(‘pwd‘)
        if username == ‘alex‘ and pwd == ‘123‘:
            request.session[‘IS_LOGIN‘] = True
            request.session[‘USRNAME‘] = ‘alex‘
            return redirect(‘/app01/home/‘)
        elif username == ‘eirc‘ and pwd == ‘123‘:
            request.session[‘IS_LOGIN‘] = True
            request.session[‘USRNAME‘] = ‘eirc‘
            return redirect(‘/app01/home/‘)

    return render(request, ‘login.html‘)

def home(request):
    is_login = request.session.get(‘IS_LOGIN‘, False)
    if is_login:
        username = request.session.get(‘USRNAME‘, False)
        return render(request, ‘home.html‘, {‘username‘: username})
    else:
        return redirect("/app01/login/")

session存储的相关配置

(1)数据库配置(默认):


1

2

3

4

5

6

7

8

9

10

11

12

13

14

Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。

 

a. 配置 settings.py

 

    SESSION_ENGINE = ‘django.contrib.sessions.backends.db‘   # 引擎(默认)

     

    SESSION_COOKIE_NAME = "sessionid"                       # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)

    SESSION_COOKIE_PATH = "/"                               # Session的cookie保存的路径(默认)

    SESSION_COOKIE_DOMAIN = None                             # Session的cookie保存的域名(默认)

    SESSION_COOKIE_SECURE = False                            # 是否Https传输cookie(默认)

    SESSION_COOKIE_HTTPONLY = True                           # 是否Session的cookie只支持http传输(默认)

    SESSION_COOKIE_AGE = 1209600                             # Session的cookie失效日期(2周)(默认)

    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                  # 是否关闭浏览器使得Session过期(默认)

    SESSION_SAVE_EVERY_REQUEST = False                       # 是否每次请求都保存Session,默认修改之后才保存(默认)

(2)缓存配置 


1

2

3

4

5

6

7

8

9

10

11

12

13

14

a. 配置 settings.py

 

    SESSION_ENGINE = ‘django.contrib.sessions.backends.cache‘  # 引擎

    SESSION_CACHE_ALIAS = ‘default‘                            # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置

 

 

    SESSION_COOKIE_NAME = "sessionid"                        # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串

    SESSION_COOKIE_PATH = "/"                                # Session的cookie保存的路径

    SESSION_COOKIE_DOMAIN = None                              # Session的cookie保存的域名

    SESSION_COOKIE_SECURE = False                             # 是否Https传输cookie

    SESSION_COOKIE_HTTPONLY = True                            # 是否Session的cookie只支持http传输

    SESSION_COOKIE_AGE = 1209600                              # Session的cookie失效日期(2周)

    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                   # 是否关闭浏览器使得Session过期

    SESSION_SAVE_EVERY_REQUEST = False                        # 是否每次请求都保存Session,默认修改之后才保存

(3)文件配置


1

2

3

4

5

6

7

8

9

10

11

12

a. 配置 settings.py

 

    SESSION_ENGINE = ‘django.contrib.sessions.backends.file‘    # 引擎

    SESSION_FILE_PATH = None                                    # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()        

    SESSION_COOKIE_NAME = "sessionid"                          # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串

    SESSION_COOKIE_PATH = "/"                                  # Session的cookie保存的路径

    SESSION_COOKIE_DOMAIN = None                                # Session的cookie保存的域名

    SESSION_COOKIE_SECURE = False                               # 是否Https传输cookie

    SESSION_COOKIE_HTTPONLY = True                              # 是否Session的cookie只支持http传输

    SESSION_COOKIE_AGE = 1209600                                # Session的cookie失效日期(2周)

    SESSION_EXPIRE_AT_BROWSER_CLOSE = False                     # 是否关闭浏览器使得Session过期

    SESSION_SAVE_EVERY_REQUEST = False                          # 是否每次请求都保存Session,默认修改之后

时间: 2025-01-05 03:55:18

python学习点滴记录-Day20(分页、cookie/session、ajax)的相关文章

python学习点滴记录-Day01

参考链接 https://triaquae.gitbooks.io/python/content/chapter1.html 一.python的安装 1.windows平台的到python官网下载windows版本安装介质,按照提示安装完毕即可使用. 2.linux平台的可以通过yum或者python官网下载tar包进行安装. 无论是windows还是linux下,为了方便使用,建议添加到环境变量中. windows:计算机属性--高级系统设置--系统--环境变量--PATH中添加python的

python学习点滴记录-Day03

函数基础 一. 使用函数带来的好处 #使代码组织结构清晰#减少代码冗余#可以统一管理且降低维护难度可以把函数当作日常生活中的工具,具备某种功能的物件,直接拿来使用即可. 二.函数的分类 内置函数:python解释器内置了大量函数方便开发者直接使用 自定义函数:根据自身需求自己编写的函数 三.函数的使用 定义函数 函数的定义与变量的定义类似,需要提前定义再调用 定义函数时只检测语法,不执行代码 def 函数名(arg1,arg2,arg3): '''注释''' 函数体 return 返回值 调用函

python学习点滴记录-Day08

本次课大纲 接口与归一化设计 多态与多态性 封装 静态属性property 面向对象高级 异常处理 网络编程 接口与归一化设计 1.什么是接口 =================第一部分:Java 语言中的接口很好的展现了接口的含义: IAnimal.java /* * Java的Interface接口的特征: * 1)是一组功能的集合,而不是一个功能 * 2)接口的功能用于交互,所有的功能都是public,即别的对象可操作 * 3)接口只定义函数,但不涉及函数实现 * 4)这些功能是相关的,都

python学习点滴记录-Day17-django-part2

url配置系统之无名分组 url配置系统之有名分组 url配置系统之分发app url配置系统之url反向解析 视图函数之请求对象 视图函数之响应对象 模板语法之渲染变量 模板语法之变量过滤器 ORM URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于这个URL调用这段代码,对于那个URL调用那段代码. ''' urlpatterns = [ url(正则表达式, views视图函数,参

python学习点滴记录-Day18-django-orm

第18天课程内容: 模板语言的常用标签 自定义过滤器与标签 模板语言之继承 ORM的查询API 单表查询之双下划线 一对多的添加数据方法 mtv补充 修改pycharm连接db为mysql时遇到的问题 解决: 在项目的__init__.py文件中加 import pymysql pymysql.install_as_MySQLdb() post提交表单数据时,默认会提示403 forbidden,需要在form表单处添加{% csrf_token %},render方法会为它渲染一个随机字符串一

python学习点滴记录-Day21-项目

待整理 ajax的跨域三种方式 单独的cookie验证,写入与调取验证 form组件 用来校验用户提交的数据 可以做到保留正确信息 ,提示错误信息 以上为上午内容 下午内容 梳理博客项目所需要的表,表与表之间的关系 验证码

python学习点滴记录-Day02补充-文件操作

字符编码: 把人类的字符翻译成计算机能认识的数字 字符编码表 存放着人类字符和计算机数字的对应关系表 ascii.gbk.utf-8.unicode unicode>encode(utf8)>bytes bytes>decode(utf8)>unicode 文件处理补充: 字符以什么格式编码的,就要以什么格式解码 文件的打开模式 文件句柄 = open('文件路径', '模式') 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文

python学习点滴记录-Day12-前端基础之html

html 定义: 超文本标记语言(Hypertext Markup Language,HTML)通过标签语言来标记要显示的网页中的各个部分.一套规则,浏览器认识的规则 浏览器按顺序渲染网页文件,然后根据标记符解释和显示内容.但需要注意的是,对于不同的浏览器,对同一标签可能会有不完全相同的解释(兼容性) 静态网页文件扩展名:.html 或 .htm HTML 不是一种编程语言,而是一种标记语言 (markup language) HTML 使用标记标签来描述网页 html结构 <!DOCTYPE

python学习点滴记录-Day22

文件上传 form表单文件操作 ajax文件操作 头像上传 默认头像覆盖 预览 注册页面,form钩子,清空之前的error信息 博客首页,初始化数据,首页样式调试. auth实现登录与注册 个人中心左侧的昵称 园龄 头像:分类归档.标签归档.时间归档: 各个url跳转 文章详情页 点赞 不能重复点赞, 事物 def diggit(request): from django.db.models import F from django.db import transaction state={"