django實現登錄和登錄的鑒權

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/ 這些頁面會自動跳轉到登錄界面。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36094.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36094.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36094.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

源碼框架-三勾軟件

javaspringboot微信小程序商城SAAS前后端源碼: 三勾商城是開發友好的微信小程序商城&#xff0c;框架支持SAAS&#xff0c;支持發布 iOS Android 公眾號 H5 各種小程序&#xff08;微信/支付寶/百度/頭條/QQ/釘釘/淘寶&#xff09;等多個平臺&#xff0c;不可多得的二開神器…

訓練用于序列分類任務的 RoBERTa 模型的適配器

介紹 NLP當前的趨勢包括下載和微調具有數百萬甚至數十億參數的預訓練模型。然而,存儲和共享如此大的訓練模型非常耗時、緩慢且昂貴。這些限制阻礙了 RoBERTa 模型開發更多用途和適應性更強的 NLP 技術,該模型可以從多個任務中學習并針對多個任務進行學習;在本文中,我們將重…

Kafka:安裝和配置

producer&#xff1a;發布消息的對象&#xff0c;稱為消息產生者 &#xff08;Kafka topic producer&#xff09; topic&#xff1a;Kafka將消息分門別類&#xff0c;每一個消息稱為一個主題&#xff08;topic&#xff09; consumer&#xff1a;訂閱消息并處理發布消息的對象…

模擬 枚舉

分享牛客算法基礎精選題單題目打卡!!! 目錄 字符串的展開 多項式輸出 機器翻譯 : 鋪地毯 : [NOIP2016]回文日期 字符串的展開 原題鏈接 : 字符串的展開 思路 : 模擬 代碼 : #include<iostream> #include<cstring> #include<algorithm> using na…

Java課題筆記~ ServletContext

單個Servlet的配置對象 web.xml <servlet><servlet-name>FirstServlet</servlet-name><servlet-class>com.ambow.test.FirstServlet</servlet-class><init-param><param-name>charset</param-name><param-value>utf-8&…

centos自動同步北京時間

1、安裝ntpdate服務 yum -y install ntpdate 2、加入自動任務計劃 查找ntpdate的路徑&#xff1a; which ntpdate 復制這個路徑。 編輯自動任務計劃并加入ntpdate&#xff1a; crontab -e # 每小時第30分鐘同步AD域控時間 30 * * * * /usr/sbin/ntpdate -u 192.168.2.8 > …

DP——動態規劃

DP——動態規劃 動態規劃算法動態規劃的一般步驟特殊DP——背包0-1背包問題完全背包問題 總結 動態規劃算法 當涉及到解決具有重疊子問題的優化問題時&#xff0c;動態規劃是一種常用的算法技術。它通過將問題分解為一系列重疊子問題&#xff0c;并使用遞歸或迭代的方式來解決…

Spring Cloud Gateway系例—GatewayFilter 工廠

目錄 6.1.AddRequestHeader 6.2.AddRequestHeadersIfNotPresent 6.3.AddRequestParameter 6.4.AddResponseHeader 6.5.CircuitBreaker 6.5.1. 熔斷指定的狀態碼 6.6.CacheRequestBody 6.7.DedupeResponseHeader 6.8.FallbackHeaders 6.9.JsonToGrpc 6.10.LocalRespo…

TypeScript 非空斷言

TypeScript 非空斷言 發布于 2020-04-08 15:20:15 17.5K0 舉報 一、非空斷言有啥用 介紹非空斷言前&#xff0c;先來看個示例&#xff1a; function sayHello(name: string | undefined) {let sname: string name; // Error } 對于以上代碼&#xff0c;TypeScript 編譯器…

用戶端Web自動化測試-L1

目錄&#xff1a; Web自動化測試價值與體系環境安裝與使用自動化用例錄制自動化測試用例結構分析web瀏覽器控制常見控件定位方法強制等待與隱式等待常見控件交互方法自動化測試定位策略搜索功能自動化測試用戶端Web自動化測試 1.Web自動化測試價值與體系 功能測試場景: UI 自…

IntelliJ Idea 編譯時控制臺上中文輸出亂碼

