前言
在学习的路上就像我在山上修炼了10 年 重出江湖却发现江湖不见了......学会了装饰器却被cookie和seesion 学会了session 却又遇见了中间件 学了中间件就是简单暴力.
cookie
就是我们在发出post请求是会带上cookie值 就是一个字典的 因此我们可以设置一个cookie值来判断函数执行的方向 相当于一个函数中的装饰器
我们来拿登录举例
def login(request): if request.methor == 'GET': return render(request,'login.html') else: username=request.POST.get('username') password = request.POST.get('password') if username='胡斌' and password = 'superdsb': return redirect('index') else: return redirect('login') 就是在登录主页的时候是需要登录的,原来最陋的办法就是写一个装饰器,现在就不需要了就用上了cookie def login(request): if request.methor == 'GET': return render(request,'login.html') else: username=request.POST.get('username') password = request.POST.get('password') if username='胡斌' and password = 'superdsb': ret = redirect('index') ret.set_cookie('is_login','True') #'设置cookie' return ret else: return redirect('login') def index(request): is_login= request.COOKIES.get('is_login') "获取cookie" if is_login == 'True': return render(request,'index.html') else: return redirect('login')
总结
获取cookie:request.COOKIES.get('xx') is_login= request.COOKIES.get('is_login') 设置cookie: ret = redirect('index') ret.set_cookie('is_login','True') ret.set_cookie('xx','oo') '第二个' 删除cookie: ret.delete_cookie('xx') ret.set_cookie('is_login','True',max_age=5,expires=datatime.datatime.now()+datetime.timedelta.(days=7))'超时时间5秒''就是7天后失效'
参数: default: 默认值 salt: 加密盐 max_age: 后台控制过期时间 参数: key, 键 value='', 值 max_age=None, 超时时间 expires=None, 超时时间(IE requires expires, so set it if hasn't been already.) path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问 domain=None, Cookie生效的域名 secure=False, https传输 httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖) Ctrl + Shift + del三个键来清除页面缓存和cookie,将来这个操作你会用的很多
session
借助于cookie 加密传输 不限长度
def login(request): if request.methor == 'GET': return render(request,'login.html') else: username=request.POST.get('username') password = request.POST.get('password') if username='胡斌' and password = 'superdsb': ''' 1.生成随机字符串 2.放到cookie中进行传输 3.将随机字符串和对应数据保存到自己服务端的数据库中 ''' request.session['islogin']=True return redirect('index') else: return redirect('login') def index(request): ''' 1.取出cookie中session随机字符串{'sessionid'} xx=request.COOKIES.get('sessionid') 2.到数据库中查询数据库中查询这个sessionid对应的那条记录 data=select session_data from django_session where session_key='xx' 3.拿出记录中的session_data数据部分进行解密 dic=sss(data)--{'is_login':True} dic.get('is_login')--True ''' is_login=request.session.get('is_login') if is_login == True: 不用往网络上传播,所以不需要字符串 return render(request,'index.html') else: return redirect('login')
总结
一个浏览器对应一个服务端 是一个浏览器 而不是一台电脑 设置: request.session['islogin']=True 1.生成随机字符串 2.放到cookie中进行传输 3.将随机字符串和对应数据保存到自己服务端的数据库中 获取: 1.取出cookie中session随机字符串{'sessionid'} xx=request.COOKIES.get('sessionid') 2.到数据库中查询数据库中查询这个sessionid对应的那条记录 data=select session_data from django_session where session_key='xx' 3.拿出记录中的session_data数据部分进行解密
装饰器
def func(f): def foo(request,*args,**kwargs): s_login=request.session.get('is_login') if is_login == True: 不用往网络上传播,所以不需要字符串 ret=f(request,*args,**kwargs) return ret else: return redirect('login') ret=f(request,*args,**kwargs) return foo @func def index(request): return render(request,'index.html')
退出
def logout(request): request.session.flush() ''' 1,删除cookie中的键值对 2.删除了数据库中的这条记录 ''' return redirect('login')
session的作用(权限)
安全一些 没有大小限制 可以配置多个储存方案,可以配置到缓存中
cookie的作用
保持会话,使用户不需要反复的去登陆 有大小限制 有个数限制 cookie大小上线是4kb
中间件
自定义中间件
第一步.在应用下也就是app01下创建一个文件夹,名字随便,比如mymiddlew,在这个文件下创建一个py文件,名字随便,比如叫做:yanzheng.py 第二步,在yanzheng.py文件中定义类,写法如下 from django.shortcuts import redirect,HttpResponse,render from django.utils.deprecation import MiddlewareMixin #引入django这个类 class Auth(MidlewareMixin):#继承这个类 #白名单 认证白名单 就是在这个白名单列表中的函数在项目运行的时候就不会经过中间件的校验 white_list=['/login/','/regeser/'] #就是登陆和注册就不用经过中间件的校验 def process_request(self,request): #相对请求进行统一的处理,那么久定义一个process_request方法 #如果对方返回的是None,那就通过了这个方法的认证或者处理,如果返回的值是HttpResponse对象,那么请求到这里结束了,直接返回了浏览器 if request.path in self.while_list: pass else: return HttpResponse('请登录') #或者 return redicret('/login/') 第三步,settings 配置文件中写上这个类的路经 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ################## 'app01.mymiddleware.yanzheng.Auth', (就是在这里加上自己的中间件) () ]
实战图书馆管理系统
from django.shortcuts import render,redirect,HttpResponse from app01 import models # Create your views here. def author_list(request): all_author=models.Author.objects.all() return render(request, 'author_list.html', {'all_author': all_author}) def author_add(request): if request.method=='GET': all_book = models.Book.objects.all() return render(request,'author_add.html',{'all_book':all_book}) else: name=request.POST.get('name') aid=request.POST.get('aid') book_obj = models.Book.objects.get(id=aid) author_obj=models.Author.objects.create(name=name) book_obj.authors.add(author_obj) #正向添加(因为多对多的外键在book表里)就是:book对象.外键.add(另外一张表的对象) return redirect('/author_list/') def author_edit(request): if request.method=='GET': pk=request.GET.get('id') all_author=models.Author.objects.filter(pk=pk).first() all_book = models.Book.objects.all() return render(request,'author_edit.html',{'all_author':all_author,'all_book':all_book}) else: name = request.POST.get('name') aid = request.POST.get('aid') pk = request.GET.get('id') book_obj = models.Book.objects.get(id=aid) author_obj = models.Author.objects.filter(pk=pk) author_obj.update(name=name) book_obj.authors.set([pk,]) # 正向添加(因为多对多的外键在book表里)就是:book对象.外键.add(另外一张表的对象) return redirect('/author_list/') def author_del(request): if request.method == 'GET': pk = request.GET.get('id') models.Author.objects.filter(pk=pk).delete() return redirect('/author_list/') def AuthorDetail_list(request): if request.method=='GET': all_AuthorDetail = models.AuthorDetail.objects.all() return render(request, 'AuthorDetail_list.html', {'all_AuthorDetail': all_AuthorDetail}) def AuthorDetail_add(request): if request.method=='GET': all_AuthorDetail = models.AuthorDetail.objects.all() return render(request, 'AuthorDetail_add.html', {'all_AuthorDetail': all_AuthorDetail}) else: name=request.POST.get('name') addr=request.POST.get('addr') num=request.POST.get('num') birthday=request.POST.get('birthday') models.Author.objects.create(name=name) #为啥加不进去 au_obj=models.AuthorDetail.objects.create( addr=addr, num=num, birthday=birthday, authors=models.Author.objects.filter(name=name) ) au_obj.save() return redirect('/AuthorDetail_list/') def AuthorDetail_del(request): pk=request.GET.get('pk') AuthorDetail_all=models.AuthorDetail.objects.filter(pk=pk) AuthorDetail_all.delete() return redirect('/AuthorDetail_list/') def AuthorDetail_edil(request): pk = request.GET.get('pk') AuthorDetail_all = models.AuthorDetail.objects.filter(pk=pk) return render(request, 'AuthorDetail_edil.html', {'AuthorDetail_all': AuthorDetail_all}) def Publisher_list(request): Publisher_all=models.Publisher.objects.all() return render(request,'Publisher_list.html',{'Publisher_all':Publisher_all}) def Publisher_add(request): if request.method=='GET': publish_all=models.Publisher.objects.all() else: name=request.POST.get('name') addr=request.POST.get('addr') models.Publisher.objects.create(name=name,addr=addr) return redirect('/Publisher_list/') return render(request,'Publisher_add.html',{'publish_all':publish_all}) def Publisher_edil(request): if request.method == 'GET': pk=request.GET.get('pk') Publisher_all = models.Publisher.objects.filter(pk=pk) else: name = request.POST.get('name') addr = request.POST.get('addr') pub_obj=models.Publisher.objects.update(name=name, addr=addr) pub_obj.save() #为什么不更新 只是增加 return redirect('/Publisher_list/') return render(request, 'Publisher_edil.html', {'Publisher_all': Publisher_all}) def book_list(request): if request.method == 'GET': book_all = models.Book.objects.all() return render(request, 'book_list.html', {'book_all': book_all}) def book_del(request): models.Book.objects.all().delete() return render(request, 'book_list.html') def book_add(request): if request.method =='GET': publish_all = models.Publisher.objects.all() # print(publish_all.name) return render(request, 'book_add.html', {'publish_all':publish_all}) else: title = request.POST.get('title') price = request.POST.get('price') pubtime = request.POST.get('pubtime') bid = request.POST.get('bid') #获得select标签所获得的ID book_obj = models.Book.objects.create( title=title, price=price, pubtime=pubtime, publishers_id=bid ) book_obj.save() return redirect('/book_list/') def book_edit(request): pk = request.GET.get('id') book_all = models.Book.objects.filter(pk=pk).first() publish_all = models.Publisher.objects.all() if request.method == 'POST': title = request.POST.get('title') price = request.POST.get('price') pubtime = request.POST.get('pubtime') bid = request.POST.get('bid') # 获得select标签所获得的ID book_all.title = title, book_all.price = price, book_all.pubtime = pubtime, book_all.publishers_id = bid book_all.save() return redirect('/book_list/') all_pub = models.Publisher.objects.all() return render(request, 'book_edit.html', locals())