Django 視圖(View)

1. 視圖簡介

  • 視圖負責接收 web 請求并返回 web 響應。
  • 視圖就是一個 python 函數,被定義在 views.py 中。
  • 響應可以是一張網頁的 HTML 內容、一個重定向、一個 404 錯誤等等。

響應處理過程如下圖:

  1. 用戶在瀏覽器中輸入網址:www.demo.com/1/100
  2. Django 獲取網址信息,去除域名和端口后剩下 URI:1/100
  3. 按照 urlconf 中正則的配置順序逐一匹配,一旦匹配成功,則調用對應的視圖函數
  4. 調用對應的視圖函數,接收 request 對象(及正則中獲取的值),處理并返回 response 對象

 

2. URLconf

在項目目錄下的 settings.py 中通過 ROOT_URLCONF 指定根級 url 的配置:

ROOT_URLCONF = 'ViewDemo.urls'

項目目錄下的 urls.py 中的 urlpatterns 是一個包含 url() 實例的列表。一個 url() 對象包括:

  • 正則表達式
  • 視圖函數
  • 名稱 name

 

1)關聯各應用下的 URLconf

應用中創建 urls.py,定義本應用中的 urlconf。如 hero_info 應用目錄下的 urls.py:

urlpatterns = [url(r'^$', views.index, name='index'),  # 正則匹配成功時訪問index函數url(r'^([0-9]+)/$', views.detail, name='detail'),  # 正則匹配成功時訪問detail函數
]

再在項目的 urls.py 中使用 include() 關聯對應應用的 urls.py:

urlpatterns = [url(r'^admin/', include(admin.site.urls)),url(r'^hero_info/', include('hero_book.urls', namespace='hero_info')),  # 關聯hero_book包下的urls.py
]

使用 include 可以去除 urlconf 的冗余。

注意:django 2.0 起,urls 不支持正則表達式問題。如果需要使用正則,需要導入 re_path:

from django.urls import path, re_pathurlpatterns = [path('admin/', admin.site.urls),re_path(r'^test-(\d+)-(\d+)/', views.test),path('index/', views.index),
]

匹配過程

解析 web 請求地址時,先與主 URLconf 匹配,成功后再用剩余的部分與應用中的 URLconf 匹配。如下示例:

  1. 請求 http://www.demo.cn/hero_info/1/
  2. 匹配部分是 /hero_info/1/
  3. 在 settings.py 中與“hero_info/”匹配成功,再用“1/”與 hero_info 應用的 urls 匹配成功

 

2)URLconf 的編寫

  • url 的正則表達式不需要添加一個前導的反斜杠,如應該寫作'hero_info/',而不應該寫作'/hero_info/'。
  • 每個正則表達式前面的 r 表示字符串不轉義。
  • 請求的 url 被看做是一個普通的 python 字符串,進行匹配時不包括 get 或 post 請求的參數及域名。
http://www.itcast.cn/python/1/?i=1&p=new  # 只匹配“/python/1/”部分
  • 若要從 url 中捕獲一個值,則要使用正則中的分組。
    • 優先使用命名參數,如果沒有命名參數則使用位置參數。
    • 每個捕獲的參數都作為一個普通的 python 字符串傳遞給視圖。
url(r'^([0-9]+)/$', views.detail, name='detail')  # 通過位置參數傳遞給視圖
url(r'^(?P<id>[0-9]+)/$', views.detail, name='detail')  # 通過分組名稱傳遞參數給視圖函數,本例的參數名稱為id

 

3)namespace 反向解析

在 include 中通過 namespace 定義命名空間,用于反向解析。

URL 的反向解析

問題:如果在視圖、模板中使用硬編碼的鏈接,在 urlconf 發生改變時,維護是一件非常麻煩的事情。

解決:在做鏈接時,通過指向 urlconf 中的 namespace 名稱,動態生成鏈接地址。

  • 視圖:使用 django.core.urlresolvers.reverse() 函數。
  • 模板:使用 url 模板標簽。

 

3. 視圖函數&錯誤視圖

視圖本質就是一個函數。在應用目錄下默認有 views.py 文件,一般視圖都定義在這個文件中。

視圖的參數:

  • 一個 HttpRequest 實例
  • 通過正則表達式分組獲取的位置參數或關鍵字參數

如果處理功能過多,可以將函數定義到不同的 py 文件中(但不建議)。示例:

# 新建views1.py
from django.http import HttpResponsedef index(request):return HttpResponse("你好")# 在urls.py中修改配置
from . import views1
url(r'^$', views1.index, name='index'),

錯誤視圖

Django 原生自帶了幾個默認視圖用于處理 HTTP 錯誤。

