每天40分玩转Django:Django静态文件

Django静态文件

一、今日学习内容概述

学习模块重要程度主要内容
静态文件配置⭐⭐⭐⭐⭐基础设置、路径配置
CDN集成⭐⭐⭐⭐⭐CDN配置、资源优化
静态文件处理⭐⭐⭐⭐压缩、版本控制
部署优化⭐⭐⭐⭐性能优化、缓存策略

二、基础配置

# settings.py
import os

# 静态文件配置
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'static'),
]

# 静态文件查找器
STATICFILES_FINDERS = [
    'django.contrib.staticfiles.finders.FileSystemFinder',
    'django.contrib.staticfiles.finders.AppDirectoriesFinder',
]

# CDN 配置
CDN_DOMAIN = 'https://cdn.example.com'
USE_CDN = True

# 压缩配置
STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.ManifestStaticFilesStorage'

三、项目结构示例

myproject/
├── manage.py
├── myproject/
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── static/
│   ├── css/
│   │   ├── main.css
│   │   └── vendor/
│   ├── js/
│   │   ├── main.js
│   │   └── vendor/
│   └── images/
└── templates/
    ├── base.html
    └── includes/

四、静态文件管理器

# storage.py
from django.contrib.staticfiles.storage import StaticFilesStorage
from django.conf import settings
import os
import hashlib

class CustomStaticStorage(StaticFilesStorage):
    """自定义静态文件存储"""
    
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.prefix = settings.STATIC_URL.rstrip('/')
        
    def url(self, name):
        """生成文件URL"""
        url = super().url(name)
        
        if settings.USE_CDN:
            return f"{settings.CDN_DOMAIN}{url}"
        return url
    
    def hashed_name(self, name, content=None, filename=None):
        """生成带哈希值的文件名"""
        if content is None:
            return name
            
        md5 = hashlib.md5()
        for chunk in content.chunks():
            md5.update(chunk)
            
        hash_value = md5.hexdigest()[:12]
        
        name_parts = name.split('.')
        name_parts.insert(-1, hash_value)
        return '.'.join(name_parts)

五、模板使用示例

<!-- templates/base.html -->
{% load static %}
<!DOCTYPE html>
<html>
<head>
    <title>{% block title %}{% endblock %}</title>
    <!-- CSS 文件 -->
    <link rel="stylesheet" href="{% static 'css/vendor/bootstrap.min.css' %}">
    <link rel="stylesheet" href="{% static 'css/main.css' %}">
    
    <!-- 自定义CDN引用 -->
    {% if settings.USE_CDN %}
        <link rel="preconnect" href="{{ settings.CDN_DOMAIN }}">
    {% endif %}
</head>
<body>
    <nav class="navbar">
        <img src="{% static 'images/logo.png' %}" alt="Logo">
        <!-- 导航内容 -->
    </nav>
    
    <main>
        {% block content %}{% endblock %}
    </main>
    
    <!-- JavaScript 文件 -->
    <script src="{% static 'js/vendor/jquery.min.js' %}"></script>
    <script src="{% static 'js/vendor/bootstrap.bundle.min.js' %}"></script>
    <script src="{% static 'js/main.js' %}"></script>
</body>
</html>

六、静态文件处理流程图

在这里插入图片描述

七、CDN配置和优化

# cdn.py
from django.core.files.storage import get_storage_class
from django.conf import settings
import requests

class CDNStorage:
    """CDN存储管理器"""
    
    def __init__(self):
        self.storage = get_storage_class()()
        self.cdn_domain = settings.CDN_DOMAIN
        
    def sync_file(self, path):
        """同步文件到CDN"""
        try:
            with self.storage.open(path) as f:
                response = requests.put(
                    f"{self.cdn_domain}/{path}",
                    data=f.read(),
                    headers={
                        'Content-Type': self.storage.mime_type(path),
                        'Cache-Control': 'public, max-age=31536000'
                    }
                )
                return response.status_code == 200
        except Exception as e:
            print(f"CDN同步失败: {str(e)}")
            return False
    
    def purge_file(self, path):
        """清除CDN缓存"""
        try:
            response = requests.delete(
                f"{self.cdn_domain}/purge/{path}",
                headers={'Authorization': f'Bearer {settings.CDN_API_KEY}'}
            )
            return response.status_code == 200
        except Exception as e:
            print(f"缓存清除失败: {str(e)}")
            return False

八、静态文件压缩

# compressor.py
from django.contrib.staticfiles.storage import CompressedManifestStaticFilesStorage
import subprocess

class CustomCompressedStorage(CompressedManifestStaticFilesStorage):
    """自定义压缩存储"""
    
    def post_process(self, paths, dry_run=False, **options):
        """处理文件后进行压缩"""
        for path in paths:
            if path.endswith(('.css', '.js')):
                full_path = self.path(path)
                
                # CSS压缩
                if path.endswith('.css'):
                    subprocess.run(['cleancss', '-o', full_path, full_path])
                
                # JS压缩
                if path.endswith('.js'):
                    subprocess.run(['uglifyjs', full_path, '-o', full_path])
                
        return super().post_process(paths, dry_run, **options)

