揭秘 Django 的魔法
已發表: 2022-03-10根據官方文檔,
Django 是一個高級 Python Web 框架,它鼓勵快速開發和簡潔、實用的設計。 它由經驗豐富的開發人員構建,解決了 Web 開發的大部分麻煩,因此您可以專注於編寫應用程序,而無需重新發明輪子。 它是免費和開源的。
— DjangoProject.com
它是 Python 用於構建 Web 應用程序的流行框架之一,並且因其在創建具有規定配置和文件的樣板文件時的可伸縮性而最受歡迎。 這為開發人員總結了 Django 的全部目標;
“...在很短的時間內構建一個出色的應用程序,減少對基本設置的擔憂。”
無論您正在構建什麼,都有跨越所有 Web 應用程序的基本配置、文件和样式。 使用 Django 時,當您在應用程序開發週期的不同時間點運行某些命令時,會自動為您生成這些命令。 這樣,您將有足夠的時間專注於開發應用程序的核心方面,而 Django 會為您處理其他方面。
這意味著在引擎蓋下發生了很多事情。 對於沒有完全掌握運動部件的人來說,這可能是壓倒性的。 在本文中,我們將學習以下內容:
- Django的安裝
startproject
和startapp
命令- 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 使用的startproject
和startapp
命令旨在解決這個問題。 這兩個命令為您創建文件、文件夾並執行大量配置。
讓我們開始使用startproject
命令生成一個新應用程序。
腳手架應用程序
我們將生成我們的應用程序並查看生成的文件,以及我們將使用的一些命令。 在終端中運行此命令以開始;
django-admin startproject ecommerce_site
安裝 Django 時,將django-admin
添加到您的路徑中,以授予其執行操作的權限。 它是 Django 用於管理職責的命令行實用程序。 在這裡了解更多django-admin
使用; 這有點超出了本文的範圍。
startproject
是一個幫助生成項目的 Django 命令。 在這裡,我們將項目ecommerce_site的名稱傳遞給它。 然後它繼續在名為ecommerce_site的目錄中創建項目。 目錄應該是這樣的,
我們需要導航到新創建的目錄並運行命令來生成應用程序。
cd ecommerce_site python manage.py startapp trading
startapp
是項目目錄下manage.py
執行的命令,它會創建多個文件,以及一個以命令中指定的名稱命名的文件夾,在本例中,指定的是trading
。 app 文件夾包含創建應用程序功能所需的簡單文件。 現在你的目錄應該是這樣的:
如果您想知道項目和應用程序之間的區別。 一個項目是一個 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 trading
或python 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.py
和python manage.py migrate
中的更改的migration
文件夾中創建一個文件,然後更新更改。
您可以在名為0001_initial.py
的migration
目錄中找到從python manage.py makemigrations trading
命令生成的遷移文件。 您可以將類和列視為文件內的創建命令。 隨著對models.py
的更多更改,這裡將生成更多文件。
管理員功能
在我們當前的應用程序中,我們需要管理功能來管理將在應用程序中創建的產品和訂單。 Django 為我們提供了一個內置的管理功能,供我們使用。 管理應用程序(功能)也已在我們的INSTALLED_APP
列表中註冊; 'django.contrib.admin'
。
此外,admin 的 URL 也已在我們的 URL 配置文件urls.py
的urlpatterns
列表中註冊; path('admin/', admin.site.urls),
admin.py
文件使您可以註冊模型和要在模型上執行的 CRUD 操作。
要設置管理員,請在終端上運行:
$ python manage.py createsuperuser
系統將提示您輸入用戶名、電子郵件和密碼。 之後,您已成功創建管理員。 要開始使用管理功能,請運行服務器:
$ python manage.py runserver
訪問 https://127.0.0.1:8000/admin/ 將導致登錄會話,當您登錄(使用您創建的用戶名和密碼)時,您將被定向到管理儀表板:
組和用戶是允許管理員訪問用戶管理和權限的默認配置。 現在讓我們註冊我們的模型。
在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), ]
該列表由作為path
或re-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
。
注意:運行startproject
和startapp
的過程不是強制性的,但 Django 強烈鼓勵。 您可以在運行每個命令後創建/移動文件和文件夾以方便您的工作。
依賴樹
以下是 Django 處理來自 URL 的請求的過程:
- Django 在
ROOT_CONF
變量中搜索 URL 的根位置(路徑)。 - Django 加載提供的路徑中給出的 python 文件。 並找到
urlpatterns
變量,這是一個包含django.urls.path()
和/或django.urls.re_path()
的所有實例的列表。 - 在列表中,Django 按順序查找匹配的 URL。
- Python,導入和調用視圖(基於函數或基於類的視圖)。 通過 HTTP 請求進一步傳遞。
- 視圖處理傳遞的請求和信息,並返回消息/模板或重定向到另一個視圖。
- 如果沒有匹配的 URL 模式,或者在此過程中的任何時候引發異常,Django 調用適當的錯誤處理視圖。
結論
我們已經了解了在沒有命令行的情況下為 Django 創建文件的可能性。 我們還了解了 Django 項目的優勢和構建塊。 Django 是構建後端項目的一個了不起的工具,其目標是創造簡單性。
您可以在 GitHub 上查看本教程的代碼。
資源
- Django中的密碼管理
- Django:入門
- Django:設置
- O'Reilly 的輕量級 Django