一.什么是session

session是保存在服务端的键值对,Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。

二.FVB中使用装饰器进行session验证

认证装饰器:

# 登陆验证
def auth(func):'''判断是否登录装饰器'''def inner(request, *args, **kwargs):ck = request.session.get("username")'''如果没有登陆返回到login.html'''if not ck:return redirect("/login.html")return func(request, *args, **kwargs)return inner

在需要认证的函数执行前加上装饰器认证即可,实际中应用如下:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,
互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def login(request):if request.method == "GET":return render(request, "login.html")else:username = request.POST.get("user")pwd = request.POST.get("pwd")pwd = md5(pwd)dic = {"flag":False}obj = User.objects.filter(username=username, pwd=pwd).first()if obj:request.session["username"] = usernamereturn redirect("/index.html")else:print(dic)return HttpResponse(json.dumps(dic))@auth
def index(request):user = request.session.get("username")business = Business.objects.all().values("name")host_list = Host.objects.all().values("id","host","port","business__name")username = User.objects.all().values("username")return render(request, 'index.html', {'host_list':host_list,"business":business,"user":user,"username":username})@auth
def addhost(request):business = Business.objects.all().values("name")if request.method == "POST":user = request.session.get("username")host = request.POST.get("host")port = request.POST.get("port")select_business = request.POST.get("business")business_id = Business.objects.filter(name=select_business).values("id")[0]host = Host.objects.create(host=host,port=port,business_id=business_id["id"])# host.business.add(*business)return render(request, "index.html")return render(request, "index.html", {"business":business})@auth
def up_business(request):if request.method == "POST":user = request.session.get("username")host= request.POST.get("host")port= request.POST.get("port")business_name = request.POST.get("business")username = request.POST.get("username")print(host,port,business_name,username)return render(request,"保存成功")

三.CBV中使用类继承的方式进行session认证

  • cbv是 class based view(基于类)
  • cbv基于dispatch进行反射,get获取,post提交
  • 应用场景:登录认证(继承dispatch,在dispatch里做session验证)
  • CBV第一种方式继承

1.单继承

扫盲:(继承的时候,一定要清楚self是哪个类实例化出来的对象,下例,self为B实例化的对象,任何属性优先从自己里面找,找不到在去父类里找)

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,
互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class A(object):def aaa(self):print('from A')def bbb(self):self.aaa()class B(A):def aaa(self):print('from B')c = B()
c.aaa()

应用:

from django.views import View
class BaseView(View):def dispatch(self, request, *args, **kwargs):  # 继承父类的dispatch,因为父类里有返回值,所以也要有returnif request.session.get('username'):response = super(BaseView, self).dispatch(request, *args, **kwargs)return responseelse:return redirect('/login.html')class IndexView(BaseView):def get(self, request, *args, **kwargs):return HttpResponse(request.session['username'])

2.多继承(继承顺序从左到右)

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,
互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class BaseView(object):def dispatch(self, request, *args, **kwargs):if request.session.get('username'):response = super(BaseView,self).dispatch(request, *args, **kwargs)return responseelse:return redirect('/login.html')class IndexView(BaseView,View):#先去找BaseView,BaseView中未定义在去找Viewdef get(self,request,*args,**kwargs):return HttpResponse(request.session['username'])

CBV第二种方式装饰器

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,
互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from django.utils.decorators import method_decoratordef auth(func): #定义装饰器def inner(request,*args,**kwargs):if request.session.get('username'):obj = func(request,*args,**kwargs)return objelse:return redirect('/login.html')return inner@method_decorator(auth,name='get')  #放在类顶部就需要method_decorator这个装饰器
class IndexView(View):@method_decorator(auth) #放在dispatch上就相当于全局都需要经过认证def dispatch(self, request, *args, **kwargs):if request.session.get('username'):response = super(IndexView,self).dispatch(request, *args, **kwargs)return responseelse:return redirect('/login.html')@method_decorator(auth)def get(self,request,*args,**kwargs):return HttpResponse(request.session['username'])@method_decorator(csrf_exempt)  # 无效 csrf 放到post函数上的装饰器,是无效的,需要放到dispath上或者类上def post(self,request,*args,**kwargs):return HttpResponse(request.session['username'])

四.中间件middleware

如下是django的生命周期

如下为中间件的执行顺序

中间件执行时机:请求到来,请求返回时

  • 中间件是一个类:
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,
互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''def process_request(self,request):print('m2.process_request')def process_response(self,request, response):print('m2.prcess_response')return response
  • 应用:

    • 请求日志
    • 用户登录认证

Django根目录新建md文件夹,新建Middleware.py文件

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 寻找有志同道合的小伙伴,
互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
from django.utils.deprecation import MiddlewareMixinclass M1(MiddlewareMixin):'''先执行request,然后到url路由,url之后返回到最上方,在执行view,如果出现错误就直接到response上,执行完,到真正到视图,如果有问题就执行exception,从下至上查找,如果找到exception就直接执行exception的return在走response返回用户每个中间件中,4个方法不需要都写.'''def process_request(self,request):if request.path_info == "/login.html":return Noneuser_info = request.session.get("username")if not user_info:return redirect("/login.html")

注:新的django版本可能不存在MiddlewareMixin,需要手动写一下这个类进行继承

class MiddlewareMixin(object):def __init__(self, get_response=None):self.get_response = get_responsesuper(MiddlewareMixin, self).__init__()def __call__(self, request):response = Noneif hasattr(self, 'process_request'):response = self.process_request(request)if not response:response = self.get_response(request)if hasattr(self, 'process_response'):response = self.process_response(request, response)return responseclass M1(MiddlewareMixin):def process_request(self,request):if request.path_info == "/login.html":return Noneuser_info = request.session.get("username")if not user_info:return redirect("/login.html")

