#頭條創作挑戰賽#
當使用 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)