在Python Web開發領域,Django框架的地位猶如璀璨的明星,其全面、高效和安全的特性使其在全球範圍內廣受歡迎。本文將全面解析Django框架的預設檔案,並深入探討每個檔案及其組成的意義和用途,透徹展示這個強大框架的檔案結構和設計原理。
首先,讓我們看一下建立一個新的Django專案後的目錄結構:
myproject/
manage.py
myproject/
__init__.py
settings.py
urls.py
asgi.py
wsgi.py
manage.py
:這是Django專案的命令列工具,可以用於執行許多與專案管理和開發相關的任務,如執行伺服器、執行測試、建立資料庫模式等。
myproject/__init__.py
:這是一個空檔案,用於告訴Python直譯器該目錄是一個Python包。
myproject/settings.py
:這個檔案包含所有的專案設定。每個Django專案都有其自己的設定,你可以在這裡設定資料庫、應用、中介軟體、模板、快取等。
myproject/urls.py
:這個檔案定義了專案的URL路由。通過編寫URL模式和對應的檢視函數,Django可以將HTTP請求路由到適當的檢視。
myproject/asgi.py
和myproject/wsgi.py
:這兩個檔案是用於設定伺服器的,WSGI是Python的Web伺服器閘道器介面,ASGI是非同步伺服器閘道器介面,用於處理非同步請求。
在Django的專案結構中,manage.py
扮演著非常重要的角色。它是一個命令列工具,可以讓你以各種方式與Django專案進行互動。讓我們深入地探索一下這個檔案以及其主要的用法。
首先,當我們建立一個新的Django專案時,Django會自動建立一個manage.py
檔案。它位於專案的根目錄下,其主要目的是作為一個命令列實用工具,它封裝了django-admin.py
的功能,還包含了針對該專案的一些額外的命令。
讓我們看一下一個典型的manage.py
檔案內容:
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()
我們可以看到,在manage.py
檔案中,Django的設定模組被定義為環境變數DJANGO_SETTINGS_MODULE
,預設值為'myproject.settings'。接著,它嘗試從django.core.management
中匯入execute_from_command_line
,這個函數是用來執行命令列管理任務的。
讓我們來看幾個manage.py
的常見用法:
執行開發伺服器:在本地開發時,我們經常需要執行Django自帶的開發伺服器。你可以使用runserver
命令來做到這一點:
python manage.py runserver
這將啟動開發伺服器,預設在127.0.0.1:8000
。你可以在瀏覽器存取這個地址來檢視你的網站。
資料庫遷移:Django有一個非常強大的資料庫抽象API,它可以處理很多資料庫相關的任務。例如,當我們更改了模型(models)後,我們需要將這些更改應用到資料庫,這就需要進行資料庫遷移。以下是如何使用manage.py
來做這件事:
python manage.py makemigrations # 建立遷移檔案
python manage.py migrate # 應用遷移至資料庫
建立超級使用者:在我們需要存取Django的管理後臺時,我們需要建立一個超級使用者。我們可以通過以下命令來完成:
python manage.py createsuperuser
Django Shell:manage.py
還提供了一個互動式的Python shell,但這個shell是在Django的環境中執行的。這意味著你可以在這個shell中匯入你的模型、檢視、設定等,這對於測試和偵錯非常有用:
python manage.py shell
在Django的日常使用中,manage.py
是一個非常重要的工具。它使得與Django專案的互動變得非常簡單,並封裝了許多常見任務。學會使用manage.py
,你的Django開發將會更加輕鬆。
在Python中,__init__.py
檔案有著重要的地位,它的存在讓Python將資料夾識別為一個包(package)。這個概念在Python的模組化程式設計中尤為重要,它使得我們可以將程式碼組織得更加結構化,並提供了更好的名稱空間管理。現在,讓我們深入探索一下__init__.py
的作用和用法。
首先,我們來看一下最簡單的__init__.py
檔案,即一個空檔案。在一個Python專案中,你可能會看到很多這樣的檔案。它們位於包的目錄下,並且名為__init__.py
。
# mypackage/__init__.py
這個空檔案的存在意味著Python直譯器將把它所在的目錄視為包(package),而這個包可以包含其他的模組(module)或者子包(subpackage)。例如,如果我們有以下的專案結構:
mypackage/
__init__.py
module1.py
module2.py
在這種情況下,我們可以這樣匯入模組:
from mypackage import module1, module2
除了將資料夾標記為包之外,__init__.py
還有其他一些重要的用途。一般來說,__init__.py
用於存放包級別的初始化程式碼或者定義便於匯入的別名。例如,我們可以在__init__.py
中匯入我們的模組,這樣在匯入包時就可以直接使用這些模組:
# mypackage/__init__.py
from . import module1, module2
然後,我們可以直接匯入包,而不需要單獨匯入模組:
import mypackage
# 我們可以直接使用mypackage.module1,而不需要單獨匯入module1
mypackage.module1.some_function()
還有,__init__.py
可以用來定義__all__
變數。__all__
變數是一個字串列表,它定義了當從包中匯入*時,哪些模組會被匯入。
# mypackage/__init__.py
__all__ = ['module1', 'module2']
現在,當我們這樣匯入時:
from mypackage import *
只有module1
和module2
會被匯入,其他的模組則不會。
總的來說,__init__.py
是Python包結構的關鍵部分,它使得我們可以更好地組織和管理我們的程式碼。理解它的工作原理和用法,可以幫助我們編寫更加模組化和可維護的程式碼。
Django框架是以模組化和靈活性著稱的Web框架,許多方面都是可設定的,而這些設定都集中在settings.py
檔案中。在一個Django專案中,settings.py
檔案是至關重要的,它包含了專案執行所需的全部設定資訊。現在,讓我們深入探索一下這個檔案以及其主要的用法。
一個新建的Django專案的settings.py
檔案包含了許多預設設定,這些預設設定適應了大多數情況,但你完全可以根據你的需求來修改這些設定。以下是一些最重要的設定項:
DEBUG:這個設定告訴Django是否執行在偵錯模式。在開發環境中,我們通常將其設定為True,這樣當出錯時,Django會顯示詳細的錯誤資訊。然而在生產環境中,我們應該將其設定為False。
DEBUG = True
INSTALLED_APPS:這個設定定義了專案中所有的應用。每個應用都是一個Python包,包含了一些檢視、模型、模板等。當我們建立新的應用或者安裝第三方應用時,都應該將應用新增到這個列表。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# Add your apps here
'myapp',
]
MIDDLEWARE:這個設定定義了一系列的中介軟體類,這些類在處理請求和響應時起到了重要的作用。你可以新增自己的中介軟體,或者修改這個列表的順序來改變中介軟體的執行順序。
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',
]
DATABASES:這個設定定義了你的資料庫設定。Django使用ORM(物件關係對映)來處理資料庫操作,你可以使用任何Django支援的資料庫後端,例如SQLite、PostgreSQL、MySQL等。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'db.sqlite3',
}
}
TEMPLATES:這個設定定義了Django的模板設定,包括模板的位置、模板引擎等。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
...
},
]
STATIC_URL
定義了靜態檔案的URL字首,STATIC_ROOT
定義了靜態檔案的存放位置。STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
以上只是settings.py
檔案中一些基本的設定,實際上這個檔案中有更多的設定項,你可以根據你的需求來調整這些設定。理解settings.py
檔案的工作原理和用法,是掌握Django的關鍵步驟。
在Django的Web框架中,urls.py
檔案是非常關鍵的一部分,它負責URL路由的設定,確保使用者請求的URL能夠被正確地對映到相應的檢視函數或者類。在這篇文章中,我們將深入探討urls.py
檔案的結構和用法。
在一個新建的Django專案中,urls.py
檔案位於專案根目錄下。這個檔案包含一個名為urlpatterns
的列表,列表中的每一項都是一個path()
或re_path()
函數的呼叫,這個函數呼叫定義了一個URL模式和一個檢視的對映關係。
以下是一個簡單的urls.py
檔案:
from django.urls import path
from . import views
urlpatterns = [
path('admin/', admin.site.urls),
path('hello/', views.hello_world),
]
在這個檔案中,我們首先從django.urls
模組匯入了path()
函數,然後定義了urlpatterns
列表。這個列表包含了兩個URL模式,第一個模式是'admin/'
,它被對映到了Django的自帶的admin檢視;第二個模式是'hello/'
,它被對映到了我們自己定義的hello_world
檢視。
path()
函數接受兩個必選引數,第一個是URL模式字串,第二個是檢視函數或類。它還可以接受一個可選的第三個引數,這個引數是一個字典,可以用來為檢視傳遞額外的引數。
除了path()
函數,django.urls
模組還提供了re_path()
函數,這個函數允許我們使用正規表示式來定義URL模式。例如,下面的程式碼定義了一個匹配任意數位的URL模式:
from django.urls import re_path
from . import views
urlpatterns = [
re_path(r'^articles/(?P<year>[0-9]{4})/$', views.year_archive),
]
在這個例子中,URL模式字串是一個正規表示式,(?P<year>[0-9]{4})
表示匹配四位數位,並將其命名為year
。在檢視函數year_archive
中,我們可以通過year
引數來獲取這個值。
urls.py
檔案是Django專案中的重要組成部分,它將使用者請求的URL對映到相應的檢視,以此來處理使用者的請求。理解它的工作原理和用法,可以幫助我們更好地使用Django框架來構建Web應用。
ASGI,全稱Asynchronous Server Gateway Interface,是一個用於構建非同步Web應用的Python標準介面。從Django 3.0開始,Django開始支援ASGI,這使得我們可以在Django中使用非同步程式設計,提升Web應用的效能。在一個Django專案中,asgi.py
檔案是ASGI的組態檔,它定義了ASGI應用,並設定了中介軟體和路由。現在,讓我們深入瞭解一下asgi.py
檔案以及其主要的用法。
首先,我們來看一下一個新建立的Django專案中的asgi.py
檔案:
"""
ASGI config for myproject project.
It exposes the ASGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/howto/deployment/asgi/
"""
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
application = get_asgi_application()
在這個檔案中,我們首先設定了環境變數DJANGO_SETTINGS_MODULE
,這個變數告訴Django應該使用哪個設定檔案。然後,我們呼叫get_asgi_application()
函數來獲取一個ASGI應用,並將其賦值給application
變數。這個application
變數是ASGI伺服器介面的入口點,ASGI伺服器將使用這個變數來啟動我們的Django應用。
這個基本的asgi.py
檔案已經足夠讓我們的Django應用執行在一個ASGI伺服器上了,比如Daphne或Uvicorn。然而,ASGI的真正威力在於它的非同步特性。我們可以通過新增非同步中介軟體和路由來利用這一特性。
例如,我們可以新增一個非同步中介軟體來處理Websocket連線:
from channels.routing import ProtocolTypeRouter, URLRouter
from channels.auth import AuthMiddlewareStack
import myapp.routing
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
application = ProtocolTypeRouter({
"http": get_asgi_application(),
"websocket": AuthMiddlewareStack(
URLRouter(
myapp.routing.websocket_urlpatterns
)
),
})
在這個例子中,我們建立了一個ProtocolTypeRouter
範例,它可以根據協定型別來路由請求。對於HTTP請求,我們使用了原來的Django應用;對於Websocket請求,我們使用了一箇中介軟體棧和一個URL路由。AuthMiddlewareStack
是一個提供認證功能的中介軟體,URLRouter
則用來路由Websocket請求。
總的來說,asgi.py
檔案是Django非同步程式設計的入口點,它提供了設定ASGI應用的方法,包括新增中介軟體和路由。理解它的工作原理和用法,可以幫助我們在Django中更好地使用非同步程式設計,提升Web應用的效能。
WSGI,即Web Server Gateway Interface,是Python應用與Web伺服器之間的一個通用介面。在Django中,wsgi.py
檔案是WSGI介面的組態檔,它使得Web伺服器能夠與Django應用進行互動。在這篇文章中,我們將深入探討wsgi.py
檔案的結構和用法。
在一個新建的Django專案中,wsgi.py
檔案位於專案根目錄下。它主要包含兩部分:設定環境變數DJANGO_SETTINGS_MODULE
以及定義WSGI應用。以下是wsgi.py
檔案的一個典型範例:
"""
WSGI config for mysite project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
application = get_wsgi_application()
在這個檔案中,os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'mysite.settings')
這行程式碼設定了環境變數DJANGO_SETTINGS_MODULE
,這告訴Django應該使用哪個settings.py檔案。
而application = get_wsgi_application()
這行程式碼定義了一個WSGI應用。get_wsgi_application()
函數返回一個WSGI應用,這個應用可以處理HTTP請求並生成HTTP響應。在這裡,application
是一個全域性變數,它是WSGI伺服器介面的入口點。
然後,你可以使用一個WSGI伺服器來執行你的Django應用。例如,使用Gunicorn,你可以在命令列中輸入以下命令:
gunicorn mysite.wsgi
這個命令會啟動一個Gunicorn伺服器,並載入mysite.wsgi
模組中的application
變數作為WSGI應用。
總的來說,wsgi.py
檔案是一個重要的Django組態檔,它定義了Django應用與WSGI伺服器的介面。通過理解這個檔案的工作原理,我們可以更好地理解Django應用是如何執行的,以及如何部署Django應用。
如有幫助,請多關注
個人微信公眾號:【Python全視角】
TeahLead_KrisChang,10+年的網際網路和人工智慧從業經驗,10年+技術和業務團隊管理經驗,同濟軟體工程本科,復旦工程管理碩士,阿里雲認證雲服務資深架構師,上億營收AI產品業務負責人。