• 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,默认修改之后
  • 相关阅读:
    boostrap各种设备大小,以及不同设备的隐藏和显示
    thinkphp5 layout布局的理解和使用,模板继承等等
    thinkphp5的前台是如何实现的,以及后台栏目的作用
    JS工作流进度条显示,以及相关的思路和原理
    Lnmp服务器集群配置研究和实践
    关于require.js写的最通俗易懂的文章
    使用js把html导出word,单位换算,配置样式和分页,页边距,字体及大小,行距,缩进,@page等等
    使用phpword插件,导出word,并解决循环数据的问题
    php使用array_filter函数,并使用闭包,动态的过滤数组
    leetcode——437. 路径总和 III
  • 原文地址:https://www.cnblogs.com/tianleblog/p/7898965.html
Copyright © 2020-2023  润新知