Cookie、Session和分頁
阿新 • • 發佈:2018-11-09
為什麼使用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>