当前位置: 首页 > news >正文

每天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 hashlibclass 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 urldef hashed_name(self, name, content=None, filename=None):"""生成带哈希值的文件名"""if content is None:return namemd5 = 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 requestsclass CDNStorage:"""CDN存储管理器"""def __init__(self):self.storage = get_storage_class()()self.cdn_domain = settings.CDN_DOMAINdef 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 == 200except Exception as e:print(f"CDN同步失败: {str(e)}")return Falsedef 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 == 200except Exception as e:print(f"缓存清除失败: {str(e)}")return False

八、静态文件压缩

# compressor.py
from django.contrib.staticfiles.storage import CompressedManifestStaticFilesStorage
import subprocessclass 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 BaseCommandclass 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 osdef optimize_image(input_path, output_path=None, quality=85):"""优化图片质量和大小"""if output_path is None:output_path = input_pathwith Image.open(input_path) as img:# 保存优化后的图片img.save(output_path,quality=quality,optimize=True)
  1. 版本控制
# context_processors.py
from django.conf import settingsdef 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_responsedef __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大礼包。最后,祝您早日实现财务自由,还请给个赞,谢谢!

相关文章:

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

Django静态文件 一、今日学习内容概述 学习模块重要程度主要内容静态文件配置⭐⭐⭐⭐⭐基础设置、路径配置CDN集成⭐⭐⭐⭐⭐CDN配置、资源优化静态文件处理⭐⭐⭐⭐压缩、版本控制部署优化⭐⭐⭐⭐性能优化、缓存策略 二、基础配置 # settings.py import os# 静态文件配置…...

Linux 线程池

1.概念介绍 线程池是一种多线程处理形式&#xff0c;它维护着多个线程&#xff0c;这些线程处于等待状态&#xff0c;随时准备接受任务并执行。线程池的主要目的是为了提高系统的性能和资源利用率&#xff0c;避免在处理短时间任务时频繁创建和销毁线程所带来的开销。 线程池…...

windows使用zip包安装MySQL

windows通过zip包安装MySQL windows通过zip包安装MySQL下载MySQL的zip安装包创建安装目录和数据目录解压zip安装包创建配置目录 etc 和 配置文件 my.ini安装MySQL进入解压后的bin目录执行命令初始化执行命令安装 验证安装查看服务已安装 启动MySQL查看服务运行情况修改密码创建…...

深度学习实战之超分辨率算法(tensorflow)——ESPCN

espcn原理算法请参考上一篇论文&#xff0c;这里主要给实现。 数据集如下&#xff1a;尺寸相等即可 针对数据集&#xff0c;生成样本代码preeate_data.py import imageio from scipy import misc, ndimage import numpy as np import imghdr import shutil import os import…...

Android unitTest 单元测试用例编写(初始)

文章目录 了解测试相关库导入依赖库新建测试文件示例执行查看结果网页结果其他 本片讲解的重点是unitTest&#xff0c;而不是androidTest哦 了解测试相关库 androidx.compose.ui:ui-test-junit4: 用于Compose UI的JUnit 4测试库。 它提供了测试Compose UI组件的工具和API。 and…...

C++简明教程(10)(初识类)

类的教程 C 类的完整教程 C 中&#xff0c;类&#xff08;class&#xff09;是面向对象编程的核心概念&#xff0c;用于定义对象的属性&#xff08;数据成员&#xff09;和行为&#xff08;成员函数&#xff09;。本教程将带你从零开始&#xff0c;循序渐进地学习如何定义和使…...

光谱相机的工作原理

光谱相机的工作原理主要基于不同物质对不同波长光的吸收、反射和透射特性存在差异&#xff0c;以下是其具体工作过程&#xff1a; 一、光的收集 目标物体在光源照射下&#xff0c;其表面会对光产生吸收、反射和透射等相互作用。光谱相机的光学系统&#xff08;如透镜、反射镜…...

【Linux进程】基于管道实现进程池

目录 前言 1. 进程池 1.1 基本结构&#xff1a; 1.2. 池化技术 1.3. 思路分析 1.4. 代码实现 总结 前言 上篇文章介绍了管道及其使用&#xff0c;本文在管道的基础上&#xff0c;通过匿名管道来实现一个进程池&#xff1b; 1. 进程池 父进程创建一组子进程&#xff0c;子进…...

软件测试之单元测试

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、何为单测 测试有黑盒测试和白盒测试之分&#xff0c;黑盒测试顾名思义就是我们不了解盒子的内部结构&#xff0c;我们通过文档或者对该功能的理解&#xff0c…...

vscode+编程AI配置、使用说明

