揭秘 Django 的魔法

已發表: 2022-03-10
快速總結↬在本文中,我們將通過了解生成的文件和文件夾的作用來深入了解 Django 帶來的好處,這將使我們更好地了解 Django 框架。

根據官方文檔,

Django 是一個高級 Python Web 框架,它鼓勵快速開發和簡潔、實用的設計。 它由經驗豐富的開發人員構建,解決了 Web 開發的大部分麻煩,因此您可以專注於編寫應用程序,而無需重新發​​明輪子。 它是免費和開源的。

— DjangoProject.com

它是 Python 用於構建 Web 應用程序的流行框架之一,並且因其在創建具有規定配置和文件的樣板文件時的可伸縮性而最受歡迎。 這為開發人員總結了 Django 的全部目標;

“...在很短的時間內構建一個出色的應用程序,減少對基本設置的擔憂。”

無論您正在構建什麼,都有跨越所有 Web 應用程序的基本配置、文件和样式。 使用 Django 時,當您在應用程序開發週期的不同時間點運行某些命令時,會自動為您生成這些命令。 這樣,您將有足夠的時間專注於開發應用程序的核心方面,而 Django 會為您處理其他方面。

這意味著在引擎蓋下發生了很多事情。 對於沒有完全掌握運動部件的人來說,這可能是壓倒性的。 在本文中,我們將學習以下內容:

  • Django的安裝
  • startprojectstartapp命令
  • Django 配置文件,其中包括;
    • 設置.py
    • 網址.py
    • 管理.py
  • 模型佈局
  • 路由

我們將了解這些如何組合在一起以及它們所扮演的角色。 重要的是要知道不可能查看 Django 內部發生的所有事情。 對於本教程範圍之外的案例,將有鏈接指向您可以幫助解決此問題的資源。

為了學習目的,我們將建立一個電子商務平台。 這不是一個成熟的電子商務網站,我們的應用程序只有兩個基本功能; 從管理員的角度創建產品和下訂單。

本文將引導您了解 Django 的預構建命令、文件和基礎知識。 它面向使用過或打算使用 Django 並想知道幕後發生了什麼的開發人員。 雖然您不一定必須使用過 Django,但在繼續本文之前擁有 Django 基礎知識的經驗會給您帶來優勢。 您需要具備 Python 的工作知識才能完全掌握本文將涵蓋的內容。

跳躍後更多! 繼續往下看↓

安裝 Django

如果您尚未安裝 Django,請按照以下步驟操作。

首先,創建一個名為djangodev的虛擬環境。 你需要這個來隔離你的 Django 工作區和它的依賴包。

 python3 -m venv ~/.virtualenvs/djangodev

現在要進入您的虛擬環境,您需要激活它;

 source ~/.virtualenvs/djangodev/bin/activate

如果您在使用source運行時遇到任何錯誤,您可以使用此替代命令,

 . ~/.virtualenvs/djangodev/bin/activate

對於 Windows 用戶,請改用它,

 ...\> %HOMEPATH%\.virtualenvs\djangodev\Scripts\activate.bat

注意:您需要在想要使用 Django 的任何時候激活虛擬環境。

現在你在你的虛擬環境中,安裝 Django:

 python -m pip install Django

要檢查 Django 是否正確安裝,請運行;

 python -m django --version

搖晃! 現在你已經準備好施展魔法了,準備好你的魔杖吧!

隨時隨地創建文件和文件夾的方法可能簡單明了。 但是,當您必須創建一個中型或大型項目並且需要完成最後期限時,這並不理想。 即使是個人項目,我們也總是有一個截止日期。

在創建新的大型項目時,按照這種方法,您將不得不創建多個文件和文件夾並進行多項設置,這可能會導致創建可避免的錯誤並浪費大量時間。 我們可以通過 Django 使用的startprojectstartapp命令旨在解決這個問題。 這兩個命令為您創建文件、文件夾並執行大量配置。

讓我們開始使用startproject命令生成一個新應用程序。

腳手架應用程序

