python学习点滴记录-Day20(分页cookie/sessionajax)

Posted 天乐_技术博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python学习点滴记录-Day20(分页cookie/sessionajax)相关的知识,希望对你有一定的参考价值。

  • 上节课内容回顾: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

(c)2006-2024 SYSTEM All Rights Reserved IT常识