文章目录 [toc]1、概述2、github copilot2.1 配置2.2 使用文档2.3 使用说明 3、文心快码&#xff08;Baidu Comate&#xff09;3.1 配置3.2 使用文档3.3 使用说明 4、豆包&#xff08;MarsCode&#xff09;4.1 配置4.2 使用文档4.3 使用说明 5、通义灵码&#xff08;TONGYI Lin…...

007-spring-bean的相关配置(重要)

spring-bean的相关配置...

【唐叔学算法】第19天:交换排序-冒泡排序与快速排序的深度解析及Java实现

引言 排序算法是计算机科学中的基础问题&#xff0c;而交换排序作为其中一类经典的排序方法&#xff0c;因其简单直观的思想和易于实现的特点&#xff0c;在初学者中广受欢迎。交换排序的核心思想是通过不断交换相邻元素来达到排序的目的。本文将深入探讨两种典型的交换排序算…...

合并 Python 中的字典

合并 Python 中的字典 如何在 Python 中合并字典&#xff1f; 这取决于你对“合并”一词的具体定义。 在 Python 中使用 | 操作符合并字典 首先&#xff0c;让我们讨论合并字典的最简单方法&#xff0c;这通常已经足够满足你的需求。 以下是两个字典&#xff1a; >>…...

使用Python实现自动化文档生成工具:提升文档编写效率的利器

友友们好! 我的新专栏《Python进阶》正式启动啦!这是一个专为那些渴望提升Python技能的朋友们量身打造的专栏,无论你是已经有一定基础的开发者,还是希望深入挖掘Python潜力的爱好者,这里都将是你不可错过的宝藏。 在这个专栏中,你将会找到: ● 深入解析:每一篇文章都将…...

uniapp使用live-pusher实现模拟人脸识别效果

需求&#xff1a; 1、前端实现模拟用户人脸识别&#xff0c;识别成功后抓取视频流或认证的一张静态图给服务端。 2、服务端调用第三方活体认证接口&#xff0c;验证前端传递的人脸是否存在&#xff0c;把认证结果反馈给前端。 3、前端根据服务端返回的状态&#xff0c;显示在…...

【JavaSE】【网络原理】初识网络

目录 一、网络互联二、局域网与广域网三、网络通信基础3.1 IP地址3.2 端口号3.3 网络协议3.4 五元组 四、协议分层4.1 OSI七层网络模型4.2 TCP/IP五层(四层)网络模型4.3 网络设备 五、网络数据通信基本流程。5.1 封装和分用5.2 简述过程 一、网络互联 网络互联&#xff1a; 网…...

鸿蒙之路的坑

1、系统 Windows 10 家庭版不可用模拟器 对应的解决方案【坑】 升级系统版本 直接更改密钥可自动升级系统 密钥找对应系统的&#xff08;例&#xff1a;windows 10专业版&#xff09; 升级完之后要激活 坑1、升级完后事先创建好的模拟器还是无法启动 解决&#xff1a;删除模拟…...

Python生日祝福烟花

1. 实现效果 2. 素材加载 2个图片和3个音频 shoot_image pygame.image.load(shoot(已去底).jpg) # 加载拼接的发射图像 flower_image pygame.image.load(flower.jpg) # 加载拼接的烟花图 烟花不好去底 # 调整图像的像素为原图的1/2 因为图像相对于界面来说有些大 shoo…...

Ubuntu环境 nginx.conf详解(二)

1、nginx.conf 结构详解&#xff1a; http 块&#xff1a;用于配置 HTTP 服务器的相关设置&#xff0c;包括处理 HTTP 和 HTTPS。 stream 块&#xff1a;用于配置 TCP/UDP 代理服务器&#xff0c;适用于需要进行四层负载均衡的情况。 ... # 全局块 events {...} …...

shardingsphere分库分表项目实践4-sql解析sql改写

为什么要sql解析重写&#xff1f; 如果我们的系统数据库实现了分表&#xff0c;那么我们的sql中表名需要根据参数动态确定&#xff0c;那么代码怎么写&#xff1f; 方案1&#xff1a; 自己手动拼接&#xff0c; 比如 update t_user_${suffix} , ${suffix} 作为一个变量传递…...

谷歌浏览器插件

项目中有时候会用到插件 sync-cookie-extension1.0.0&#xff1a;开发环境同步测试 cookie 至 localhost&#xff0c;便于本地请求服务携带 cookie 参考地址&#xff1a;https://juejin.cn/post/7139354571712757767 里面有源码下载下来&#xff0c;加在到扩展即可使用FeHelp…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...