# 压缩命令
from django.core.management.base import BaseCommand

class Command(BaseCommand):
    help = '压缩静态文件'
    
    def handle(self, *args, **options):
        storage = CustomCompressedStorage()
        storage.collect()

九、性能优化建议

  1. 文件合并
# utils.py
def combine_files(file_list, output_path):
    """合并多个文件"""
    with open(output_path, 'wb') as output:
        for file_path in file_list:
            with open(file_path, 'rb') as input_file:
                output.write(input_file.read())
                output.write(b'\n')
  1. 缓存配置
# settings.py
CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
    }
}

# 静态文件缓存设置
STATICFILES_CACHE_TIMEOUT = 60 * 60 * 24 * 30  # 30天
  1. 图片优化
# image_optimizer.py
from PIL import Image
import os

def optimize_image(input_path, output_path=None, quality=85):
    """优化图片质量和大小"""
    if output_path is None:
        output_path = input_path
        
    with Image.open(input_path) as img:
        # 保存优化后的图片
        img.save(
            output_path,
            quality=quality,
            optimize=True
        )
  1. 版本控制
# context_processors.py
from django.conf import settings

def static_version(request):
    """添加静态文件版本号"""
    return {
        'STATIC_VERSION': getattr(settings, 'STATIC_VERSION', '1.0.0')
    }

十、部署注意事项

  1. 收集静态文件
python manage.py collectstatic --noinput
  1. Nginx配置
# 静态文件服务
location /static/ {
    alias /path/to/staticfiles/;
    expires 30d;
    add_header Cache-Control "public, no-transform";
}
  1. 监控和日志
# middleware.py
class StaticFileMonitorMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        
    def __call__(self, request):
        if request.path.startswith(settings.STATIC_URL):
            # 记录静态文件访问
            logger.info(f"Static file accessed: {request.path}")
        return self.get_response(request)

通过本章学习,你应该能够:

  1. 配置Django静态文件系统
  2. 集成和使用CDN
  3. 实现静态文件优化
  4. 管理文件版本和缓存

怎么样今天的内容还满意吗?再次感谢朋友们的观看,关注GZH:凡人的AI工具箱,回复666,送您价值199的AI大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/942962.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

改进爬山算法之一:随机化爬山法(Stochastic Hill Climbing,SHC)

随机化爬山法(Stochastic Hill Climbing),也被称为随机爬山法,是一种基于搜索算法的优化方法,是爬山算法的一个变种,它通过引入随机性来减少算法陷入局部最优解的风险,并增加搜索解空间的能力。这种方法特别适合于解决那些具有多个局部最优解的优化问题。 一、算法思想 …

农家乐系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…

探究音频丢字位置和丢字时间对pesq分数的影响

丢字的本质 丢字的本质是在一段音频中一小段数据变为0 丢字对主观感受的影响 1. 丢字位置 丢字的位置对感知效果有很大影响。如果丢字发生在音频信号的静音部分或低能量部分&#xff0c;感知可能不明显&#xff1b;而如果丢字发生在高能量部分或关键音素上&#xff0c;感知…

《Java源力物语》-3.空值猎手

~犬&#x1f4f0;余~ “我欲贱而贵&#xff0c;愚而智&#xff0c;贫而富&#xff0c;可乎&#xff1f; 曰&#xff1a;其唯学乎” \quad 夜色渐深&#xff0c;在一处偏僻小径上&#xff0c;月光透过浓密的源力云层&#xff0c;在地面上投下斑驳的光影。String正独自练习着刚从…

产品初探Devops!以及AI如何赋能Devops?

DevOps源自Development&#xff08;开发&#xff09;和Operations&#xff08;运维&#xff09;的组合&#xff0c;是一种新的软件工程理念&#xff0c;旨在打破传统软件工程方法中“开发->测试->运维”的割裂模式&#xff0c;强调端到端高效一致的交付流程&#xff0c;实…

使用 OpenCV 在图像中添加文字

在图像处理任务中&#xff0c;我们经常需要将文本添加到图像中。OpenCV 提供了 cv2.putText() 函数&#xff0c;可以很方便地在图像上绘制文本&#xff0c;支持多种字体、颜色、大小和位置等参数。 本文将详细介绍如何使用 OpenCV 在图像中添加文字&#xff0c;介绍 cv2.putTe…

接口测试Day-02-安装postman项目推送Gitee仓库

postman安装 下载 Postman&#xff08;已提供安装包&#xff0c;此步可以跳过&#xff09; https://www.postman.com/downloads/安装 Postman 安装Postman插件newman 要想给 postman 安装 newman 插件&#xff0c;必须 先 安装 node.js。 这是前提&#xff01; 安装node.js 可能…