我們將生成我們的應用程序並查看生成的文件,以及我們將使用的一些命令。 在終端中運行此命令以開始;

 django-admin startproject ecommerce_site

安裝 Django 時,將django-admin添加到您的路徑中,以授予其執行操作的權限。 它是 Django 用於管理職責的命令行實用程序。 在這裡了解更多django-admin使用; 這有點超出了本文的範圍。

startproject是一個幫助生成項目的 Django 命令。 在這裡,我們將項目ecommerce_site的名稱傳遞給它。 然後它繼續在名為ecommerce_site的目錄中創建項目。 目錄應該是這樣的,

在 startproject 之後顯示目錄。
運行 startproject 後顯示文件夾。 (大預覽)

我們需要導航到新創建的目錄並運行命令來生成應用程序

 cd ecommerce_site python manage.py startapp trading

startapp是項目目錄下manage.py執行的命令,它會創建多個文件,以及一個以命令中指定的名稱命名的文件夾,在本例中,指定的是trading 。 app 文件夾包含創建應用程序功能所需的簡單文件。 現在你的目錄應該是這樣的:

在 startapp 之後顯示目錄。
運行 startapp 後顯示文件夾。 (大預覽)

如果您想知道項目和應用程序之間的區別。 一個項目是一個 Django Web 應用程序,它可以包含一個或多個應用程序。 它是包含manage.py的文件夾和包含settings.py和其他文件的其他模塊。 應用程序是具有特定功能的 python 包,包括諸如models.py遷移目錄等文件。 您可以在 Stack Overflow 上查看此答案以獲取更多信息。

startproject將創建主項目目錄,而startapp將創建 app 目錄。 兩者也都被傳遞了一個名稱以供一代人使用。 startproject是創建新項目時運行的第一個命令,而startapp在新項目目錄中運行。

當前佈局是一個很好的映射,您可以將其用於您正在構建的任何應用程序。 它是可擴展的,由您需要的文件組成。 有機會在項目中創建、重命名、編輯和移動文件。

Django的配置

Django 為您提供了不同的設置和配置,在不同文件中運行這兩個命令後,讓我們運行生成的文件以了解每個文件的作用。

settings.py

大多數 Web 應用程序需要像這樣的配置; 身份驗證以驗證用戶,權限以允許某些用戶具有某些能力並設置安全標準。 所有這些都是為您的用戶提供所需的最佳體驗所必需的。 作為開發人員,您需要很長時間才能開始為您開發的每個應用程序自行推出每一項。

Django 為您提供了這些所需的配置以及更多 - 這樣您就可以選擇您想要的配置並將它們插入。這些在settings.py中完成,已經創建了一些設置來為您提供基本功能。

當 Django 嘗試運行一個項目時,它會尋找某些變量。 settings.py是保存那些導致其他文件或信息的變量的文件。 Django 從manage.py文件定向到該文件,並獲取信息或加載從此處引導到的其他文件。

這些配置包括:

  • DEBUG
    DEBUG功能設置為True以便在開發中讀取錯誤和調試代碼,在生產期間(即部署時)應將其設置為False 。 此設置允許您在 Django 嘗試運行您的代碼時更好地調試您的代碼。
  • INSTALLED_APPS
    這是在 Django 中執行特定功能的所有應用程序的列表。 它帶有一些默認應用程序,例如用於用戶身份驗證的'django.contrib.auth' django.contrib.admin' ,用於管理功能的 django.contrib.admin,以及向用戶發送通知或信息所需的'django.contrib.messages' 。 您使用startapp命令創建的任何其他應用程序都必須在此處才能由 Django 運行。
  • MIDDLEWARE是一個輕量級框架,用於處理通過 Django 請求和響應的輸入和輸出。 每個中間件對應用程序執行特定的功能,例如'django.contrib.auth.middleware.AuthenticationMiddleware''django.contrib.sessions'一起使用以將用戶與請求相關聯。 您應該查看文檔中每個中間件的更多功能。
  • ROOT_URLCONF是一個路徑變量,當請求被傳遞給你的 Django 應用程序時,Django 會在該路徑中查找你的urlpatterns 。 每當在 Django 應用程序中發出請求時,Django 都會搜索此變量並加載前導文件並循環通過urlpatterns列表來搜索匹配的路徑。
  • TEMPLATES是允許呈現 HTML 文件以表示視圖的設置。 它與請求、身份驗證和消息應用程序進行通信。 'BACKEND'值和'APP_DIRS'設置為True使 Django 能夠在/templates文件夾中搜索 HTML 文件。 OPTIONS中的'context_processors'callables ,它將請求作為參數接收,並在呈現模板時將其與上下文合併,這些 callables 通常有助於調試、身份驗證和處理請求。
  • WSGI_APPLICATION是通向wsgi.py文件中application變量的路徑。
  • DATABASE是一個字典,它可以訪問外部數據庫(或在默認 sqlite 的情況下為內部數據庫),如 PostgresSQL、MySQL 和 MongoDB。 這是一個 Postgres 數據庫的示例,我將在我們的示例中使用:
 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'db_name', 'USER': 'db_user', 'PASSWORD': 'db_password', 'HOST': 'localhost', 'PORT': '', } }

