登錄注冊案例
1.登錄注冊第一步——創建模型生成資料表:
(1)名為mucis的app下的models.py檔案中創建:
from django.db import models
# Create your models here.
class User(models.Model):
username = models.CharField(max_length=30, unique=True)
password = models.CharField(max_length=50)
(2)執行映射檔案生成資料表:


2.基本框架的搭建
(1)登錄注冊登出視圖函式框架撰寫:
(mucis/views.py檔案~)
from django.views import View #使用類視圖,要匯入!
class LoginResponse(View):
def get(self,request):
return "登錄頁面"
def post(self):
"""
登錄邏輯
:return:
"""
pass
class RegisterResponse(View):
def get(self, request):
return "注冊頁面"
def post(self):
"""
注冊邏輯
:return:
"""
pass
"""
微信公眾號:孤寒者
歡迎關注,持續分享干貨文章~
如有問題也可關注微信公眾號咨詢哦!
"""
def logout(request):
"""
退出登錄
:param request:
:return:
"""
pass
(2)登錄注冊登出路徑配置:
(mucis/urls.py檔案~)
from django.urls import path
from mucis import views
urlpatterns = [
path('login/', views.LoginResponse.as_view(), name="login"), # 登錄
path('register/', views.RegisterResponse.as_view(), name="register"), # 注冊
path('logout/', views.logout, name="logout"), # 退出
]
(2)登錄注冊登出前端模板框架撰寫:
(templates/mucis/login.html檔案~)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登錄</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
<h2>登錄</h2>
用戶名:<input type="text" name="username"><br>
密碼:<input type="password" name="password"><br>
<button type="submit">登錄</button>
</form>
</body>
</html>
(templates/mucis/register.html檔案~)
需要注意的是:別看我這注冊和登錄的頁面一模一樣,你就以為這倆直接共用一個模板就行了!真正使用的時候注冊需要的資訊是比登錄要多,所以這倆不可能使用同一個模板,本處為了方便講解,所以只建了個含有用戶名和密碼的模型,所以會造成注冊和登錄可以用同一個模板的假象!
不信你看我在下面注冊模板中又隨便加了個輸入框,但是其實它沒用,我只是為了強調這個問題!
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注冊</title>
</head>
<body>
<form action="" method="post">
{% csrf_token %}
<h2>注冊</h2>
用戶名:<input type="text" name="username"><br>
密碼:<input type="password" name="password"><br>
手機號:<input type="text" name="phone"><br>
<button type="submit">注冊</button>
</form>
</body>
</html>
3.登錄注冊登出邏輯實作
簡單分析登錄注冊邏輯實作,以登錄邏輯實作為例講個問題:
問題引入——當撰寫登錄邏輯的時候,需要對form表單中用戶提交過來的資料進行簡單的校驗,之前我對其進行校驗都是直接在視圖函式中使用if進行,確實可以,但是有B格嗎?沒有,所以咱不那樣干了這次!
?其實,不那樣用的最主要的原因是:django中提供了一個form表單的功能,這個表單可以用來驗證資料的合法性還可以用來生成HTML代碼!!!

