使用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中捕捉##clean_字段,,在視圖views使用is_valid時自動嚴重表單字段的有效性# 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#訪問index首頁前先判斷用戶是否登錄,沒有登錄的話需要跳轉到login登錄 #實現方式一:判斷request.user.is_authenticated # 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/") #實現方式二:使用@login_required裝飾器 #login_required裝飾器會先判斷用戶是否登錄,如果沒有登錄則自動跳轉到login_url路徑, #默認跳轉路徑是/accounts/login/,并在登錄后跳轉到原先的請求路徑;如請求路徑/djauth、, #默認跳轉路徑為/accounts/login/?next=/djauth/#示例: #沒有login_url #[13/Dec/2018 14:40:16] "GET /djauth/ HTTP/1.1" 302 0 #302跳轉 #[13/Dec/2018 14:40:16] "GET /accounts/login/?next=/djauth/ HTTP/1.1" #指定loging_url #[13/Dec/2018 14:41:31] "GET /djauth/ HTTP/1.1" 302 0 #[13/Dec/2018 14:41:32] "GET /djauth/login/?next=/djauth/ HTTP/1.1" 200 725 #[13/Dec/2018 14:42:35] "POST /djauth/login/?next=/djauth/ HTTP/1.1" 302 0 #302登錄成功后自動跳轉 #[13/Dec/2018 14:42:35] "GET /djauth/ HTTP/1.1" 200 263 from django.contrib.auth.decorators import login_required @login_required(login_url="/djauth/login/") def index(request):return render(request,"djauth/index.html")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("注冊成功")##獲取form表單clean函數中raise的錯誤#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表中用戶的賬號密碼是否正確,驗證通過,返回用戶名,不通過,返回Noneuser=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):#清除session,登出 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 %}
?