您可以決定使用默認的 sqlite 數據庫,這對生產來說不是很好。 您可以像上面一樣設置 Postgres 數據庫,您必須先創建數據庫並將用戶、密碼和具有寫入權限的數據庫傳遞給數據庫。

注意就本教程而言,您可以使用默認的 sqlite 數據庫集。 以上是關於如何在 Django 中設置 SQL 和 NO-SQL 數據庫連接的演示。

  • AUTH_PASSWORD_VALIDATORS這些是用於密碼驗證的函數。 在創建用戶(以及管理員)記錄、重置和更改密碼時調用它們。 您可以從官方文檔中了解更多關於它們的信息。

可以在此處找到有關設置的更多文檔。

manage.py

大多數 Web 項目都需要一個命令開始的入口點。 充當應用程序網關的入口點。 在每個 Django 項目中,它通常是manage.py文件。

需要此文件作為應用程序的起點。 從這裡開始,所有命令都運行,一切都從這裡開始。

manage.py的功能與 django-admin 相同。 它還告訴 Django 您在應用程序中擁有的配置的位置。 這是默認設置的,不需要更改。

它使用def main()函數來處理我們的settings.py文件的默認設置模塊。 它嘗試導入執行函數,如果遇到錯誤,它會拋出ImportError 。 否則,它會接受sys.argv從命令行傳遞的任何參數並執行。

sys.argv是一個列表,它接收通過終端傳入的命令。 當我們在命令行中運行python manage.py runserver時, sys.argv被設置為["manage.py", "runserver"]並被傳遞給execute()函數。

python manage.py startapp tradingpython manage.py makemigrations等參數分別設置為[ "manage.py", "startapp", "trading"]["manage.py", "makemigrations"]以執行。

如果給定的命令設置為manage.py ,則 if 語句設置為運行。

除了運行django-admin功能之外,您還將在運行服務器、處理遷移和項目將使用的其他命令中使用它。 在部署、測試和調試項目時,您也將需要它。

模型佈局

Django 為您提供了一個簡單的建模佈局。 您在trading目錄的models.py文件中配置您的模型。 您的類(或模型)是您的數據庫表將遵循的佈局。

您可以根據要從每個表的用戶(或管理員)獲取的數據類型來定義類。 我們的模型創建了一個與settings.py中的DATABASE變量一起使用的遷移文件。

讓我們為產品和訂單創建兩個我們需要的模型:

 from django.db import models class Product(models.Model): name = models.CharField(max_length=50) image = models.ImageField(upload_to='products', default='python.png') price = models.IntegerField() description = models.TextField() def __str__(self): return self.name class Order(models.Model): product = models.ForeignKey(Product, on_delete=models.CASCADE) quantity = models.IntegerField() date = models.DateField(auto_now_add=True) user = models.CharField(max_length=50) def __str__(self): return self.user

