django如何實現(xiàn)用戶的注冊、登錄、注銷功能
創(chuàng)建django項目的步驟:Django項目的創(chuàng)建步驟
一、前置工作
配置數(shù)據(jù)庫,設置數(shù)據(jù)庫引擎為mysql
1、在settings文件中找到DATABASES, 配置以下內容
DATABASES = {
"default": {
'ENGINE': 'django.db.backends.mysql', # 數(shù)據(jù)庫引擎
'NAME': 'django_test', # 連接的數(shù)據(jù)庫, 一定要存在
'HOST': '127.0.0.1', # mysql的ip地址, 這里是本地
'PORT': 3306, # mysql的默認端口
'USER': 'root', # mysql的用戶名
'PASSWORD': 'xxx' # mysql的密碼
}
}
可能會提示以下內容:

安裝即可: pip install mysqlclient -i https://pypi.tuna.tsinghua.edu.cn/simple
二、編寫用戶模型
django中使用ORM來存數(shù)據(jù)到數(shù)據(jù)庫
ORM模型(對象關系映射):
- 一個 模型類對應數(shù)據(jù)庫中的一張表
- 一個屬性對應數(shù)據(jù)庫中的一個字段
用戶表的字段:用戶名、密碼(可以自己擴展)
1、用戶模型

2、創(chuàng)建好模型后要執(zhí)行遷移數(shù)據(jù)的命令:
- 生成遷移文件:python manage.py makemigrations
- 遷移生效(同步到數(shù)據(jù)庫):python manage.py migrate


3、遷移成功后,migrations文件夾下會出現(xiàn)遷移文件,該文件記錄著模型的相關信息,001表示第一次遷移.

三、編寫表單校驗,以注冊表單校驗為例
使用django自帶的Form類來實現(xiàn)校驗
1、對字段的校驗,這里只截了用戶名的校驗,其他字段都差不多

2、對整個表單的校驗:
User需要從models.py文件中導入

3、form表單中自定義的其他方法:

四、編寫前端頁面,純html,文件寫在templates文件夾中
使用了模板的方式嵌入數(shù)據(jù)
超鏈接的跳轉連接:{% url "命名空間:路由的name值" %},有命名空間一定要標注命名空間,沒有則:{% url "路由的name值" %}
1、index.html

2、register.html
- form.non_field_errors:表當校驗時,表單的錯誤,就是forms.py文件中的raise forms.ValidationError("錯誤信息")。
- form.errors.username: 表單校驗時,用戶名的錯誤,就是forms.py文件中的error_messages信息,密碼校驗也是如此。

3、login.html

五、編寫視圖類來實現(xiàn)登錄、注冊功能
如果是get請求就執(zhí)行get方法,是post請求就執(zhí)行post方法,在form標簽中的methos方法中可以指定。
- form.is_valid():用來校驗表單,校驗成功返回True, 失敗則返回False。
- post的方法的實例化表單對象:實例化表單對象時一定要加request.POST,否則拿不到數(shù)據(jù)。
- redirect: 重定向到其他視圖函數(shù)。
- form對象:實例化表單對象,用來進行表單的各種存在,校驗,錯誤信息等待
- request.session['username'] = request.POST['username']: 設置session值為用戶名(其他值也可以)

六、編寫首頁和注銷視圖函數(shù)
1、首頁函數(shù)
request.session.get():通過注冊時設置的session中來獲取用戶,通過這個判斷是否有登錄的用戶,可以與前端交互,有的話就顯示注銷,沒有的話顯示注冊和登錄

2、注銷函數(shù)
清除session值即可

七、編寫路由
1、在主路由中include分路由,并設置命名空間
命名空間:當有多個應用時建議用, 能更好的區(qū)分各個應用,使用namespace關鍵字設置

2、在app下創(chuàng)建一個urls.py文件,編寫以下內容
注意:一定要加app_name, 視圖類一定要加.as_view()

