一.配置文件 settngs.py中
# 使用django认知系统的登录状态装饰器时,没有登录的话,跳往登录页面后路径是/acount/login 需要重新指定 LOGIN_URL = ‘/user/login‘ # 设置允许保存session SESSION_SAVE_EVERY_REQUEST = True # 设置session存放在缓存中 SESSION_ENGINE = ‘django.contrib.sessions.backends.cache‘ # 使用默认选项的缓存设置存放session SESSION_CACHE_ALIAS = "default" # 设置session过期时间,关闭浏览器时session过期(cookies) 和设置固定时间后过期 只能二选一 SESSION_EXPIRE_AT_BROWSER_CLOSE = True # 30分钟后session过期, 只能和关闭时浏览器失效 二选一 # SESSION_COOKIE_AGE=5*60
二.创建一个base_model.py
from django.db import models # 创建所有的模型的基类 class BaseModel(models.Model): """抽象模型基类""" create_time = models.DateTimeField(auto_now_add=True, verbose_name=‘创建时间‘) update_time = models.DateTimeField(auto_now_add=True, verbose_name=‘更新时间‘) is_delete = models.BooleanField(default=False, verbose_name=‘是否删除‘) class Meta: # 指定这个类是一个抽象模型类 abstract = True
三.用户模型models.py中
from django.db import models # 导入django默认的认证系统包,使用认证系统自带的模型创建用户相关字段 from django.contrib.auth.models import AbstractUser # 该包下有个模块的名字和这个很相似becareful # 导入抽象模型基类 from db.base_model import BaseModel # 使用django默认的认证系统的类去创建模型 class User(AbstractUser, BaseModel): """用户模型类""" # 指定数据表的名字,以及后台管理系统显示字段的名字 class Meta: # 指定数据表的名字 db_table = ‘df_user‘ # 指定后台管理系统显示字段的名字 verbose_name = ‘用户‘ # 让设置的后台管理系统的名字和设置的一致 verbose_name_plural = verbose_name
四.视图文件views.py中
from django.shortcuts import render, redirect # 返回应答,反解析 from django.core.urlresolvers import reverse # 用来进行反解析操作 from django.core.mail import send_mail # 使用这个模块进行发送邮件操作 from django.http import HttpResponse from django.views.generic import View # 导入通用类视图 后面的View v大写 from django.conf import settings from django.contrib.auth import authenticate, login, logout # 通过导入django认证系统的这三个模块,进行用户身份确认,登录,登出操作 from django.core.paginator import Paginator # 导入正则 import re # 因为在setting.py 中导入的默认搜寻路径,所以虽然报错,但是可以导入. 如果修改,无法访问,为什么. from user.models import User, Address from goods.models import GoodsSKU from order.models import OrderInfo,OrderGoods # 导入itsdangerous包里的方法,进行数据签名 from itsdangerous import TimedJSONWebSignatureSerializer as make_sign # 用来捕捉激活连接的签名是否过期 from itsdangerous import SignatureExpired # 导入发送激活邮件的模块celery from celery_tasks.tasks import send_register_active_email # 导入redis相关模块,和redis数据库进行交互 from redis import StrictRedis # 导入自定的装饰器类 from utils.mixin import LoginRequiredView, LoginRequiredViewMixin # django框架会给request对象增加一个属性user # 如果用户已经登录,user是认证系统用户模型类(User)的实例对象 # 如果用户没有登录,user是AnonymousUser类的实例对象 # 在模板文件中可以直接使用request的user属性 class LoginView(View): """登录""" def get(self, request): """显示登录页面""" # 获取在请求过程中传递回来的cookie if ‘username‘ in request.COOKIES: username = request.COOKIES[‘username‘] # 如果用户在请求登录页面时发送了带有username的cookie,说明用户选择记住了用户名,应该将相应的html标签改为checked checked = ‘checked‘ else: # 没有发送用户名过来,将两个空字符串传递回去 username = ‘‘ checked = ‘‘ return render(request, ‘login.html‘, {‘username‘:username, ‘checked‘: checked}) def post(self, request): """提交登录信息""" # 获取参数 username = request.POST.get(‘username‘) password = request.POST.get(‘pwd‘) remember = request.POST.get(‘remember‘) # 参数校验 if not all([username, password]): return render(request, ‘login.html‘, {‘errmsg‘: ‘请填写用户名和密码‘}) # 业务处理 # 根据用户名和密码查找用户信息,使用django认证系统的authenticate(username=username, password=password) # 方法,判断用户是否存在 user = authenticate(username=username, password=password) # 进行判断 if user is not None: # 进行判断账户是否已经激活 if user.is_active: # 用户已激活, 允许登录,使用login()方法,记录登录状态,这是django自带的认证系统的一个方法,会自己创建session,参数必须传入 # 如果自己自己创建session request.session[键]=值, request.session.set_expiry(value) # 如果value是一个整数,会话将在value秒没有活动后过期。 # 如果value为0,那么用户会话的Cookie将在用户的浏览器关闭时过期。 # 如果value为None,那么会话永不过期。 # 如果没有指定过期时间则两个星期后过期。 login(request, user) # 获取登录后要跳转到的next地址, 默认跳转到首页 /user/login?next=参数 next_url = request.GET.get(‘next‘, reverse(‘goods:index‘)) # print(next_url) # 跳转到next_url网址 # redirect()是HttpResponseRedirect的方法, HttpResponseRedirect是HttpResponse的子类, 最终返回的是一个response对象 # 在提交表单的模板html form表单中,不设置action,就会使用地址栏的地址进行提交,这样才能将参数传递过来 response = redirect(next_url) # 判断是否需要记住用户名 if remember=="on": # 设置一个cookie信息,来保存用户的用户名 # 设置cookie需要调用set_cookie方式,set_cookie它是HttpResponse对象的方法 # HttpResponseRedirect是HttpResponse的子类 response.set_cookie(‘username‘, username, max_age=7*24*3600) else: # 否则删除cookie,取消记住用户名 response.delete_cookie(‘username‘) # 返回应答 return response else: # 用户未激活 return render(request, ‘login.html‘, {‘errmsg‘:‘用户名未激活,请先激活‘}) else: # 用户名或密码错误 return render(request, ‘login.html‘, {‘errmsg‘: "用户名与密码不匹配"}) # 登出账号 /user/logout class LogoutView(View): """退出登录""" def get(self, request): # django自带的认证系统功能,能登出账号 logout(request) # 返回应答,转到首页 return redirect(reverse(‘goods:index‘))
原文地址:https://www.cnblogs.com/lowmanisbusy/p/9196810.html
时间: 2024-10-13 06:06:36