產品模型具有名稱、價格、描述和圖像(保存時將上傳到products文件夾。如果該文件夾不存在,則會創建)列。 該order有一個product (鏈接到products表)、數量、日期和用戶列。

有了這些信息,Django 為應用程序創建了一個數據庫模式。 此外,創建一個 Python 數據庫訪問 API 來訪問 Product 和 Order 對象。 Django 有一個內置的遷移工具,因此您不必使用外部包進行遷移。

下一步是運行遷移命令並遷移到數據庫。 但在我們這樣做之前,我們必須在我們的項目目錄中將trading註冊為一個應用程序。

首先,我們必須將交易目錄配置為 Django 中的應用程序。 Django 在app.py文件中為您完成了這些工作。 該文件將trading註冊為應用程序,並將在settings.py文件中進一步使用。

現在,在settings.py添加trading INSTALLED_APP 。 它應該如下所示:

 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'trading.apps.TradingConf', ]

在終端上,運行:

 $ python manage.py makemigrations trading $ python manage.py migrate

注意:您的虛擬環境必須已激活,並且您應該在項目目錄中。

python manage.py makemigrations trading記錄交易模塊中所做的更改,並在模型models.pypython manage.py migrate中的更改的migration文件夾中創建一個文件,然後更新更改。

您可以在名為0001_initial.pymigration目錄中找到從python manage.py makemigrations trading命令生成的遷移文件。 您可以將類和列視為文件內的創建命令。 隨著對models.py的更多更改,這裡將生成更多文件。

管理員功能

在我們當前的應用程序中,我們需要管理功能來管理將在應用程序中創建的產品和訂單。 Django 為我們提供了一個內置的管理功能,供我們使用。 管理應用程序(功能)也已在我們的INSTALLED_APP列表中註冊; 'django.contrib.admin'

此外,admin 的 URL 也已在我們的 URL 配置文件urls.pyurlpatterns列表中註冊; path('admin/', admin.site.urls), admin.py文件使您可以註冊模型和要在模型上執行的 CRUD 操作。

要設置管理員,請在終端上運行:

 $ python manage.py createsuperuser

系統將提示您輸入用戶名、電子郵件和密碼。 之後,您已成功創建管理員。 要開始使用管理功能,請運行服務器:

 $ python manage.py runserver

訪問 https://127.0.0.1:8000/admin/ 將導致登錄會話,當您登錄(使用您創建的用戶名和密碼)時,您將被定向到管理儀表板:

這顯示了管理儀表板。
由 Django 提供的管理儀表板。 (大預覽)

組和用戶是允許管理員訪問用戶管理和權限的默認配置。 現在讓我們註冊我們的模型。

admin.py中,添加以下行:

 from django.contrib import admin # Register your models here. from .models import Product, Order admin.site.register(Product) admin.site.register(Order)

from django.contrib import admin從 Django 導入管理功能,然後我們從models.py導入這兩個類並註冊它們,以便管理員可以對產品執行 CRUD 操作並從儀表板訂購。

註冊模型後,您的儀表板應如下所示:

顯示帶有產品和訂單模型的管理儀表板。
管理儀表板上的產品和訂單模型。 (大預覽)

添加產品:

這顯示管理員向站點添加產品。
管理員將產品(鞋)添加到站點。 (大預覽)

從管理儀表板下訂單:

顯示管理員下訂單的圖像。
管理員添加/下訂單。 (大預覽)

輕鬆路由

每個站點都需要指向特定頁面的路由或 URL,並為最終用戶提供某些信息。 在特定路徑中訪問類似信息或應用程序的集合。 需要將路由組合在一起以實現文件內的可訪問性和通信。 Django 在urls.py文件中為您完成了這些工作。

urls.py是從settings.py中的ROOT_CONF變量引導的文件。 這是我們完成主要 URL 配置的地方。 當我們在不同的文件或文件夾中,甚至在urls.py文件中創建視圖時,它們必須在urlpatterns列表中進行配置。

Django 期望文件中有一個名為urlpatterns的列表。 您可以將ROOT_CONF變量中的文件更改為您放置urlpatterns列表的任何其他文件。

 urlpatterns = [ path('admin/', admin.site.urls), ]