404 (page not found) 視圖

  • 默認的 404 視圖將傳遞一個變量 request_path 給模板,它是導致錯誤的 url。
  • 如果Django在檢測URLconf中的每個正則表達式后沒有找到匹配的內容時,將調用 404 視圖。
  • 如果在 settings.py 中 DEBUG 設置為 True,那么將永遠不會調用 404 視圖,而是顯示 URLconf。 并帶有一些調試信息。

1)在 templates 中創建 404.html:

2)編寫 404.html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
{{request_path}}
<h1>Oops!該網頁不存在..</h1>
</body>
</html>

3)在 settings.py 中修改兩個配置:

DEBUG = False  # 取消調試狀態
ALLOWED_HOSTS = ['*', ]  # 允許所有主機訪問

4)訪問不存在的地址:

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

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

相關文章

HarmonyOS基礎概念

一、OpenHarmony、HarmonyOS和Harmony NEXT區別OpenHarmony是由開放原子開源基金會&#xff08;OpenAtom Foundation&#xff09;孵化及運營的開源項目&#xff0c;開放原子開源基金會由華為、阿里、騰訊、百度、浪潮、招商銀行、360等十家互聯網企業共同發起組建。目標是面向全…

spark3 streaming 讀kafka寫es

1. 代碼 package data_import import org.apache.spark.sql.{DataFrame, Row, SparkSession, SaveMode} import org.apache.spark.sql.types.{ArrayType, DoubleType, LongType, StringType, StructField, StructType, TimestampType} import org.apache.spark.sql.functions._…

【跟著PMP學習項目管理】每日一練 - 3

1、你是一個建筑項目的項目經理。電工已經開始鋪設路線,此時客戶帶著一個變更請求來找你。他需要增加插座,你認為這會增加相關工作的成本。你要做的第一件事? A、拒絕做出變更,因為這會增加項目的成本并超出預算 B、參考項目管理計劃,查看是否應當處理這個變更 C、查閱…

CentOS 安裝 JDK+ NGINX+ Tomcat + Redis + MySQL搭建項目環境

目錄第一步&#xff1a;安裝JDK 1.8方法 1&#xff1a;安裝 Oracle JDK 1.8方法 2&#xff1a;安裝 OpenJDK 1.8第二步&#xff1a;使用yum安裝NGINX第三步&#xff1a;安裝Tomcat第四步&#xff1a;安裝Redis第五步&#xff1a;安裝MySQL第六步&#xff1a;MySQL版本兼容性問題…

如何設計一個登錄管理系統:單點登錄系統架構設計

關鍵詞&#xff1a;如何設計一個登錄管理系統、登錄系統架構、用戶認證、系統安全設計 &#x1f4cb; 目錄 開篇&#xff1a;為什么登錄系統這么重要&#xff1f;整體架構設計核心功能模塊安全設計要點技術實現細節性能優化策略總結與展望 開篇&#xff1a;為什么登錄系統這么…

論跡不論心

2025年7月11日&#xff0c;16~26℃&#xff0c;陰 緊急不緊急重要 備考ing 備課不重要 遇見&#xff1a;免費人格測試 | 16Personalities&#xff0c;下面是我的結果 INFJ分析與優化建議 User: Anonymous (隱藏) Created: 2025/7/11 23:38 Updated: 2025/7/11 23:43 Exported:…

【面板數據】省級泰爾指數及城鄉收入差距測算(1990-2024年)

對中國各地區1990-2024年的泰爾指數、城鄉收入差距進行測算。本文參考龍海明等&#xff08;2015&#xff09;&#xff0c;程名望、張家平&#xff08;2019&#xff09;的做法&#xff0c;采用泰爾指數測算城鄉收入差距。參考陳斌開、林毅夫&#xff08;2013&#xff09;的做法&…

http get和http post的區別

HTTP GET 和 HTTP POST 是兩種最常用的 HTTP 請求方法&#xff0c;它們在用途、數據傳輸方式、安全性等方面存在顯著差異。以下是它們的主要區別&#xff1a;1. 用途GET&#xff1a;主要用于請求從服務器獲取資源&#xff0c;比如獲取網頁內容、查詢數據庫等。GET 請求不應該用…

I2C集成電路總線

&#xff08;摘要&#xff1a;空閑時&#xff0c;時鐘線數據線都是高電平&#xff0c;主機發送數據前&#xff0c;要在時鐘為高電平時&#xff0c;把數據線從高電平拉低&#xff0c;數據發送采取高位先行&#xff0c;時鐘線低電平時可以修改數據線&#xff0c;時鐘線高電平時要…

