基于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=='':
#用户名和密码通过验证后,登入状态保存到自定义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')=='':
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>

基于django的自定义简单session功能的更多相关文章

  1. 【webSokect】基于django Channels的简单实现

    # settings.py: INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.con ...

  2. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

  3. Django之Cookie、Session和自定义分页

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  4. 基于Django进行简单的微信开发

    代码地址如下:http://www.demodashi.com/demo/11756.html 一.微信公众号的准备: 1. 注册 访问地址:https://mp.weixin.qq.com/ 按照提 ...

  5. csrf跨站请求伪造、csrf相关装饰器、auth认证模块、基于django中间件设计项目功能

    目录 csrf跨站请求网站 什么是csrf跨站请求网站 经典例子-钓鱼网站 模拟 如何避免这种现象(预防) 如何在django中解决这个问题 form表单 ajax csrf相关装饰器 FBV CBV ...

  6. 基于PHP实现一个简单的在线聊天功能(轮询ajax )

    基于PHP实现一个简单的在线聊天功能(轮询ajax ) 一.总结 1.用的轮询ajax 二.基于PHP实现一个简单的在线聊天功能 一直很想试着做一做这个有意思的功能,感觉复杂的不是数据交互和表结构,麻 ...

  7. Django 中自定义用户模型及集成认证授权功能总结

    1. 概述 Django 中的 django.contrib.auth 应用提供了完整的用户及认证授权功能. Django 官方推荐基于内置 User 数据模型创建新的自定义用户模型,方便添加 bir ...

  8. 基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍。最后我们将会实现一个基于Server-Sent Event和Flask简单的在线聊天室。

    基于Server-Sent Event的简单聊天室 Web 2.0时代,即时通信已经成为必不可少的网站功能,那实现Web即时通信的机制有哪些呢?在这门项目课中我们将一一介绍.最后我们将会实现一个基于S ...

  9. Django(5) session登录注销、csrf及中间件自定义、django Form表单验证(非常好用)

    一.Django中默认支持Session,其内部提供了5种类型的Session供开发者使用: 数据库(默认) 缓存 文件 缓存+数据库 加密cookie 1.数据库Session 1 2 3 4 5 ...

随机推荐

  1. asyncio并发编程

    一. 事件循环 1.注: 实现搭配:事件循环+回调(驱动生成器[协程])+epoll(IO多路复用),asyncio是Python用于解决异步编程的一整套解决方案: 基于asynico:tornado ...

  2. Python对elasticsearch的CRUD

    一.官网提供的Elasticsearch的Python接口包 1.github地址:https://github.com/elastic/elasticsearch-dsl-py 2.安装:pip i ...

  3. 使用Guava cache构建本地缓存

    前言 最近在一个项目中需要用到本地缓存,在网上调研后,发现谷歌的Guva提供的cache模块非常的不错.简单易上手的api:灵活强大的功能,再加上谷歌这块金字招牌,让我毫不犹豫的选择了它.仅以此博客记 ...

  4. @Autowired 与@Resource的区别(详细)

    参考:@Autowired 与@Resource的区别(详细) spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@Pos ...

  5. python数据结构与算法第九天【选择排序】

    1.选择排序的原理 2.代码实现 def selection_sort(alist): n = len(alist) # 需要进行n-1次选择操作 for i in range(n-1): # 记录最 ...

  6. mysql分页查询按某类型置顶 按某类型置尾 再按优先级排序

    近段时间接到一个新需求: 第一优先级:未满的标的顺位高于已满标的顺位.第二优先级:新手标的顺位高于其他标的的顺位. 第三优先级:标的剩余可投金额少的顺位高于标的剩余可投金额多的. 我是直接通过sql语 ...

  7. 搭建Hexo博客(三)—换电脑继续写Hexo博客

    Hexo和GitHub搭建博客的原理是:Hexo将source下的md文件生成静态的html页面,存放到public目录中,这一步是由命令:hexo -g完成.接下来执行hexo -d命令,就将pub ...

  8. python数学库math模块

    函数 数学表示 含义 .pi 圆周率π π的近似值,15位小数 .e 自然常数 e e的近似值,15位小数 ceil(x) [x] 对浮点数向上取整 floor(x) [x] 对浮点数向下取整 pow ...

  9. HDU1506 Largest Rectangle in a Histogram(算竞进阶习题)

    单调栈裸题 如果矩形高度从左到右是依次递增,那我们枚举每个矩形高度,宽度拉到最优,计算最大面积即可 当有某个矩形比前一个矩形要矮的时候,这块面积的高度就不能大于他本身,所以之前的所有高于他的矩形多出来 ...

  10. [HAOI2007] 修筑绿化带

    类型:单调队列 传送门:>Here< 题意:给出一个$M*N$的矩阵,每一个代表这一格土地的肥沃程度.现在要求修建一个$C*D$的矩形花坛,矩形绿化带的面积为$A*B$,要求花坛被包裹在绿 ...