1、創建數據庫的管理員表
在models.py 中定義admin表,為了簡單,表里只有用戶名和密碼還有默認加的id 三個字段
from django.db import models# Create your models here.class Admin(models.Model):username = models.CharField(verbose_name="用戶名",max_length=16)passwd = models.CharField(verbose_name="密碼",max_length=64)
執行創建表的語句
py -3 manage.py makemigrations
py -3 manage.py migrate
然后自己手動插入一些用戶
2、登錄界面和登錄視圖
在urls.py中加入路徑
from django.urls import path
from app01.views import user,depart,pretty,admin,accounturlpatterns = [#path('admin/', admin.site.urls),path('depart/list/', depart.depart_list),path('depart/add/', depart.depart_add),path('depart/delete/', depart.depart_delete),#http://127.0.0.1:8000/depart/2/edit/path('depart/<int:nid>/edit/', depart.depart_edit),path('user/list/', user.user_list),path('user/add/', user.user_add),path('user/<int:nid>/edit/', user.user_edit),path('user/<int:nid>/delete/', user.user_delete),path('pretty/list/', pretty.pretty_list),path('pretty/add/', pretty.pretty_add),path('pretty/<int:nid>/edit/', pretty.pretty_edit),path('pretty/<int:nid>/delete/', pretty.pretty_delete),path('admin/add/', admin.admin_add),path('admin/list/', admin.admin_list),path('admin/<int:nid>/edit/',admin.admin_edit),path('login/account/',account.login), #這個是登錄的
]
在寫登錄的視圖函數account.py
我把不同模塊的視圖函數拆分了,不同功能模塊的一個py文件,在app01目錄下創建目錄views, 在views目錄下分類寫視圖函數,主要要把原始的views.py文件刪除
登錄使用的Form組件
獲取到用戶輸入的數據后要對數據進行校驗,根數據庫里面的值
再有如果驗證通過要request.session 通過這個生成session, django會自動處理,生成一個session保存到數據庫,并把這個session返回給瀏覽器。
from django.shortcuts import render,redirect
from django import forms
from app01.utils.encrypt import md5
from app01 import modelsclass LoginForm(forms.Form):username = forms.CharField(label="用戶名",widget=forms.TextInput,required=True,)passwd = forms.CharField(label="密碼",widget=forms.PasswordInput(render_value=True),required=True)# 這個init方式是給自己加樣式的def __init__(self, *args,**kwargs):super().__init__(*args,**kwargs)for name ,field in self.fields.items():#字段中有屬性,保留原來的屬性,沒有屬性,才增加if field.widget.attrs:field.widget.attrs["class"] = "form-control"field.widget.attrs["placeholder"] = field.labelelse:field.widget.attrs = {"class":"form-control"}def login(request):"""用戶登錄"""if request.method == 'GET':form = LoginForm()return render(request,'login.html',{'form':form})form = LoginForm(data=request.POST)if form.is_valid():#print(form.cleaned_data) #獲取到的值是一個字典{'username': 'root', 'passwd': '1234'}#校驗數據庫的用戶名和密碼admin_object = models.Admin.objects.filter(**form.cleaned_data).first()if not admin_object:form.add_error('passwd','用戶名或密碼錯誤')return render(request,'login.html',{'form':form})#用戶名和密碼正確#網站生成隨機字符串; 寫到用戶瀏覽器的cookie中,再寫入到session中request.session['info'] = {'id':admin_object.id,'name':admin_object.username}return redirect('/admin/list/')return render(request,'login.html',{'form':form})
login.html 的內容
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.min.css' %}"><style>.account {width: 400px;border-radius: 5px;border: 1px solid #dddddd;box-shadow: 5px 5px 20px #aaa;margin-left: auto;margin-right: auto;margin-top: 100px;padding: 20px 40px;}.account h2 {margin-top: 10px;text-align: center;}</style>
</head>
<body>
<div class="account"><h2>用戶登錄</h2><form method="post" novalidate>{% csrf_token %}{% for field in form %}<div class="form-group"><label >{{ field.label }}</label>{{ field }}<span style="color:red">{{ field.errors.0 }}</span></div>{% endfor %}<button type="submit" class="btn btn-primary">提交</button></form></div><script src="{% static 'js/jquery-3.7.0.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap-3.4.1/js/bootstrap.min.js' %}"></script>
</body>
</html>
3、中間件實現登錄鑒權
在開始我們寫了一個功能后,把django項目運行起來,直接方法url就能訪問到了,正常來說是只有登錄后的用戶才能訪問到,django中給我們提供了中間件,可以通過中間件來實現鑒權
在django 中可以定義多個中間件,中間件就是一個類,類里面定義有兩個函數一個是process_request進入的,穿過所有的中間件到達視圖函數,視圖函數返回結果通過process_response函數返回給瀏覽器
- 定義中間件
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirectclass AuthMiddleWare(MiddlewareMixin):"""中間件判斷是否登錄"""def process_request(self,request):# 1、排除那些不需要登錄就能訪問的頁面# request.path_info 獲取當前用戶請求的URL ru /login/account/if request.path_info == '/login/account/':return# 2、讀取當前訪問的用戶的session信息,如果能讀到,說明以登錄過,就可以繼續向后走info_dict = request.session.get("info")if info_dict:return# 3、沒有登錄過,重新回到登錄頁面return redirect('/login/account/')
- 使用中間件,在settings.py中注冊中間件
會按這個順序執行,中間件定義好后,會自動調傭
MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware','django.middleware.common.CommonMiddleware','django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware','app01.middleware.auth.AuthMiddleWare',
]
中間件添加好后,你再沒有登錄的情況下去訪問http://127.0.0.1:8000/user/list/ 這些頁面會自動跳轉到登錄界面。