Django用户登录注册认证注销

说明:Django用户登录认证注册,代码编辑使用前端使用了jquery, ajax功能把数据传递给后端,bootstrap 。

后端使用了forms组件展示form表单和forms 校验功能。django相关模块组件

1、前端代码访问:https://www.cnblogs.com/albert919/p/16004216.html查看

2、Django url.py设置  

from blog import views

urlpatterns = [
    path('login/', views.login),
    path('index/', views.index),
    path('shop/', views.shop),
    path('register/', views.register),
    path('login_out/', views.login_out),
]

3、forms组件代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from django import forms
from django.forms import widgets
from django.contrib.auth.models import User
from django.core.exceptions import NON_FIELD_ERRORS, ValidationError
import re


class UserReg(forms.Form):
    """
    利用django forms组件让前端展示form表单
    """
    user = forms.CharField(label='用户名', error_messages={'required': '不能为空'},
                           widget=widgets.TextInput(attrs={'class': 'form-control'}))
    pwd = forms.CharField(label='密码', max_length=16,
                          error_messages={'required': '不能为空'},
                          widget=widgets.PasswordInput(attrs={'class': 'form-control'}))
    r_pwd = forms.CharField(label='确认密码', max_length=16,
                            error_messages={'required': '不能为空'},
                            widget=widgets.PasswordInput(attrs={'class': 'form-control'}))

    email = forms.EmailField(label='邮箱', max_length=24,
                             error_messages={'required': '不能为空',
                                             'invalid': '邮箱格式不正确'},
                             widget=widgets.EmailInput(attrs={'class': 'form-control'}))

    def clean_user(self):
        """
        re.match(r'[0-9a-zA-Z]{5,9}$', user_info):判断用户输入字节和使用数字或字母或字母组合
        判断注册用户是否存在
        :return: 
        """
        user_info = self.cleaned_data.get('user')
        user_obj = User.objects.filter(username=user_info).first()
        if re.match(r'[0-9a-zA-Z]{5,9}$', user_info):
            if not user_obj:
                return user_info
            else:
                raise ValidationError('用户已注册')
        else:
            raise ValidationError('字母或数字组成,最少5个字符,最多9个字符')

    def clean(self):
        """
        判断密码是否相同
        :return: 
        """
        pwd = self.cleaned_data.get('pwd')
        r_pwd = self.cleaned_data.get('r_pwd')
        if pwd and r_pwd:
            if pwd == r_pwd:
                return self.cleaned_data
            else:
                raise ValidationError('两次密码不一致')
        else:
            return self.cleaned_data

4、view.py视图登录,注册,认证代码

from django.shortcuts import render, redirect, HttpResponse
from django.http import JsonResponse
# Create your views here.
from blog.models import *
from django.contrib import auth
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required
from blog.formsmodels import UserReg

def login(request):
    """
    用户登录功能认证
    :param request:
    :return:
    """
    if request.is_ajax():
        user = request.POST.get('user')
        pwd = request.POST.get('pwd')

        # if验证成功返回user对象, 否则返回None
        status = auth.authenticate(username=user, password=pwd)
        msg = {'user': None, 'msg': None, 'next': None}
        if status:
            # request.user = user;request.user:当前登录对象
            """
            请求保留用户id和后端.这样用户就不会每次请求都必须重新验证。
            请注意,在当用户登录时,将保留匿名会话
            """
            auth.login(request, status)

            # 登录成功后把用户名传递给前端,前端判断用户登录成功调转到其它页面
            msg['user'] = request.user.username

            # next_url:取用户next=路径传递给前端,调转到取到的路径页面,如果为空跳转到/index/
            next_url = request.GET.get('next', '/index/')
            msg['next'] = next_url
        else:
            msg['msg'] = '用户或密码输入错误'
        return JsonResponse(msg)

    return render(request, 'login/login.html')


def register(request):
    """
    用户注册功能,注册到auth_user表里面
    UserReg():forms模块里面的类名称
    :param request:
    :return:
    """
    response = {'user': None, 'msg': None}
    if request.is_ajax():
        forms = UserReg(request.POST)
        if forms.is_valid():
            response['user'] = forms.cleaned_data.get('user')
            user = forms.cleaned_data.get('user')
            pwd = forms.cleaned_data.get('pwd')
            email = forms.cleaned_data.get('email')
            User.objects.create_user(username=user, password=pwd, email=email)
        else:
            response['msg'] = forms.errors
        return JsonResponse(response)

    form = UserReg()
    return render(request, 'login/register.html', locals())


def login_out(request):
    """
    认证组件用户注销:auth.logout(request)
    :param request:
    :return:
    """
    auth.logout(request)
    return redirect('/login/')


def index(request):
    """
    request.user下的参数相关说使用:
        id 没有登录返回None,登录后会返回对应的id值
        username 没有登录返回空字符串,登录后返回对应的用户username
        get_username() 没有登录返回空字符串,登录后返回对应的用户username
        is_anonymous 没有登录返回True 登录后返回False
        is_authenticated 没有登录返回False 登录后返回True

        is_staff 和 is_superuser 永远为False。
        is_active 永远为 False。
        groups 和 user_permissions 永远为空。

        set_password()、check_password()、save() 和delete() 引发 NotImplementedError。
        New in Django 1.8:
        新增 AnonymousUser.get_username() 以更好地模拟 django.contrib.auth.models.User。
    request.user.is_authenticated:进行相应的页面登录认证,登录成功后跳转到index.html页面
    没有登录调转到登录页面进行登录
    :param request:
    :return:
    """

    if request.user.is_authenticated:
        # request.user.username可以直接在模块使用不需利用username传值
        # request因是全部变量.可以直接使用request.user.相关参数
        username = request.user.username
        return render(request, 'login/index.html', locals())
    else:
        return redirect('/login/')


@login_required
def shop(request):
    """
    Django自带认证装饰器模块:login_required,用户没有登录会调转到指定的页面,需要在settings.py里面设置
    用户没有登录过会跳转到:ip:端口/login/?next=/shop/ 路径
    ?next=/shop/ 登录后会在跳转到访问的shop页面。如果写死了登录调转路径将会失去调转到?next=/shop/功能
    需要在登录功能里面获取next=/shop/路径传递给前端或redirect()进行跳转
    :param request:
    :return:
    """
    return render(request, 'login/shop.html', locals())

5、djgngo认证装饰器,request.user相关参数说明:

1、Django已经设计好了装饰器:login_required认证组件
	from django.contrib.auth.decorators import login_required

	在setting.py里面配置装饰器login_required认证组件,跳转路径
	LOGIN_URL = "/login/"
	注:LOGIN_URL跳转路径配置好,如果访问的页面没有登录会直接到login登录页面
    

1、request.user.相关参数说明:
	request.user.id: 				登录返回id		  	没有登录None
	request.user.is_superuser: 		登录返回True		没有登录False
	request.user.username: 			登录返回username	没有登录永远为空
	request.user.is_staff: 			登录返回True		没有登录False
	request.user.is_active: 		登录返回True 		没有登录False
	request.user.get_username: 		登录返回username	没有登录永远为空
	request.user.is_anonymous: 		登录返回False		没有登录True
	request.user.is_authenticated: 	登录返回True		没有登录False

2、用户登录后返回存储的对应存储数据,匿名用户或者用户没有登录报错:AttributeError: 'AnonymousUser' object has no attribute以下参数
	request.user.password
	request.user.last_login
	request.user.first_name
	request.user.last_name
	request.user.email
	request.user.date_joined
    

 

posted @ 2022-03-14 12:09  点点滴滴的努力  阅读(168)  评论(0)    收藏  举报