Django容易被遺忘卻無比重要的框架預設檔案介紹及使用方法

2023-07-07 12:00:47

在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.pymyproject/wsgi.py:這兩個檔案是用於設定伺服器的,WSGI是Python的Web伺服器閘道器介面,ASGI是非同步伺服器閘道器介面,用於處理非同步請求。

manage.py

在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 Shellmanage.py還提供了一個互動式的Python shell,但這個shell是在Django的環境中執行的。這意味著你可以在這個shell中匯入你的模型、檢視、設定等,這對於測試和偵錯非常有用:

python manage.py shell

在Django的日常使用中,manage.py是一個非常重要的工具。它使得與Django專案的互動變得非常簡單,並封裝了許多常見任務。學會使用manage.py,你的Django開發將會更加輕鬆。

init.py

在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 *

只有module1module2會被匯入,其他的模組則不會。

總的來說,__init__.py是Python包結構的關鍵部分,它使得我們可以更好地組織和管理我們的程式碼。理解它的工作原理和用法,可以幫助我們編寫更加模組化和可維護的程式碼。

settings.py

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,
        ...
    },
]
  1. STATIC_URLSTATIC_ROOT:這兩個設定用來設定靜態檔案的處理方式。STATIC_URL定義了靜態檔案的URL字首,STATIC_ROOT定義了靜態檔案的存放位置。
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

以上只是settings.py檔案中一些基本的設定,實際上這個檔案中有更多的設定項,你可以根據你的需求來調整這些設定。理解settings.py檔案的工作原理和用法,是掌握Django的關鍵步驟。

urls.py

在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.py

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.py

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產品業務負責人。