基于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. 初识Xml。

    /* * 一.Xml? * * 1.是什么? * Extensible markup Language 可拓展标记性语言 * 功能是 储存数据 * 1.配置文件 * 2.在网络中传输数据 * xml和 ...

  2. 三、Docker网络

    一.查看8001端口是否开启处监听状态 netstat -apnl | grep 8001 二.使用brctl show可以看到虚拟机的网络关系 brctl show docker每新建一个conta ...

  3. LOADING Redis is loading the dataset in memory Redis javaAPI实例

    今天在实现Redis客户端API操作Jedis的八种调用方式详解中,遇到了LOADING Redis is loading the dataset in memory错误,经过多番查找资料,找到了解决 ...

  4. Lodop导出图片和打印机无关,测试是否有关

    Lodop导出的图片,既可以在预览界面另存为,也可以用语句导出.语句导出,可查看本博客的相关博文:Lodop导出图片,导出单页内容的图片 预览的时候,由于选择的打印机不同,而真实的打印机可能有不同的可 ...

  5. 本科理工男如何学习Linux

    我是一个本科学电子的理工男,但是一直对计算机感兴趣,所以平时自己在课下喜欢学一些与计算机有关的东西.由于对计算机感兴趣,所以后来我参加了学校的计算机社团,在那里接受一些培训和指导.当时在社团里看到师兄 ...

  6. Qt 获取屏幕信息

    void GetScreenInfo() { QDesktopWidget* desktopWidget = QApplication::desktop(); //获取可用桌面大小 QRect des ...

  7. Windows服务一直“正在启动”怎么杀

    转载:https://blog.csdn.net/huanglong8/article/details/71156848 PS:cmd 记得使用 管理员身份运行 这里需要通过控制台 命令行来查询PID ...

  8. 个人整理的数组splay板子,指针的写的太丑了就不放了。。

    splay的板子.. 由于被LCT榨干了..所以昨天去学了数组版的splay,现在整理一下板子.. 以BZOJ3224和3223为例题..暂时只有这些,序列的话等有时间把维修序列给弄上来!! BZOJ ...

  9. CODEFORCES掉RATING记 #2

    比赛:Codeforces Round #425 (Div. 2) 时间:2017.7.25晚 先orz zjt rank4 一场加300rating A:傻题,判断\(\lfloor\frac{n} ...

  10. bzoj 1103 : [POI2007]大都市meg (树链剖分+线段树)

    Description 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了.不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n ...