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

浙公网安备 33010602011771号