1. 程式人生 > >Cookie、Session和分頁

Cookie、Session和分頁

為什麼使用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>