zoukankan      html  css  js  c++  java
  • django-session与分页

    前面我们介绍了cookies,主要应用在用户登录上,保存用户登录状态,不过cookies直接放在了浏览器上,安全性较低,所以我们便引出了session功能与cookies相同,不同的是它放在了客户端,相比较cookies来说安全性更高。还有分页,这是一个比较常用的功能。

    本篇导航:

    一、session

    1、基本语法:

    复制代码
    1、设置Sessions值
              request.session['session_name'] ="admin"
    2、获取Sessions值
              session_name = request.session["session_name"]
              session_name = request.session.get("session_name")
    3、删除Sessions值
              del request.session["session_name"]
              request.session.flush()
    4、检测是否操作session值
              if "session_name" is request.session :
    复制代码

    将所有Session失效日期小于当前日期的数据删除

    request.session.clear_expired()

    检查 用户session的随机字符串 在数据库中是否

    request.session.exists("session_key")

    删除当前用户的所有Session数据

    request.session.delete("session_key")

    request.session.set_expiry(value)

    默认的过期时间是两周,如果自己设置了过期时间,这样自己设定的优先级就会高于默认的

    如果value是个整数,session会在些秒数后失效。

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

    如果value是0,用户关闭浏览器session就会失效。

    如果value是None,session会依赖全局session失效策略。

    配置setting.py

    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,默认修改之后才保存(默认)

    Django中对于session的存储方式

    Django中支持session,其中内部提供了5种类型的session供开发者使用:

    数据库(默认)

    缓存

    文件

    缓存+数据库

    加密cookie

    1、如果是数据库,需要在settings.py中配置如下:

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

    2、如果是缓存session,需要在settings.py中配置如下:

    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'(引擎)

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

    1、    如果是文件session, 需要在settings.py中配置如下:

    SESSION_ENGINE = 'django.contrib.sessions.backends.file' (引擎)

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

    2、    如果是缓存+数据库session,需要在settings.py中配置如下:

    SESSION_ENGINE='django.contrib.sessions.backends.cached_db'       (引擎)

    2、解析图

    3、实例

    1)views

    def login(requset):
        if requset.method=="POST":
            username=requset.POST.get("user")
            password=requset.POST.get("pwd")
            ret=models.UserInfo.objects.filter(username=username,password=password)
            if ret:
                requset.session["IS_LOGON"]=True
                requset.session["USER"]=username
    
                return redirect("/home/")
            else:
                return redirect("/login/")
    
        return render(requset,"login.html")
    
    def home(request):
        ret=request.session.get("IS_LOGON",None)
    
        if ret :
           username=request.session.get("USER")
           return render(request, "home.html",locals())
        else:
            return redirect("/login/")
    View Code

    2)template

    <form action="/login/" method="post">
        {% csrf_token %}
        <p>姓名 <input type="text" name="user"></p>
        <p>密码 <input type="password" name="pwd"></p>
        <input type="submit">
    </form>

    如果用户主动退出,session会自动清除,如果没有退出就一直保留,记录数越来越大,要定时清理没用的session。

    • django中已经提供了这个方法,推荐把它加入到crontab中自动清理过期的session,防止session表记录过大,影响访问速度。
    django manage.py clearsessions

    二、分页

     1、view

    复制代码
    from django.shortcuts import render,HttpResponse
    
    # Create your views here.
    from app01.models import *
    from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
    
    def index(request):
    
        '''
        批量导入数据:
    
        Booklist=[]
        for i in range(100):
            Booklist.append(Book(title="book"+str(i),price=30+i*i))
        Book.objects.bulk_create(Booklist)
        '''
    
        '''
    分页器的使用:
    
        book_list=Book.objects.all()
    
        paginator = Paginator(book_list, 10)
    
        print("count:",paginator.count)           #数据总数
        print("num_pages",paginator.num_pages)    #总页数
        print("page_range",paginator.page_range)  #页码的列表
    
    
    
        page1=paginator.page(1) #第1页的page对象
        for i in page1:         #遍历第1页的所有数据对象
            print(i)
    
        print(page1.object_list) #第1页的所有数据
    
    
        page2=paginator.page(2)
    
        print(page2.has_next())            #是否有下一页
        print(page2.next_page_number())    #下一页的页码
        print(page2.has_previous())        #是否有上一页
        print(page2.previous_page_number()) #上一页的页码
    
    
    
        # 抛错
        #page=paginator.page(12)   # error:EmptyPage
    
        #page=paginator.page("z")   # error:PageNotAnInteger
    
        '''
    
    
        book_list=Book.objects.all()
    
        paginator = Paginator(book_list, 10)
        page = request.GET.get('page',1)
        currentPage=int(page)
    
    
        try:
            print(page)
            book_list = paginator.page(page)
        except PageNotAnInteger:
            book_list = paginator.page(1)
        except EmptyPage:
            book_list = paginator.page(paginator.num_pages)
    
    
        return render(request,"index.html",{"book_list":book_list,"paginator":paginator,"currentPage":currentPage})
    复制代码

    2、templates

    复制代码
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" 
        integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
    </head>
    <body>
    
    <div class="container">
    
        <h4>分页器</h4>
        <ul>
    
            {% 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="/index/?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="/index/?page={{ num }}">{{ num }}</a></li>
                         {% else %}
                           <li class="item"><a href="/index/?page={{ num }}">{{ num }}</a></li>
    
                         {% endif %}
                     {% endfor %}
    
    
    
                     {% if book_list.has_next %}
                        <li class="next"><a href="/index/?page={{ book_list.next_page_number }}">下一页</a></li>
                     {% else %}
                        <li class="next disabled"><a href="#">下一页</a></li>
                     {% endif %}
    
                </ul>
    </div>
    
    
    
    </body>
    </html>
    复制代码

    3、扩展

    复制代码
    def index(request):
    
    
        book_list=Book.objects.all()
    
        paginator = Paginator(book_list, 15)
        page = request.GET.get('page',1)
        currentPage=int(page)
    
        #  如果页数十分多时,换另外一种显示方式
        if paginator.num_pages>30:
    
            if currentPage-5<1:
                pageRange=range(1,11)
            elif currentPage+5>paginator.num_pages:
                pageRange=range(currentPage-5,paginator.num_pages+1)
    
            else:
                pageRange=range(currentPage-5,currentPage+5)
    
        else:
            pageRange=paginator.page_range
    
    
        try:
            print(page)
            book_list = paginator.page(page)
        except PageNotAnInteger:
            book_list = paginator.page(1)
        except EmptyPage:
            book_list = paginator.page(paginator.num_pages)
    
    
        return render(request,"index.html",locals())
    复制代码
  • 相关阅读:
    Linux命令:ls
    Log4j:log4j.properties 配置解析
    PostgreSQL: WITH Queries (Common Table Expressions)
    Linux使用SecureCRT上传下载
    PostgreSQL 自动输入密码
    Linux命令:rmdir
    Linux命令:mkdir
    Linux命令:pwd
    Linux命令:cd
    正则表达式 
  • 原文地址:https://www.cnblogs.com/52forjie/p/7825276.html
Copyright © 2011-2022 走看看