(1)純理論來講講form表單:
①form表單的引入:
-
登錄頁面和注冊頁面都會用到form表單來提交資料
-
當資料提交到后臺后,需要在視圖函式中去驗證資料的合法性.
-
django中提供了一個form表單的功能,這個表單可以用來驗證資料的合法性還可以用來生成HTML代碼
-
所以這個登錄注冊案例我們就來使用這個django自帶的form來生成前端頁面以及驗證資料.
②關于django form表單的使用:
- 創建一個forms.py的檔案,放在指定的app當中,然后在里面寫表單.
- 表單是通過類實作的,繼承自forms.Form,然后在里面定義要驗證的欄位.
- 在表單中,創建欄位跟模型是一模一樣的,但是沒有null=True或者blank=True等這幾種引數了,有的引數是required=True/False.
- 使用is_valid()方法可以驗證用戶提交的資料是否合法,而且HTML表單元素的name必須和django中的表單的name保持一致,否則匹配不到.(比如此例中request.POST獲取的HTML表單元素的name屬性值與form表單中的name是一樣的:username,password)
- is_bound屬性:用來表示form是否系結了資料,如果系結了,則回傳True,否則回傳False.
- cleaned_data:這個是在is_valid()回傳True的時候,保存用戶提交上來的資料.
③form表單中的一些引數說明:
- max_length 最大長度
- min_length 最小長度
- widget 負責渲染網頁上HTML 表單的輸入元素和提取提交的原始資料
- attrs 包含渲染后的Widget 將要設定的HTML 屬性
- error_messages 報錯資訊
注:雖然form可以生成前端頁面,但這個功能實際用的少,主要是是用form表單的驗證功能!
(2)在本案例中實戰使用這個form表單:
在此名為mucis的app下創建forms.py的檔案,撰寫表單校驗(用戶登錄和注冊的資料校驗):
from django import forms
from django.core.validators import RegexValidator #匯入校驗器,供下面驗證電話號碼用
#校驗登錄
class LoginForm(forms.Form):
#長度校驗/非空提醒
username = forms.CharField(max_length=16,min_length=6,error_messages=
{"max_length":"長度不能超過16位",
"min_length":"長度不能小于6位",
"required":"用戶名不能為空"
})
password = forms.CharField(max_length=16,min_length=6,error_messages=
{"max_length":"長度不能超過16位",
"min_length":"長度不能小于6位",
"required": "密碼不能為空"
})
""""
解釋如下注釋的原因:
下面這個函式clean()是用于進行資料驗證的,本來我想也寫在此form表單校驗里,但是后面在視圖函式里寫業務邏輯時發現,
如果驗證成功,用戶需要登錄->這就意味著需要設定session,而session是通過request物件來設定,在視圖函式里直接有,可以直接使用;
而如果在此form表單校驗里寫的話還需要匯入,是不是多此一舉了,所以此處注釋,本邏輯在視圖函式里完成!
"""
# def clean(self): # 前端表單用戶輸入的資料經過上面過濾后再結合后臺資料庫所有資料進行分析
# # 校驗資料庫中是否有該用戶
# # 1.拿取用戶名和密碼
# username = self.cleaned_data.get("username")
# password = self.cleaned_data.get("password")
# # 2.進行判斷
# user = User.objects.filter(username=username, password=password)
# return user if user else None
#校驗注冊
class RegisterFrom(forms.Form):
# 長度校驗/非空提醒
username = forms.CharField(max_length=16, min_length=6, error_messages=
{"max_length": "長度不能超過16位",
"min_length": "長度不能小于6位",
"required": "用戶名不能為空"
})
password = forms.CharField(max_length=16, min_length=6, error_messages=
{"max_length": "長度不能超過16位",
"min_length": "長度不能小于6位",
"required": "密碼不能為空"
})
phone = forms.CharField(max_length=11, min_length=1, validators=[RegexValidator(r"^1[3-9][0-9]{9}$","手機號格式有誤!")],error_messages=
{"max_length": "手機號只能為11位",
"min_length": "手機號只能為11位",
"required": "手機號不能為空"
})
(3)視圖函式業務邏輯完善:
from django.http import HttpResponse
from django.shortcuts import render, redirect
from django.urls import reverse
from django.views import View #使用類視圖,要匯入!
from .models import User
from .forms import LoginForm, RegisterFrom
class LoginResponse(View):
def get(self,request):
username = request.session.get("username")
return render(request, "mucis/login.html", context={"username":username})
def post(self, request):
"""
登錄邏輯
:return:
"""
# 獲取用戶資料
data = request.POST
# 校驗資料
# 校驗資料是否存在,判斷長度/格式
'''
列印觀察request.POST,其資料格式:
<QueryDict: {'csrfmiddlewaretoken':['ILsinMw9...VBBR'], 'username':
['124134314'], 'password': ['3432423']}>
會發現它是一個字典型別,包含了用戶輸入的資料,而我們form表單檢驗需要在實體化傳入的
值就是字典型別,所以直接傳入request.POST即可!
'''
form = LoginForm(data) # 將獲取到的引數傳入RegisterForm類,
if form.is_valid(): # 用is_valid()方法驗證提交資料的合法性,即是否通過form校驗
# 獲取資料
username = form.cleaned_data.get("username") # # 獲取經過form組件清洗過后的資訊 用cleaned_data獲取單個資料物件值
password = form.cleaned_data.get("password")
# 判斷資料庫是否有該用戶
user = User.objects.filter(username=username, password=password).first() # 獲取用戶實體
if user:
# 設定session資訊
request.session["username"] = user.username
return redirect(reverse('login')) # 重定向到登錄頁面,重新請求一下登錄頁面
else: # 獲取到form表單中的具體的錯誤格式的資訊!【通過除錯發現表單校驗的錯誤資訊都在form.errors里~】
error = form.errors
err_li = []
for e in error: # error為類似字典型別,for回圈得到的是字典的鍵
err_li.append(error.get(e).data[0].message + ",")
return HttpResponse(err_li)
class RegisterResponse(View):
def get(self,request):
return render(request,"mucis/register.html")
def post(self,request):
"""
注冊邏輯
:return:
"""
# 獲取用戶資料
data = request.POST
# 校驗資料
form = RegisterFrom(data)
if form.is_valid():
username = form.cleaned_data.get("username")
password = form.cleaned_data.get("password")
# 入庫
try:
User.objects.create(username=username,password=password)
return redirect(reverse("login"))
except Exception as e:
return redirect(reverse("register")) #如果出現例外,就回傳注冊頁面!
else:
error = form.errors
err_li = []
for e in error: #error為類似字典型別,for回圈得到的是字典的鍵
err_li.append(error.get(e).data[0].message+",")
return HttpResponse(err_li)
def logout(request):
"""
退出登錄
:param request:
:return:
"""
request.session.flush()
return redirect(reverse("login"))
(4)登錄頁面稍作修改
- 如果已經登錄,則通過顯示“歡迎XXX”來說明用戶登錄成功;
- 增加退出登錄選項,

4.案例實作效果展示:
(1)注冊功能:

點擊注冊后,注冊成功,跳轉至登錄頁面:

觀察資料庫,也有了對應的用戶資料:

(2)登錄功能:

點擊登錄之后,會發現登錄成功哦!

(3)退出功能:
點擊退出登錄之后,跳轉登錄界面,OK!

(4)如果登錄時資料不合法:


(5)如果注冊時資料不合法:


專案原始碼:
鏈接:https://pan.baidu.com/s/18QkSulZaA3XCqiKsOE5_fA
提取碼:GHZ6
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/299191.html
標籤:python
下一篇:Python基礎篇(九)