settings里配置:

MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware','md.Middleware.M1',
]WSGI_APPLICATION = 'BBS.wsgi.application'SESSION_ENGINE = 'django.contrib.sessions.backends.db'  # 引擎(默认)SESSION_COOKIE_NAME = "sessionid"  # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
SESSION_COOKIE_PATH = "/"  # Session的cookie保存的路径(默认)
SESSION_COOKIE_DOMAIN = None  # Session的cookie保存的域名(默认)
SESSION_COOKIE_SECURE = False  # 是否Https传输cookie(默认)
SESSION_COOKIE_HTTPONLY = True  # 是否Session的cookie只支持http传输(默认)
SESSION_COOKIE_AGE = 1209600  # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = True  # 是否每次请求都保存Session,默认修改之后才保存(默认)

Django之session验证的三种姿势相关推荐

  1. asp.net session 介绍一三种Session存储方式

    asp.net session 介绍一三种Session存储方式 www.firnow.com 时间:2009-03-04 作者:匿名 编辑:sky 点击: 1478 [评论] 对于asp.net的程 ...

  2. django文件上传到服务器,django上传文件的三种方式

    Django文件上传需要考虑的重要事项 文件或图片一般通过表单进行.用户在前端点击文件上传,然后以POST方式将数据和文件提交到服务器.服务器在接收到POST请求后需要将其存储在服务器上的某个地方.D ...

  3. Django中Model继承的三种方式

    Django中Model继承的三种方式 Django中Model的继承有三种: 1.抽象继承 2.多表继承 3.proxy model(代理model) 1.抽象继承 第一种抽象继承,创建一个通用父类 ...

  4. Spring中部署Activiti流程定义的三种姿势

    摘要:本文对工作流Activiti框架中流程定义的部署进行了详细说明介绍. 本文分享自华为云社区<项目中工作流部署详细解析!Spring中部署Activiti流程定义的三种姿势>,作者:攻 ...

  5. 取出Cookie中的中文显示乱码解决方法。经验证第三种方法有效。

    取出Cookie中的中文显示乱码解决方法 HttpUtility.UrlEncode(Response.Cookies[ "newcookie "].Values);  HttpU ...

  6. Android三种姿势带你玩转360度全景图功能

    简介 大家好我是张鹏辉(道长)人如其名,我是天桥上算命的,转发这条博文,接下来一个月会有意想不到的惊喜发生.最近微博上的全景图火了,所以决定实现一下.工程里面图片资源来自网络,如有侵权请联系我,马上删 ...

  7. Android App 开发的三种姿势 ~

    点击上方"码农的后花园",选择"星标" 公众号 精选文章,第一时间送达 现在市场上各式各样的App越来越多,其实设计一个App也没有那么难,这期就讲解一下安卓开 ...

  8. django实现web分页的三种方法

    先看一下这三种方法的效果图 方案一,可以简单的完成上下页,当前页的显示 <div class="pagination"> <span class="st ...

  9. 解决no session问题的三种方式

    1.get() 采用立即加载方式,而 load() 采用延迟加载; 2.get() 方法执行的时候,会立即向数据库发出查询语句,而 load() 方法返回的是一个代理(此代理中只有一个 OID 属性) ...

最新文章

  1. 时间段为查询条件时的日期边界查询不到问题
  2. Boost:不受约束的集合bimap的测试程序
  3. iphone开蓝牙wifi上网慢_为啥我开锁总是比别人慢?
  4. html如何与php,html页面怎么跟php文件连接
  5. python math.asin
  6. python julia go_挑战Python的四个语言:Swift、Go、Julia、R
  7. 算法移植优化(三)android dlib 人脸检测使用
  8. 7-13 日K蜡烛图
  9. 技术 产品 团队(上):如何成为超级个体
  10. 2015年01月30日 - Git五分钟教程
  11. 国内做得好的进销存软件有哪些啊?
  12. 电销机器人源码+图文介绍
  13. 小型局域网环境下搭建的文件中转系统
  14. September 2006
  15. python自动登录qq邮箱_python和selenium实现163邮箱自动登陆
  16. 【Unity3D】资源文件 ③ ( Unity 资源包简介 | 导出 Unity 资源包 | 导出资源包的包含依赖选项 | 导入 Unity 资源包 | Unity 资源商店 )
  17. java 篮球队淘汰赛冠军_《黑白2》口袋世界淘汰赛挑战各馆主冠军方法
  18. 使用CSS写正方体,结合JS实现3D轮播图
  19. 橙瓜码字多端同步、十份云储存本地实时备份,最放心的码字软件
  20. 直击进博会 | 霍尼韦尔、飞利浦、西门子医疗、阿斯利康、赛诺菲、默沙东、蔡司等持续看好中国市场...

热门文章

  1. javascript:闭包的总结
  2. android volley http请求框架
  3. 有关域名方面的相关问题
  4. 记事本 换行符_30年后终更新!新一代Win10记事本详细体验
  5. 【学习笔记】生产订单实际价格差异计算
  6. 【转】SAP的标准委外采购中都有哪些坑
  7. 【MM模块】Invoice with Variances 差异
  8. MR8M CANCEL INVOICE后为什么要手工去FI清帐
  9. 新会计科目的编号及内容
  10. SAP Smartforms 条码打印