猜測原因是IDEA啟動時未指定編碼信息&#xff0c;故與系統編碼保持一致&#xff08;windows中文系統默認為GBK編碼&#xff09;,當以UTF-8編碼進行編譯在控制臺會以GBK編碼輸出,從而導致亂碼 解決方案 指定Idea啟動時JVM的默認編碼為UTF-8 Help -> Edit Custom Options P…

本地圖片的image加密解密-Python 3.10-win10

本地圖片的image加密解密- Python 3.10 pyt3int22 -根據1zip下圖片批量生成加密的-物體識別.py import ioimport os import base64 import json # 指定圖片文件夾 image_dir = "./1zip/" base64code_dir = "./base64code/" base64_to_dir = "./bas…

AUTOSAR規范與ECU軟件開發(基礎篇)2.5 AUTOSAR方法論

前言 AUTOSAR方法論(AUTOSAR Methodology) 中車用控制器軟件的開發涉及系統級、 ECU級和軟件組件級。 系統級主要考慮系統功能需求、 硬件資源、 系統約束, 然后建立系統架構; ECU級根據抽象后的信息對ECU進行配置; 系統級和ECU級設計的同時, 伴隨著軟件組件級的開發。 上…

Sql server還原失敗(數據庫正在使用,無法獲得對數據庫的獨占訪問權)

一.Sql server還原失敗(數據庫正在使用,無法獲得對數據庫的獨占訪問權) 本次測試使用數據庫實例SqlServer2008r2版 錯誤詳細&#xff1a; 標題: Microsoft SQL Server Management Studio ------------------------------ 還原數據庫“Mvc_HNHZ”時失敗。 (Microsoft.SqlServer.…

《甲午》觀后感——GPT-3.5所寫

《甲午》是一部令人深思的紀錄片&#xff0c;通過生動的畫面和真實的故事&#xff0c;向觀眾展示了中國歷史上的一段重要時期。觀看這部紀錄片&#xff0c;我深受觸動&#xff0c;對歷史的認識也得到了深化。 首先&#xff0c;這部紀錄片通過精心搜集的歷史資料和珍貴的影像資料…

低成本搭建NAS,利用HFS進行內網穿透,實現公網訪問

通過HFS低成本搭建NAS&#xff0c;并內網穿透實現公網訪問 文章目錄 通過HFS低成本搭建NAS&#xff0c;并內網穿透實現公網訪問前言1.下載安裝cpolar1.1 設置HFS訪客1.2 虛擬文件系統 2. 使用cpolar建立一條內網穿透數據隧道2.1 保留隧道2.2 隧道名稱2.3 成功使用cpolar創建二級…

JMS 消息隊列接口基本使用指南

概述 介紹 JMS&#xff08;Java Message Service&#xff09;即 Java 消息服務應用程序接口&#xff0c;是一個 Java 平臺中關于面向消息中間件&#xff08;MOM&#xff09;的 API&#xff0c;用于在兩個應用程序之間&#xff0c;或分布式系統中發送消息&#xff0c;進行異步…

[保研/考研機試] KY103 2的冪次方 上海交通大學復試上機題 C++實現

題目鏈接&#xff1a; KY103 2的冪次方 https://www.nowcoder.com/share/jump/437195121691999575955 描述 Every positive number can be presented by the exponential form.For example, 137 2^7 2^3 2^0。 Lets present a^b by the form a(b).Then 137 is present…

k8s containerd 配置 http訪問harbor image【最新--官方文檔】

不看官方文檔的代價&#xff1a;在搜索了很多中文資料發現配置了都不起作用&#xff0c;浪費了很多時間。 https://github.com/containerd/containerd/blob/main/docs/cri/config.md#registry-configuration The old CRI config pattern for specifying registry.mirrors and…

MySQL8安裝和刪除教程 保姆級(Windows)

下載 官網: mysql官網點擊Downloads->MySQL Community(GPL) Downloads->MySQL Community Server(或者點擊MySQL installer for Windows) Windows下有兩種安裝方式 在線安裝 一般帶有 web字樣 這個需要聯網離線安裝 一般沒有web字樣 安裝 下載好之后,版本號可以不一樣&…