天天看點

python django動靜分離原理及應用

#頭條創作挑戰賽#

python django動靜分離原理及應用

當使用 Django 進行動靜分離時,以下是示例,分别說明靜态檔案和動态内容的處理方式:

靜态檔案處理:

  • 将靜态檔案存儲在 Django 項目的 static 目錄中。
  • 在 Nginx 配置檔案中,使用 alias 指令将 /static/ URL 映射到靜态檔案目錄的絕對路徑。
  • 當使用者通路 /static/css/style.css 時,Nginx 将直接傳回位于靜态檔案目錄中的 style.css 檔案。

示例:

# settings.py
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')

# urls.py
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ...其他 URL 配置...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)           

動态内容處理:

  • 定義一個 Django 視圖,例如 index 視圖,用于處理動态内容的請求。
  • 在 Nginx 配置檔案中,使用 proxy_pass 指令将對 / URL 的請求轉發到運作在本地的 Django 應用程式。例如:proxy_pass http://localhost:8000;
  • 當使用者通路網站的根目錄時,Nginx 将轉發請求給 Django 應用程式,由 index 視圖生成并傳回動态内容的 HTML 響應。
# views.py
from django.shortcuts import render

def index(request):
    # 處理動态内容請求的視圖邏輯
    return render(request, 'index.html', context)

# urls.py
urlpatterns = [
    path('', views.index, name='index'),
    # ...其他 URL 配置...
]           

靜态檔案緩存:

  • 在 Nginx 配置檔案中,使用 expires 指令設定靜态檔案的過期時間,以便浏覽器可以緩存這些檔案。例如:expires 7d;
  • 當使用者再次請求相同的靜态檔案時,浏覽器将根據過期時間判斷是否使用緩存副本,進而減少對伺服器的請求。
# views.py
from django.views.decorators.cache import cache_page

@cache_page(60 * 15)  # 緩存 15 分鐘
def index(request):
    # 處理動态内容請求的視圖邏輯
    return render(request, 'index.html', context)           

動态内容緩存:

  • 使用第三方緩存服務(如 Memcached 或 Redis)來緩存動态内容。
  • 在 Django 視圖中,使用緩存裝飾器(如 @cache_page)來設定動态内容的緩存時間。例如:@cache_page(60 * 15) 表示緩存 15 分鐘。
  • 當使用者請求動态内容時,Django 将首先檢查緩存,如果存在緩存副本,則直接傳回緩存的響應,而不必再次生成。
# views.py
from django.core.cache import cache

def index(request):
    # 檢查緩存
    cached_data = cache.get('index_data')
    if cached_data:
        return cached_data

    # 處理動态内容請求的視圖邏輯
    data = generate_dynamic_data()
    cache.set('index_data', data, 60 * 15)  # 緩存 15 分鐘
    return render(request, 'index.html', data)           

使用 CDN 分發靜态檔案:

  • 使用内容分發網絡(CDN)來提供靜态檔案,以加快檔案傳輸速度。
  • 在 Nginx 配置檔案中,将 /static/ URL 映射到 CDN 提供的靜态檔案位址。例如:proxy_pass https://cdn.example.com/static/;
  • 當使用者請求靜态檔案時,Nginx 将将請求轉發到 CDN,并由 CDN 伺服器提供靜态檔案,而不必經過 Django 應用程式。

這些示例展示了不同的處理方式,以實作 Django 動靜分離。具體的配置和實作可能因項目需求和環境而有所不同。

# settings.py
STATIC_URL = 'https://cdn.example.com/static/'

# urls.py
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ...其他 URL 配置...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)