使用Django自带的用户认证系统编写认证、登录、注销
功能:
使用Django默认的User表
1)注册
判断是否已存在此用户,存在的话提示报错“用户已存在”;
判断两次输入的密码是否一致,不一致的话提示报错“密码不一致”。
实现报错提示的方式有两种:
第一种:在form表单中使用clean_函数进行定义判断函数,在views中进行的is_valid()判断时进行校验,并获取错误传送到模板中显示在前端。
第二种:直接在views视图中判断
2)登录
登录成功,跳转到主页index;
登录不成功,初始化登录页面;
跳转到注册页面。
3)主页
直接访问主页,用户没有登录的话跳转到登录页面;
用户已登录显示用户登录名。
4)注销
清除登录的session,退出登录
项目目录结构:
mysite/setting设置
注册应用:
更改时区和语言设置
from django.contrib import admin from django.urls import path from django.conf.urls import url,include urlpatterns = [ path('admin/', admin.site.urls), url(r'^djauth/',include('djauth.urls',namespace='djauth')), ]
from django.urls import re_path from . import views app_name='djauth' urlpatterns=[ re_path(r'^$',views.index), re_path(r'register/$',views.register,name="register"), re_path(r'login/$',views.login_view,name="login"), re_path(r'logout/$',views.logout_view,name="logout"), ]
from django import forms from django.contrib.auth.models import User class login_form(forms.Form): username=forms.CharField(max_length=30) password=forms.CharField(widget=forms.PasswordInput) class register_form(forms.Form): username=forms.CharField(max_length=30,label="姓名") email=forms.EmailField() password=forms.CharField(widget=forms.PasswordInput,min_length=3,label="密码") password_re=forms.CharField(widget=forms.PasswordInput,min_length=3,label="确认密码") #第一种报错方式,使用form表单,views中捕捉 # def clean_username(self): # cd=self.cleaned_data # user=User.objects.filter(username=cd['username']) # if user: # raise forms.ValidationError('用户已存在') # return cd['username'] # def clean_password_re(self): # cd=self.cleaned_data # if cd['password']!=cd['password_re']: # raise forms.ValidationError("密码不一致") # return cd['password_re']
from django.shortcuts import render,redirect,reverse from django.http import HttpResponse import time from django.contrib import auth from django.contrib.auth.models import User from . import forms # Create your views here. def index(request): if request.user.is_authenticated: # request.user.username;;获取登录用户名 print("UserAuth:",request.user.username) return render(request,"djauth/index.html") else: return redirect("/djauth/login/") def register(request): errors=[] if request.method=='POST': RegisterForm=forms.register_form(request.POST) if RegisterForm.is_valid(): # 第一种报错方式,捕捉form表单的报错 # Register=RegisterForm.cleaned_data # # user=User.objects.create_user(username=Register['username'], # password=Register['password'], # email=Register['email'] # ) # user.save() # return HttpResponse("注册成功") #errors=RegisterForm.errors #第二种报错方式,直接在views中判断 Register=RegisterForm.cleaned_data user_exist=User.objects.filter(username=Register['username']).exists() if user_exist: errors.append("用户已存在") if Register['password']!=Register['password_re']: errors.append("密码不一致") else: user=User.objects.create_user(username=Register['username'], password=Register['password'], email=Register['email'] ) user.save() return HttpResponse("注册成功") RegisterForm=forms.register_form() return render(request,"djauth/register.html",{"RegisterForm":RegisterForm,"errors":errors}) def login_view(request): error=[] curtime=time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()) if request.method=='POST': LoginForm=forms.login_form(request.POST) if LoginForm.is_valid(): Account=LoginForm.cleaned_data user=auth.authenticate(username=Account['username'],password=Account['password']) if user is not None: if user.is_active: auth.login(request,user) return redirect("/djauth/") else: error.append("用户无效") else: error.append("账号或密码错误") else: LoginForm=forms.login_form() return render(request,'djauth/login.html',{"LoginForm":LoginForm,"curtime":curtime,"error":error}) def logout_view(request): auth.logout(request) return redirect("/djauth/login")
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{% block title %} {% endblock %}</title> </head> <body> {% block content %} {% endblock %} </body> </html>
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>首页</title> </head> <body> <h1>首页</h1> <!--获取登录用户名:request.user.username或user.username--> {% if request.user.is_authenticated %} {{ user.username }} {% endif %} <p><a href="{% url 'djauth:logout' %}">退出</a></p> </body> </html>
{% extends "djauth/base.html" %} {% block title %} Login Page {% endblock %} {% block content %} <h1>Login Page</h1> {% if error %} {{ error }} {% endif %} <p>时间:{{ curtime }}</p> <form action="" method="post"> {% csrf_token %} {{ LoginForm.as_p }} <input type="submit" value="Login"> </form> <p>没有账号?点击<a href="{% url 'djauth:register' %}">注册</a></p> {% endblock %}
{% extends "djauth/base.html" %} {% block title %} Register Page {% endblock %} {% block content %} <h1>Register Page</h1> {% if errors %} <p>{{ errors }}</p> {% endif %} <form action="" method="post"> {% csrf_token %} {% for foo in RegisterForm %} <p>{{ foo.label_tag }}{{ foo }} {{ errors.foo }}</p> {% endfor %} <input type="submit" value="注册"> </form> {% endblock %}