Python Django,认证系统,身份认证,用户注册、登录、注销,登录验证

Python Django,认证系统,身份认证,用户注册、登录、注销,登录验证_第1张图片

项目名/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('退出成功!')

 

 

你可能感兴趣的:(Python+)