为什么使用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>