Django 使用session 进行登陆校验

1.添加中间件

 在创建项目的收默认已经添加

MIDDLEWARE_CLASSES = [
    'django.middleware.security.SecurityMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'adminManage.middleware.LoginIntercept'
]

 

2. 添加应用

  创建项目时已默认添加

  'django.contrib.sessions',
  
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    
]

 

3.添加序列化组件

  SESSION_SERIALIZER = 'django.contrib.sessions.serializers.PickleSerializer'

 

4.创建登陆账户对象

  /project_name/app_name/models.py

  

# -*- coding: utf-8 -*-
from django.db import models

class Account(models.Model):
    account_name = models.CharField(u'账号名', max_length=32)
    password = models.CharField(max_length=32)
    email = models.CharField(u'邮箱', max_length=32)
    create_time = models.DateField(u'创建时间', auto_now_add=True, editable=False)

    def __unicode__(self):
        return '%s %s %s' % (self.account_name, self.email, self.create_time)

  

5. 创建自定义中间件,用于拦截所有访问

  /project_name/app_name/middleware.py

# -*- coding: utf-8 -*-
from django.shortcuts import render, HttpResponseRedirect, HttpResponse, redirect


try:
    from django.utils.deprecation import MiddlewareMixin  # Django 1.10.x
except ImportError:
    MiddlewareMixin = object  # Django 1.4.x - Django 1.9.x


class LoginIntercept(MiddlewareMixin):
    def process_request(self, request):
        if request.path != '/login/' adn request.path != '/regist/':
            if request.session.get('account'):
                pass
            else:
                print "Intercept illegal access "
                return HttpResponseRedirect('/login/')

 

6.views

  创建登陆,登出方法,对session 注入和注销

  

# -*- coding: utf-8 -*-
from django.shortcuts import render
from django.http import HttpResponse, HttpResponseRedirect
from django import forms
from models import Account
import datetime



 # 登陆
def login(request):
    if request.method == 'POST':
        email = request.POST['email']
        password = request.POST['password']
        try:
            account = Account.objects.get(email=email, password=password)
            print '%s at %s login' % (account.account_name, datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
            response = HttpResponseRedirect('/index/')
            # response.set_cookie('account', account, 3600)
            request.session['account'] = account
            return response
        except Exception, e:
            print 'e.message:\t', e.message
            errorMessage = "用户名或密码错误"
            return render(request, 'adminManage/account/login.html', {'errorMessage': errorMessage})
    else:
        return render(request, 'adminManage/account/login.html')


# 退出
def logout(request):
    try:
        del request.session['account']
    except KeyError:
        pass
    return render(request, 'adminManage/account/login.html')

 

7.配置app的url 和 templates

 

8.测试验证

posted @ 2017-05-14 17:16  瓦肯船长  阅读(585)  评论(0)    收藏  举报