Python 系列(24) django 装饰器 session

Posted on Posted in python

monitor/models.py

  1. from django.db import models  
  2.   
  3. # Create your models here.  
  4.   
  5. class UserInfo(models.Model):  
  6.     username = models.CharField(max_length=120,verbose_name='用户名')  
  7.     password = models.CharField(max_length=120,verbose_name='密码')  
  8.     phone = models.BigIntegerField(verbose_name='手机号')  
  9.     email = models.EmailField(verbose_name='邮箱')  
  10.   
  11.     def __str__(self):  
  12.         return '<%s>'%self.username  

monitor/admin.py

  1. admin.site.register(models.UserInfo)  

生成数据库

  1. python manage.py makemigrations monitor  
  2. python manage.py migrate monitor  

monitor/views.py

  1. from django.shortcuts import render,redirect,HttpResponse  
  2. from . import models  
  3. import hashlib  
  4.   
  5. # Create your views here.  
  6.   
  7. def hash_passwd(password):                       #用于做密码hash加密的  
  8.     hash_md5 = hashlib.md5()                     #以md5的方式生成  
  9.     hash_md5.update(password.encode('utf-8'))   #需要我们hash加密的内容  
  10.     passwd = hash_md5.hexdigest()                #生成我们的hash结果  
  11.     return passwd                               #返回我们的hash加密过的密码  
  12.   
  13.   
  14. def valid_login(func):                           #装饰器,用于做我们等于验证的  
  15.     def inner(request,*args,**kwargs):  
  16.         try:  
  17.             request.session['username']         #如果取不到我们设置session中username,会有一个大黄页的keyerror出现  
  18.         except Exception as e:                  #如果出现异常,说明我们的用户不是合法的,并没有设置我们的session信息  
  19.             return HttpResponse('<h1>Please login...')  #返回让用户去登录  
  20.         else:  
  21.             session_user = request.session['username']  #如果能从我们的session中取到username,说明我们是通过页面合法登陆的  
  22.             if models.UserInfo.objects.filter(username=session_user):   #取数据库再次对比我们的用户名  
  23.                 return func(request)                    #返回我们的要装饰的函数  
  24.             else:  
  25.                 return render(request,'error.html')     #加的话,说明session中的username是假的数据,我们数据库中并不存在  
  26.     return inner  
  27.   
  28. @valid_login  
  29. def index(request):        #等同于valid_login(index)  
  30.     session_user = request.session['username']          #获取到我们的session中的username用户显示在登录那里  
  31.     print('session username:',request.session['username'])  
  32.     return render(request,'monitor_index.html',{'username':session_user})   #把登录用户渲染到前端  
  33.   
  34.   
  35. @valid_login  
  36. def register(request):  
  37.     if request.method == 'POST':  
  38.         username = request.POST.get('inputUsername')  
  39.         password = request.POST.get('inputPasswordAgain')  
  40.         email = request.POST.get('inputEmail')  
  41.         phoneNum =request.POST.get('inputMobileNum')  
  42.         code = request.POST.get('inputMoblieAuthCode')  
  43.         print('username:%s password:%s email:%s phone number:%s code:%s '%(username,password,email,phoneNum,code))  
  44.         if models.UserInfo.objects.filter(username=username):           #获取我们提交的注册用户名,如果能从数据中取到,说明此用户已存在  
  45.             return HttpResponse('<h2 style="color:red">用户已存在,请尝试其他用户名')  
  46.         else:  
  47.             passwd = hash_passwd(password)                              #新用户把我们的密码做hash加密  
  48.             models.UserInfo.objects.create(username=username, password=passwd,email=email,phone=phoneNum)   #存到后台的数据库中  
  49.         html = '<h2>register successful..<br>'  
  50.         return HttpResponse('<h2 style="color:green">user:%s'%username+html)  
  51.     return render(request, 'monitor_register.html')  
  52.   
  53.   
  54. def login(request):                                         #用户我们的登录  
  55.     if request.method == 'POST' and request.POST:  
  56.         username = request.POST.get('username')  
  57.         password = request.POST.get('password')  
  58.         passwd = hash_passwd(password)                     #获取我们的前端的password并hash加密  
  59.         #print('passwd hash...:',passwd)  
  60.         if models.UserInfo.objects.filter(username=username,password=passwd):   #去数据库中做对比,如果取出来的不为空,说明我们的用户是合法的登录  
  61.             request.session['username'] = username  
  62.             return  redirect('/monitor/index')           #跳转到我们的路由条目的中/monitor/index中  
  63.         else:  
  64.             error = 'username or password error ,please retry'  
  65.             request.session['username'] = None  
  66.             del request.session  
  67.             #return  HttpResponse('<h1>username or password error,please retry...')  
  68.             return render(request,'login.html',{'error':error})  
  69.     return render(request,'login.html')  

mydjango/settings.py

  1. SESSION_EXPIRE_AT_BROWSER_CLOSE = True # 关闭浏览器,session失效  
  2. SESSION_COOKEI_AGE = 60*5 # session 有效期  

Leave a Reply

Your email address will not be published. Required fields are marked *

19 − 7 =