基于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>

 

posted @ 2019-01-26 19:50  Maple_feng  阅读(983)  评论(0编辑  收藏  举报