為了安全應該使用非root用戶啟動nginx

nginx基線安全&#xff0c;修復步驟。主要是由于使用了root用戶啟動nginx。為了安全應該使用非root用戶啟動nginx一、檢查項和問題檢查項分類檢查項名稱身份鑒別檢查是否配置Nginx賬號鎖定策略。服務配置檢查Nginx進程啟動賬號。服務配置Nginx后端服務指定的Header隱藏狀態服務…

論文解析篇 | YOLOv12:以注意力機制為核心的實時目標檢測算法

前言&#xff1a;Hello大家好&#xff0c;我是小哥談。長期以來&#xff0c;改進YOLO框架的網絡架構一直至關重要&#xff0c;但盡管注意力機制在建模能力方面已被證明具有優越性&#xff0c;相關改進仍主要集中在基于卷積神經網絡&#xff08;CNN&#xff09;的方法上。這是因…

學習C++、QT---20(C++的常用的4種信號與槽、自定義信號與槽的講解)

每日一言相信自己&#xff0c;你比想象中更接近成功&#xff0c;繼續勇往直前吧&#xff01;那么我們開始用這4種方法進行信號與槽的通信第一種信號與槽的綁定方式我們將按鍵右鍵后轉到槽會自動跳轉到這個widget.h文件里面并自動生成了定義&#xff0c;我們要記住我們這個按鈕叫…

Anolis OS 23 架構支持家族新成員:Anolis OS 23.3 版本及 RISC-V 預覽版發布

自 Anolis OS 23 版本發布之始&#xff0c;龍蜥社區就一直致力于探索同源異構的發行版能力&#xff0c;從 Anolis OS 23.1 版本支持龍芯架構同源異構開始&#xff0c;社區就在持續不斷地尋找更多的異構可能性。 RISC-V 作為開放、模塊化、可擴展的指令集架構&#xff0c;正成為…

4萬億英偉達,憑什么?

CUDA正是英偉達所有神話的起點。它不是一個產品&#xff0c;而是一個生態系統。當越多的開發者使用CUDA&#xff0c;就會催生越多的基于CUDA的應用程序和框架&#xff1b;這些殺手級應用又會吸引更多的用戶和開發者投身于CUDA生態。這個正向飛輪一旦轉動起來&#xff0c;其產生…

Unity3D iOS閃退問題解決方案

前言 在Unity3D開發中解決iOS閃退問題需要系統性排查&#xff0c;以下是關鍵步驟和解決方案&#xff1a; 對惹&#xff0c;這里有一個游戲開發交流小組&#xff0c;希望大家可以點擊進來一起交流一下開發經驗呀&#xff01; 1. 獲取崩潰日志&#xff08;關鍵第一步&#xff…

嵌入式八股文之 GPIO

1. GPIO 的基本概念(1) 什么是 GPIO&#xff1f;GPIO 的中文意思是通用輸入輸出端口&#xff08;General Purpose Input/Output&#xff09;&#xff0c;是嵌入式系統中可編程控制的通用引腳&#xff0c;可通過軟件配置為輸入或輸出模式。&#xff08;背誦&#xff09;(2) 它的…

Umi-OCR 的 Docker安裝(win制作鏡像,Linux(Ubuntu Server 22.04)離線部署)

前置博客&#xff1a;Ubuntu-Server 22.04.4 詳細安裝圖文教程 wget命令在windows終端下不能使用的原因及解決辦法 在 Ubuntu 22.04 LTS 上離線安裝 Docker 手把手教你在Win11下安裝docker Umi-OCR 安裝docker時報錯&#xff1a;workstation服務啟動報錯。錯誤1075&#…

力扣242.有效的字母異位詞

給定兩個字符串 s 和 t &#xff0c;編寫一個函數來判斷 t 是否是 s 的 字母異位詞。示例 1:輸入: s "anagram", t "nagaram" 輸出: true示例 2:輸入: s "rat", t "car" 輸出: false提示:1 < s.length, t.length < 5 * 104s…

基于Springboot+UniApp+Ai實現模擬面試小工具二:后端項目搭建

本節介紹本項目后端項目的開發工具及基礎項目的搭建&#xff0c;包括開發工具介紹及后端項目的創建和依賴框架的引入及對應配置。 源碼下載&#xff1a; 點擊下載 講解視頻&#xff1a; UniappSpringbootKimi實現模擬面試小程序-Springboot項目創建一&#xff0e;開發工具 1.…

Linux711 Mysql

模版 root192.168.235.130s password:┌──────────────────────────────────────────────────────────────────────┐│ ? MobaXterm Personal Edition v23.2 ? ││…