基于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. 记一次生产mysql数据误操作恢复过程

    提示:建议每次对数据库进行修改时都做下备份 注意:以下Mysql开启的是row格式的binlog日志,确定到误操作具体时间可能有些麻烦,默认的格式就能很快找出来.这里开启row的原因是还有一种更快的方 ...

  2. Python 第三方库 cp27、cp35 等文件名的含义(转)

    转自 https://blog.csdn.net/lanchunhui/article/details/62417519 转自 https://stackoverflow.com/questions/ ...

  3. LODOP打印css样式rgba显示黑色区块

    当LODOP打印html超文本出现问题的时候,要删减排查一下样式,查看Lodop传入的内部的html超文本和样式,可查看本博客另一篇博文:删减发现有问题的样式,并解决该问题,尽量使用通用的css样式, ...

  4. Android SDK Mirror

    Android SDK Manager - Tools - Option - Proxy Settings - HTTP Proxy Server mirrors.zzu.edu.cn Force H ...

  5. java split(regex,limit) 使用记录

    1.split(“,”,0):是切割默认模式等同于split(",")结尾符合分割字符为空不进行进行分割,如图: 2.split(",",-1):limit参数 ...

  6. 学习 Spring (十三) AOP 配置

    Spring入门篇 学习笔记 Spring 所有的切面和通知器都必须放在一个 内(可以配置包含多个 元素),每一个 可以包含 pointcut, advisor 和 aspect 元素(它们必须按照这 ...

  7. Running Web API using Docker and Kubernetes

    Context As companies are continuously seeking ways to become more Agile and embracing DevOps culture ...

  8. Nginx 优化缓冲区与传输效率

    L:126 这里简单的做个计算 比如 我的服务器带宽是 5M=41943040字节 如果按照公网用PIND的得到延迟结果 icmp_seq=3 ttl=49 time=35.612 ms BDP =  ...

  9. C语言实现字符串逆序输出

    方法一: #include <stdio.h> #include <stdlib.h> #include <string.h> void Reverse(char ...

  10. P1578 奶牛浴场

    P1578 奶牛浴场 题目描述 由于John建造了牛场围栏,激起了奶牛的愤怒,奶牛的产奶量急剧减少.为了讨好奶牛,John决定在牛场中建造一个大型浴场.但是John的奶牛有一个奇怪的习惯,每头奶牛都必 ...