基于django的自定义简单session功能
基于django的自定义简单session功能
简单思路:
1.建立自定义session数据库
2.登入时将用户名和密码存入session库
3.将自定义的随机session_id写入cookie中
4.在中间件中,取出浏览器请求中cookie的session_id
5.使用session_id去数据库中比对用户名和密码,成功就访问,失败就重定向到登入页面
没有完善的地方:每次登入都会 生成一个随机字符串和value存入数据库
1.数据库
from django.db import models # Create your models here. class Session(models.Model): id=models.AutoField(primary_key=True) session_id=models.CharField(max_length=32) session_value=models.CharField(max_length=64)
2.视图函数
from django.shortcuts import render,HttpResponse import random,json # Create your views here. #导入自定义session中间件类 from app01 import models def set_session(): res = '' for i in range(4): num = str(random.randint(1, 9)) letter = chr(random.randint(65, 90)) group = random.choice([num, letter]) res += group return res def login(request): if request.method=='GET': return render(request,'login.html') else: name=request.POST.get('name') pwd=request.POST.get('password') if name=='maple' and pwd=='123': #用户名和密码通过验证后,登入状态保存到自定义session中 obj=HttpResponse('登入成功') # 生成自定义session的随机key my_session_id=set_session() # 生成自定义session的value value={'name':name,'password':pwd} value=json.dumps(value) # 将自定义session信息存入数据库session_id对应key,session_value对应value models.Session.objects.create(session_id=my_session_id,session_value=value) # 将自定义session数据写入cookie发送到浏览器 obj.set_cookie("my_session_id",my_session_id) return obj else: return HttpResponse("用户名或密码错误") # 主页 def index(request): return render(request,'index.html')
3.中间件
from django.utils.deprecation import MiddlewareMixin from app01 import models from django.shortcuts import redirect import json class SessionMiddle(MiddlewareMixin): def process_request(self,request): # 判断如果是登入页面就直接返回 if request.path=="/login/": return None else: # 从cookies中取出my_session_id,然后从数据中取出数据进行比对 my_session_id=request.COOKIES.get("my_session_id") obj=models.Session.objects.filter(session_id=my_session_id).first() # 数据库中没有该session_id就重定向到login页面 if obj: print(obj.session_value) session_value=json.loads(obj.session_value) # 判读用户名密码比对成功就登入主页,不成功就重定向到login页面 if session_value.get('name')=='maple'and session_value.get('password')=='123': return None else: return redirect('/login/') else: return redirect('/login/')
4.url
from django.conf.urls import url from django.contrib import admin from app01 import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^login/', views.login), url(r'^index/', views.index), ]
5.登入html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登入</title> </head> <body> <form action=""method="post"> 用户名:<input type="text" name="name"> 密码:<input type="password" name="password"> <input type="submit" value="提交"> </form> </body> </html>
6.主页html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>主页</title> </head> <body> <h1>我是主页</h1> </body> </html>