项目名/settings.py(项目配置,配置认证使用的模型类):
# django认证系统使用的模型类 (默认使用数据库中的auth_user表)
AUTH_USER_MODEL='user.User' # 应用名.模型类名
# 注意: AUTH_USER_MODEL配置参数要在第一次迁移数据库之前配置,否则可能django的认证系统工作不正常
应用名/models.py(模型,定义认证系统使用的模型类):
from django.db import models
from django.contrib.auth.models import AbstractUser
# 认证系统使用的模型类,继承AbstractUser类
class User(AbstractUser):
'''用户模型类'''
class Meta:
db_table = 'df_user' # 对应的数据库表名
verbose_name = '用户' # 后台Admin站点,表名的显示
verbose_name_plural = verbose_name # 后台Admin站点,表名复数的显示
应用名/views.py(视图,用户注册、登录、身份认证):
from django.shortcuts import render
from django.http import HttpResponse
from user.models import User
from django.contrib.auth import authenticate, login
# 视图函数。 注册用户
def register(request):
# 。。。
# 校验用户名是否重复
try:
user = User.objects.get(username="用户名") # get能且仅能返回一条数据。
# 。。。
except User.DoesNotExist:
# 用户名不存在
# 。。。
# 注册用户。 create_user()方法,创建认证用户。
user = User.objects.create_user("用户名", "邮箱", "明文密码") # 密码会自动进行加密。
user.is_active = 0 # 手动设置用户的其他属性
user.save() # 保存到数据库。
return render(request, 'register.html')
# 视图函数。 用户登录(身份认证)
def doLogin(request):
# 业务处理:登录校验
user = authenticate(username="用户名", password="明文密码")
if user is not None:
# 用户名密码正确
login(request, user) # 登录,将用户信息写入session中。
return HttpResponse('登录成功')
else:
# 用户名或密码错误
return render(request, 'login.html', {'errmsg':'用户名或密码错误'})
login_required装饰器,装饰视图函数(只有登录后才可以正常执行视图函数的内容)
项目名/settings.py(项目配置,配置登录页的url):
# 配置登录url地址
LOGIN_URL='/user/login' # 默认url是:/accounts/login
应用名/views.py(视图,@login_required装饰器装饰视图函数):
from django.http import HttpResponse
from django.views import View
from django.contrib.auth.decorators import login_required # 导入login_required
# 视图函数 (直接使用login_required装饰器装饰)
@login_required
# login_required装饰器用于判断是否已登陆。如果没登陆会跳转到setting.py中配置的登陆页,并将当前访问的url当做next参数拼接到登录url后。
def func(request):
# 。。。
return HttpResponse('ok')
# 定义类视图 (在urls.py中用login_required函数包装as_view()方法)
class MyView(View):
# get方法表示get请求处理的函数。
def get(self, request):
return HttpResponse('result')
# post方法表示post请求处理的函数。
def post(self, request):
return HttpResponse('result')
应用名/urls.py(路由配置,login_required(类视图.as_view()) ):
from django.conf.urls import url
from django.contrib.auth.decorators import login_required
from 应用名.views import MyView
urlpatterns = [
url(r'^$', login_required(MyView.as_view())), # login_required包装 类视图.as_view(),进行登陆验证。
# 如果是视图函数,就直接在views.py中通过@login_required修饰即可。
]
login_required装饰器,login_required"包装"类视图的第二种方式。 LoginRequireMixin类
utils/mixin.py(工具包,定义LoginRequiredMixin类):
from django.contrib.auth.decorators import login_required # 导入login_required
class LoginRequiredMixin(object):
@classmethod
def as_view(cls, **initkwargs):
# 调用父类的as_view
view = super(LoginRequiredMixin, cls).as_view(**initkwargs)
return login_required(view)
应用名/views.py(视图,类视图继承LoginRequiredMixin):
from django.http import HttpResponse
from django.views import View
from utils.mixin import LoginRequiredMixin
# 定义类视图 (继承LoginRequiredMixin,继承之后就不需要在urls.py中用login_required"包装"了)
class MyView(LoginRequiredMixin, View):
# get方法表示get请求处理的函数。
def get(self, request):
return HttpResponse('result')
# post方法表示post请求处理的函数。
def post(self, request):
return HttpResponse('result')
request.user.is_authenticated() 判断是否已登录
应用名/views.py(视图,is_authenticated是否已登录):
from django.shortcuts import render
from django.views import View
# 类视图
class UserInfoView(View):
def get(self, request):
# Django认证系统会给request对象添加一个属性request.user
# 如果用户未登录->user是AnonymousUser类的一个实例对象,is_authenticated是False。
# 如果用户登录->user是User类的一个实例对象(表示登陆用户)
# request.user.is_authenticated() # 可以判断用户是否登陆。
# django框架会自动把request.user当做模板变量传给模板文件
return render(request, 'demo.html')
templates/demo.html(模板,使用is_authenticated):
{# user是Django自动传递的模板变量 #}
{% if user.is_authenticated %}
已登陆
{% else %}
未登陆
{% endif %}
logout() 退出登录
应用名/views.py(视图,logout() 退出登录):
from django.http import HttpResponse
from django.views import View
from django.contrib.auth import logout
# 类视图
class LogoutView(View):
'''退出登录'''
def get(self, request):
# 清除用户的session信息
logout(request)
return HttpResponse('退出成功!')