zoukankan      html  css  js  c++  java
  • Cookie、Session和自定义分页与django内置分页

    为什么使用Cookie:因为HTTP请求是没有状态的,每一次请求都是独立的。

    什么是Cookie:Cookie就是保存在浏览器上的键值对,服务端控制着响应,在响应里添加一个键值对,让浏览器在本地保存,下一次请求的时候,自动携带这个键值对,是在浏览器端设置的,浏览器端也可以禁用Cookie。

    Cookie的设置,以及使用装饰器验证浏览器的登录状态

    from django.shortcuts import render,HttpResponse,redirect
    
    # Create your views here.
    def login(request):
        if request.method == "POST":
            name = request.POST.get("name")
            pwd = request.POST.get("pwd")
            if name == 'alex' and  pwd == '123123':
                next = request.GET.get('next')
                print(next)
                if next:
                    res = redirect(next)
                    res.set_signed_cookie("is_login","1",salt="s10nb",max_age=10)
                    return res
                res =  redirect('/app01/home/')
                res.set_signed_cookie("is_login","1",salt="s10nb" ,max_age=10)
                return res
        return render(request, 'app01/login.html')
    def  home(request):
        res = request.get_signed_cookie("is_login",default="0",salt="s10nb")
        if res == '1':
            return render(request, 'app01/home.html')
        else :
            return  redirect('/app01/login/')
    
    def timmer(func):
        def wrapper(request):
            res = request.get_signed_cookie("is_login",default="0",salt="s10nb")
            if res == '1':
               ret = func(request)
               return ret
            else :
                next_url = request.path_info
                print(next_url)
                return  redirect('/app01/login/?next={}'.format(next_url))
        return wrapper
    @timmer
    def index(request):
        return render(request, 'app01/index.html')
    

     默认关闭浏览器,Cookie值就失效,可以设置时长max_age=7*24*60*60(七天失效)

    注销登录

    def logout(request):
        rep = redict("/app01/login/")
        rep.delete_cookie('is_login')
        return rep
    

     Session

    Session是保存在浏览器上的键值对,必须依赖Session,服务端生成的Cookie返回到浏览器,跟Cookie匹配的Session保存在服务器端,下次再登录时,根据Cookie获取Seeion值,存储的数据多,较为安全。

    设置Session

     request.session['is_login']='1'
    

     获取Session值

    首先获取Cookie的随机字符串,根据字符串的值去数据库取Seeion的数据,解密,把Session值反序列化成字典,然后在字典里可以根据key取值。

    from django.shortcuts import render,HttpResponse,redirect
    
    # Create your views here.
    def login(request):
        if request.method == "POST":
            name = request.POST.get("name")
            pwd = request.POST.get("pwd")
            if name == 'alex' and  pwd == '123123':
                next = request.GET.get('next')
                print(next)
                if next:
                    res = redirect(next)
                    request.session['is_login']='1'
                    return res
                res =  redirect('/app02/home/')
                request.session['is_login']='1'
                return res
        return render(request, 'app02/login.html')
    def  home(request):
        res = request.session.get('is_login')
        if res == '1':
            return render(request, 'app02/home.html')
        else :
            return  redirect('/app02/login/')
    
    def timmer(func):
        def wrapper(request):
            res = request.session.get('is_login')
            if res == '1':
               ret = func(request)
               return ret
            else :
                next_url = request.path_info
                print(next_url)
                return  redirect('/app02/login/?next={}'.format(next_url))
        return wrapper
    @timmer
    def index(request):
        return render(request, 'app02/index.html')
    

     注销登录,删除Session和Cookie数据

    def logout(request):
        request.session.flush()   # request.session.delete()只删除session不删除cookie
        return redirect("/app02/login")
    

     request.session.set_expiry(value)

    value如果是整数,就是多少秒之后失效

    value如果是datatime或者timemelta,session就会在这个时间后失效

    value如果是0,关闭浏览器就失效。

    SESSION_COOKIE_AGE=129600  session的Cookie失效日期默认为2周。

    SESSION_SAVE_EVERY_REQUEST = True    设置后,每一次的请求都重新保存session

    默认session修改后才重新保存

    自定义分页

    首选数据库批量创建数据

    import  os,sys
    if __name__ == "__main__":
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ajax_demo.settings")
        import django
        django.setup()
        from app01  import models
        objs = [models.Userinfo(name="第{}个".format(i))  for i  in range(105)]
        models.Userinfo.objects.bulk_create(objs,10)
    

     views.py

    #分页
    def  page_s(request):
        objs = models.Userinfo.objects.all()
        page_line = len(objs)
        m,n = divmod(page_line,10)
        page_sum = m
        if n>0:
            page_sum = m+1
        # page_sum=[i for i  in range(1,page_sum+1)]
        Page_sum = page_sum+1
        page_id = request.GET.get('page_id')
        page_start = 0
        page_end = 10
        pro_page_id = 0
        net_page_id = 2
        page_sum_start = 1
        page_sum_end = 11
        if page_sum<11:
            page_sum_end=page_sum
        if page_id :
            page_id = int(page_id)
            page_start = (page_id-1)*10
            page_end = (page_id)*10
            pro_page_id = page_id-1
            net_page_id = page_id+1
            if page_id - 5 >0 and page_id +5 <=page_sum:
                page_sum_start = page_id -5
                page_sum_end = page_id +5
            if page_id +5 >page_sum:
                page_sum_start = page_sum-10
                page_sum_end = page_sum
        page_sum =[i for i in range(page_sum_start,page_sum_end+1)]
        print(page_start,page_end)
        objs = objs[page_start:page_end]
        print(objs)
        return render(request,'page_s.html',
                      {"objs":objs,
                       "page_sum":page_sum,
                       "pro_page_id":pro_page_id,
                       "net_page_id":net_page_id,
                       "Page_sum":Page_sum})
    

     page_s.html

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <title></title>
        <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
    </head>
    <body>
    <table>
        <thead>
        <tr>
            <td></td>
        </tr>
        </thead>
        <tbody>
        {% for obj in objs %}
    
            <tr>
                <td>
                    {{ obj.name }}
                </td>
            </tr>
        {% endfor %}
        </tbody>
    </table>
    <nav aria-label="Page navigation" class="pull-right">
        <ul class="pagination">
            <li>
                <a href="/page_s/?page_id={{ pro_page_id }}" class="btn {% if pro_page_id == 0  %} disabled {% endif %} "  aria-label="Previous">
                    <span aria-hidden="true">«</span>
                </a>
            </li>
            {% for page_sigle in page_sum  %}
            <li><a href="/page_s/?page_id={{ page_sigle }}">{{ page_sigle }}</a></li>
            {% endfor %}
            <li>
                <a href="/page_s/?page_id={{ net_page_id }}"  class="btn {% if net_page_id == Page_sum  %} disabled {% endif %} aria-label="Next">
                    <span aria-hidden="true">»</span>
                </a>
            </li>
        </ul>
    </nav>
    <script src="/static/jquery-3.3.1.min.js"></script>
    <script src="/static/bootstrap/js/bootstrap.min.js"></script>
    </body>
    </html>
    

     简单分页

    from django.shortcuts import render
    from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
    
    L = []
    for i in range(999):
        L.append(i)
    
    def index(request):
        current_page = request.GET.get('p')
    
        paginator = Paginator(L, 10)
        # per_page: 每页显示条目数量
        # count:    数据总个数
        # num_pages:总页数
        # page_range:总页数的索引范围,如: (1,10),(1,200)
        # page:     page对象
        try:
            posts = paginator.page(current_page)
            # has_next              是否有下一页
            # next_page_number      下一页页码
            # has_previous          是否有上一页
            # previous_page_number  上一页页码
            # object_list           分页之后的数据列表
            # number                当前页
            # paginator             paginator对象
        except PageNotAnInteger:
            posts = paginator.page(1)
        except EmptyPage:
            posts = paginator.page(paginator.num_pages)
        return render(request, 'index.html', {'posts': posts})
    简单分页view.py
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
    <ul>
        {% for item in posts %}
            <li>{{ item }}</li>
        {% endfor %}
    </ul>
    
    <div class="pagination">
          <span class="step-links">
            {% if posts.has_previous %}
                <a href="?p={{ posts.previous_page_number }}">Previous</a>
            {% endif %}
              <span class="current">
                Page {{ posts.number }} of {{ posts.paginator.num_pages }}.
              </span>
              {% if posts.has_next %}
                  <a href="?p={{ posts.next_page_number }}">Next</a>
              {% endif %}
          </span>
    
    </div>
    </body>
    </html>
    
    Html
    简单分页HTML

    内置分页扩展

    class CustomPaginator(Paginator):
        def __init__(self, current_page, max_pager_num, *args, **kwargs):
            """
            :param current_page: 当前页
            :param max_pager_num:最多显示的页码个数
            :param args:
            :param kwargs:
            :return:
            """
            self.current_page = int(current_page)
            self.max_pager_num = max_pager_num
            super(CustomPaginator, self).__init__(*args, **kwargs)
    
        def page_num_range(self):
            # 当前页面
            # self.current_page
            # 总页数
            # self.num_pages
            # 最多显示的页码个数
            # self.max_pager_num
            print(1)
            if self.num_pages < self.max_pager_num:
                return range(1, self.num_pages + 1)
            print(2)
            part = int(self.max_pager_num / 2)
            if self.current_page - part < 1:
                return range(1, self.max_pager_num + 1)
            print(3)
            if self.current_page + part > self.num_pages:
                return range(self.num_pages + 1 - self.max_pager_num, self.num_pages + 1)
            print(4)
            return range(self.current_page - part, self.current_page + part + 1)
    
    
    L = []
    for i in range(999):
        L.append(i)
    
    def index(request):
        current_page = request.GET.get('p')
        if not current_page:
            current_page=1
        paginator = CustomPaginator(current_page, 11, L, 10)
        # per_page: 每页显示条目数量
        # count:    数据总个数
        # num_pages:总页数
        # page_range:总页数的索引范围,如: (1,10),(1,200)
        # page:     page对象
        try:
            posts = paginator.page(current_page)
            print('post::::',posts,type(posts))
            # has_next              是否有下一页
            # next_page_number      下一页页码
            # has_previous          是否有上一页
            # previous_page_number  上一页页码
            # object_list           分页之后的数据列表
            # number                当前页
            # paginator             paginator对象
        except PageNotAnInteger:
            posts = paginator.page(1)
        except EmptyPage:
            print('*'*120)
            posts = paginator.page(paginator.num_pages)
    
        return render(request, 'index.html', {'posts': posts})
    内置分页扩展views.py
    <!DOCTYPE html>
    <html>
    <head lang="en">
        <meta charset="UTF-8">
        <title></title>
        <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">
    </head>
    <body>
    <div class="container">
        <ul>
        {% for item in posts %}
            <li>{{ item }}</li>
        {% endfor %}
    </ul>
    
    <div class="pagination">
    
    
    <nav aria-label="Page navigation">
      <ul class="pagination">
    
      {% if posts.has_previous %}
        <li>
          <a href="?p={{ posts.previous_page_number }}"  aria-label="Previous">
            <span aria-hidden="true">&laquo;</span>
          </a>
        </li>
      {% endif %}
        {% for i in posts.paginator.page_num_range %}
            <li><a href="?p={{ i }}">{{ i }}</a></li>
        {% endfor %}
          {% if posts.has_next %}
        <li>
          <a href="?p={{ posts.next_page_number }}"  aria-label="Next">
            <span aria-hidden="true">&raquo;</span>
          </a>
        </li>
          {% endif %}
      </ul>
    </nav>
    {#<span class="current">#}
    {#Page {{ posts.number }} of {{ posts.paginator.num_pages }}.#}
    {#</span>#}
    
    </div>
    </div>
    
    <script  src="/static/jquery-3.3.1.js"></script>
    <script  src="/static/bootstrap/js/bootstrap.min.js"></script>
    </body>
    </html>
    内置分页扩展HTML

    I can feel you forgetting me。。 有一种默契叫做我不理你,你就不理我

  • 相关阅读:
    delegate和event的区别 (zz)
    delegate和event的区别 (zz)
    delegate和event的区别 (zz)
    delegate和event的区别 (zz)
    以太坊网络服务分析
    以太坊:P2P网络数据处理流程
    以太坊:P2P网络数据交互
    以太坊虚拟机的基本介绍
    Solidity概述及基本代码展示
    Solidity编译器和简单调试
  • 原文地址:https://www.cnblogs.com/weidaijie/p/9934655.html
Copyright © 2011-2022 走看看