該列表由作為pathre-path實例的對象組成。 每個實例都有兩個強制參數,模式'admin/'和一個視圖或 URL 文件admin.site.urls

這些實例也可能導致另一個具有更多 URL 配置的文件。 這樣做是為了可讀性。

views.py

後端應用程序的一個重要需求是每個路由映射到的視圖。 在 Django 中,您可以在views.py文件中為應用程序編寫基於函數或類的視圖。 視圖是處理請求並將響應發送回用戶的類或函數。

將您的views.py文件編輯為:

 from django.http import HttpResponse def home(request): return HttpResponse("This is a shopping site for products") def order(request): return HttpResponse("Hello, welcome to our store, browse to our products and order!")

這裡我們導入了HTTPResponse來定義兩個視圖(函數視圖)在調用時返回語句。 訪問主地址時應調用def home ,訪問訂單URL時應調用def order

創建視圖後,我們需要將其分配給不同的路由(或urlpatterns )。 這可以通過多種方式完成,我們可以在同一個文件中創建一個urlpatterns列表,或者我們可以將trading.views導入ecommerce_site.urls文件並創建路徑。

這樣做的首選方法是創建一個子 URL 配置文件(內部trading ),並將其包含在ecommerce_site.urls中。 在trading目錄中創建一個urls.py文件。 您的目錄應如下所示:

 trading/ __init__.py admin.py apps.py migrations/ __init__.py 0001_initial.py models.py tests.py urls.py views.py

將以下代碼添加到您的新文件 ( urls.py )

 from django.urls import path from . import views urlpatterns = [ path('', views.home, name='home'), path('order/', views.order, name='order'), ]

讓我們在項目 URLs 配置文件中註冊trading URL 配置文件( urls.py ),

 from django.contrib import admin from django.urls import include, path urlpatterns = [ path('admin/', admin.site.urls), path('', include('trading.urls')) ]

為了能夠訪問urlpatterns ,我們將在第 2 行中使用django.urls中的include類。然後選擇一個模式並將urls.py文件附加到交易目錄中。

我們在這裡所做的是從 django 導入path類和views.py文件。 然後我們的列表包含每個視圖的兩個路徑實例。 所以def home在 https://127.0.0.1:8000/ 上被調用。

當您訪問網站主頁時顯示的圖像。
訪問主頁時的站點。 (大預覽)

在 https://127.0.0.1:8000/order/ 上調用def order

當您訪問訂單 URL 時顯示網站。
訪問的訂單 URL。 (大預覽)

注意:運行startprojectstartapp的過程不是強制性的,但 Django 強烈鼓勵。 您可以在運行每個命令後創建/移動文件和文件夾以方便您的工作。

依賴樹

以下是 Django 處理來自 URL 的請求的過程:

  1. Django 在ROOT_CONF變量中搜索 URL 的根位置(路徑)。
  2. Django 加載提供的路徑中給出的 python 文件。 並找到urlpatterns變量,這是一個包含django.urls.path()和/或django.urls.re_path()的所有實例的列表。
  3. 在列表中,Django 按順序查找匹配的 URL。
  4. Python,導入和調用視圖(基於函數或基於類的視圖)。 通過 HTTP 請求進一步傳遞。
  5. 視圖處理傳遞的請求和信息,並返回消息/模板或重定向到另一個視圖。
  6. 如果沒有匹配的 URL 模式,或者在此過程中的任何時候引發異常,Django 調用適當的錯誤處理視圖。
顯示 Django 如何處理請求的樹。
Django 請求處理。 (大預覽)

結論

我們已經了解了在沒有命令行的情況下為 Django 創建文件的可能性。 我們還了解了 Django 項目的優勢和構建塊。 Django 是構建後端項目的一個了不起的工具,其目標是創造簡單性。

您可以在 GitHub 上查看本教程的代碼。

資源

  • Django中的密碼管理
  • Django:入門
  • Django:設置
  • O'Reilly 的輕量級 Django