天天看点

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)