八、django自帶的管理后臺
使用python manage.py createtsuperuser創(chuàng)建超級用戶
1、在admin.py文件中注冊模型
- list_display:在后臺管理中要顯示的字段
- admin.site.site_header:后臺管理的標題

2、在模型(models.py)中添加

3、使用注冊的超級用戶登錄


九、具體的文件
1、models.py
from django.db import models
class User(models.Model):
# 定義變量,對應數(shù)據(jù)庫的表的字段
# username參數(shù):參數(shù)1:后臺管理顯示的內容,參數(shù)2:最大長度, CharField類型必須指定,參數(shù)3:不能為空,參數(shù)4:唯一
username = models.CharField('用戶名', max_length=10, null=False, unique=True)
password = models.CharField('密碼', max_length=255, null=False)
# create_time參數(shù):參數(shù)2:記錄數(shù)據(jù)第一次創(chuàng)建的時間,自動記錄到數(shù)據(jù)庫
create_time = models.DateTimeField('注冊時間', auto_now_add=True)
# 設置后臺管理
class Meta:
app_label = 'app' # 屬于那個app
verbose_name = '用戶'
verbose_name_plural = verbose_name
# 輸出對象時用到的
def __str__(self):
return self.username2、forms.py
from django import forms
from .models import User
class RegisterForm(forms.Form):
# 用戶名
username = forms.CharField(
required=True, # 不能為空,必須
max_length=10, # 最大長度
min_length=4, # 最小長度
error_messages={
'required': "不能為空",
'max_length': "長度不能大于10",
'min_length': "長度不能小于4",
}
)
# 密碼
password = forms.CharField(
required=True, # 不能為空,必須
max_length=16, # 最大長度
min_length=8, # 最小長度
error_messages={
'required': "不能為空",
'max_length': "長度不能大于16",
'min_length': "長度不能小于8",
}
)
# 校驗
def clean(self):
# 獲取輸入的用戶名
username = self.cleaned_data.get('username')
user = User.objects.filter(username=username) # 獲得一個查詢集,可以理解為一個列表
# 用戶存在
if user.exists():
raise forms.ValidationError("用戶已存在")
return self.cleaned_data
# 存入數(shù)據(jù)庫
def save(self):
username = self.cleaned_data.get('username')
password = self.cleaned_data.get('password')
# 存入數(shù)據(jù)庫
user = User(username=username, password=password)
user.save()
class LoginForm(forms.Form):
# 用戶名
username = forms.CharField(
required=True, # 不能為空,必須
max_length=10, # 最大長度
min_length=4, # 最小長度
error_messages={
'required': "不能為空",
'max_length': "長度不能大于10",
'min_length': "長度不能小于4",
}
)
# 密碼
password = forms.CharField(
required=True, # 不能為空,必須
max_length=16, # 最大長度
min_length=8, # 最小長度
error_messages={
'required': "不能為空",
'max_length': "長度不能大于16",
'min_length': "長度不能小于8",
}
)
# 校驗
def clean(self):
# 獲取輸入的信息
username = self.cleaned_data.get('username')
password = self.cleaned_data.get('password')
user = User.objects.filter(username=username) # 獲得一個查詢集,可以理解為一個列表
if user.exists():
if user[0].password != password:
raise forms.ValidationError("密碼錯誤")
else:
raise forms.ValidationError("用戶不存在")
return self.cleaned_data3、admin.py
from django.contrib import admin
from .models import User
# Register your models here.
@admin.register(User)
class UserAdmin(admin.ModelAdmin):
list_display = ['id', 'username', 'create_time']
admin.site.site_header = 'django后臺管理'4、views.py
from django.shortcuts import render, HttpResponse, redirect
from django.views import View
from .models import User
from .forms import RegisterForm, LoginForm
# Create your views here.
def index(request):
username = request.session.get('username', default=0) # 通過session獲取用戶名,給默認值防止報錯
user = User.objects.filter(username=username).first()
return render(request, 'index.html', {'user': user})
class RegisterView(View):
def get(self, request):
form = RegisterForm()
return render(request, 'register.html', {'form': form})
def post(self, request):
form = RegisterForm(request.POST)
if form.is_valid():
form.save()
return redirect('app:login')
return render(request, 'register.html', {'form': form})
class LoginView(View):
def get(self, request):
form = LoginForm()
return render(request, 'login.html', {'form': form})
def post(self, request):
form = LoginForm(request.POST)
print("登錄")
if form.is_valid():
# 設置session
request.session['username'] = request.POST['username']
return redirect('app:index')
return render(request, 'login.html', {'form': form})
# 注銷
def Logout(request):
request.session.clear() # 清除session
return redirect('app:index')
5、app中的urls.py
from django.urls import path
from .views import *
app_name = 'app'
urlpatterns = [
path('', index, name='index'), # 首頁
path('register/', RegisterView.as_view(), name='register'), # 注冊
path('login/', LoginView.as_view(), name='login'), # 登錄
path('logout', Logout, name='logout'), # 注銷
]6、主路由urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path("admin/", admin.site.urls),
path('', include('app.urls', namespace='app'))
]7、index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首頁</title>
</head>
<body>
{% if user %}
<h1>歡迎{{ user.username }}進入首頁!??!</h1>
<a href="{% url 'app:logout' %}" rel="external nofollow" >注銷</a>
{% else %}
<h1>請注冊或登錄</h1>
<a href="{% url 'app:register' %}" rel="external nofollow" rel="external nofollow" >注冊</a>
<a href="{% url 'app:login' %}" rel="external nofollow" rel="external nofollow" >登錄</a>
{% endif %}
</body>
</html>8、register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注冊</title>
</head>
<body>
<h3>注冊</h3>
<a href="{% url 'app:login' %}" rel="external nofollow" rel="external nofollow" >登錄</a>|
<a href="{% url 'app:index' %}" rel="external nofollow" rel="external nofollow" >首頁</a>
<form action="{% url 'app:register' %}" method="post">
{% csrf_token %}
<div><p style="color: red">{{ form.non_field_errors }}</p></div>
<div>
<lable>用戶名</lable>
<label>
<input type="text" name="username">
</label>
<p style="color: red">{{ form.errors.username }}</p>
</div>
<div>
<lable>密碼</lable>
<label>
<input type="password" name="password">
<p style="color: red">{{ form.errors.password }}</p>
</label>
</div>
<button type="submit">注冊</button>
</form>
</body>
</html>9、login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登錄</title>
</head>
<body>
<h3>登錄</h3>
<a href="{% url 'app:register' %}" rel="external nofollow" rel="external nofollow" >注冊</a>|
<a href="{% url 'app:index' %}" rel="external nofollow" rel="external nofollow" >首頁</a>
<form action="{% url 'app:login' %}" method="post">
{% csrf_token %}
<div><p style="color: red">{{ form.non_field_errors }}</p></div>
<div>
<lable>用戶名</lable>
<label>
<input type="text" name="username">
<p style="color: red">{{ form.errors.username }}</p>
</label>
</div>
<div>
<lable>密碼</lable>
<label>
<input type="password" name="password">
<p style="color: red">{{ form.errors.password }}</p>
</label>
</div>
<button>登錄</button>
</form>
</body>
</html>總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Python通過yagmail實現(xiàn)發(fā)送郵件代碼解析
這篇文章主要介紹了Python通過yagmail實現(xiàn)發(fā)送郵件代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-10-10
Python自定義函數(shù)的創(chuàng)建、調用和函數(shù)的參數(shù)詳解
這篇文章主要介紹了Python自定義函數(shù)的創(chuàng)建、調用和函數(shù)的參數(shù)、變量作用域等常見問題,需要的朋友可以參考下2014-03-03
pytorch之torchvision.transforms圖像變換實例
今天小編就為大家分享一篇pytorch之torchvision.transforms圖像變換實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12