MySQL索引为什么是B+树

MySQL索引为什么是B树 索引是帮助MySQL高效获取数据的数据结构&#xff0c;在数据之外&#xff0c;数据库还维护着满足特定查找算法的数据结构B树&#xff0c;这些数据结果以某种特定的方式引用数据&#xff0c;这样就可以在这些数据结构上实现高级查找算法&#xff0c;提升数据…

C#实现图像骨架化(ZhangSuen细化算法)

原始图像: 骨架化后图像: 需要安装一个NuGet包:System.Drawing.Common 代码如下: using System.Drawing; using System.Drawing.Imaging;public class Image {public int Width { get; }public int Height { get; }private bool[,] pixels;// 构造函数,初始化图像的宽度…

【无标题】学生信息管理系统界面

网页是vue框架&#xff0c;后端直接python写的没使用框架

Flow Field——流场寻路算法

目的 一群物体到达某个目的地时&#xff0c;需要对这些海量单位做寻路和避障&#xff0c;类似塔防类游戏的怪物步行到终点的过程。 参考视频&#xff1a;https://www.bilibili.com/video/BV12bzZY2EfA 演示动画&#xff1a;https://howtorts.github.io/examples/4-basic-flow-f…

Bash 脚本教程

注&#xff1a;本文为 “Bash 脚本编写” 相关文章合辑。 BASH 脚本编写教程 as good as well于 2017-08-04 22:04:28 发布 这里有个老 American 写的 BASH 脚本编写教程&#xff0c;非常不错&#xff0c;至少没接触过 BASH 的也能看懂&#xff01; 建立一个脚本 Linux 中有…

区块链期末复习3.2:比特币脚本

目录 一、输入输出脚本的执行 二、简单脚本实例及压栈过程 1.P2PK&#xff08;pay to public key hash&#xff09; 2、P2PH&#xff08;pay to public key hash&#xff09; 3.多重签名 4.比特币脚本的应用&#xff1a; 三、其他常见指令 1.OP_EQUAL与OP&#xff3f;EQ…

2024大模型在软件开发中的具体应用有哪些?(附实践资料合集)

大模型在软件开发中的具体应用非常广泛&#xff0c;以下是一些主要的应用领域&#xff1a; 自动化代码生成与智能编程助手&#xff1a; AI大模型能够根据开发者的自然语言描述自动生成代码&#xff0c;减少手动编写代码的工作量。例如&#xff0c;GitHub Copilot工具就是利用AI…

【数据可视化复习方向】

1.数据可视化就是数据中信息的可视化 2.数据可视化主要从数据中寻找三个方面的信息&#xff1a;模式、关系和异常 3.大数据可视化分类&#xff1a;科学可视化、信息可视化、可视分析学 4.大数据可视化作用&#xff1a;记录信息、分析推理、信息传播与协同 5.可视化流程&…

Python 多进程编程详解

目录 一、多进程编程简介 1. 什么是多进程 2. 多进程与多线程的区别 二、Python 中的多进程编程 1. 创建进程 2. 进程间通信 3. 进程池 4. 进程同步 5. 注意事项 三、实际应用案例 四、总结 在 Python 中&#xff0c;多进程编程是一种提高程序运行效率的有效手段。相…

Redis篇--应用篇1--会话存储(session共享)

1、概述 实现Session共享是构建分布式Web应用时的一个重要需求&#xff0c;尤其是在水平扩展和高可用性要求较高的场景下。 在分布式服务或集群服务中往往会出现这样一个问题&#xff1a;用户登录A服务后可以正常访问A服务中的接口。但是我们知道&#xff0c;分布式服务通常都…

ip-协议

文章目录 1. 网络层2. ip协议2.1 ip协议格式2.2 网段划分基本概念网段划分的两种方式为什么要网段划分&#xff1f;特殊的IP地址IP地址数量不足 2.3 私有IP与公网IP2.4 路由 3. IP的分片与组装为什么要分片与组装&#xff1f;如何分片&#xff1f;如何组装&#xff1f; 1. 网络…

ECharts散点图-气泡图,附视频讲解与代码下载

引言&#xff1a; ECharts散点图是一种常见的数据可视化图表类型&#xff0c;它通过在二维坐标系或其它坐标系中绘制散乱的点来展示数据之间的关系。本文将详细介绍如何使用ECharts库实现一个散点图&#xff0c;包括图表效果预览、视频讲解及代码下载&#xff0c;让你轻松掌握…

Jmeter录制https请求

jmeter 5.5版本&#xff0c;chrome浏览器 1、首先添加Test Plan-Thread Group-HTTP(S) Test Script Recorder 2、设置HTTP(S) Test Script Recorder界面的Port&#xff08;监听端口&#xff0c;设置浏览器代理时需要与这里保持一致&#xff09;、HTPS Domains&#xff08;录制…