彻底搞懂Django静态文件管理

2023-05-16

为什么要管理静态文件

Django官方教程说:

We recommend using a separate Web server – i.e., one that’s not also running Django – for serving media.

即建议用个额外的web服务器处理静态文件。实际部署过程中,常用Nginx作为反向代理服务器以及静态文件服务器。

对于静态文件的处理很麻烦,因为在开发模式和实际部署时还会有区别。很多教程上来就是怎么做,而不说为什么要那样做。

那么,到底为什么呢?

在Stack Overflow上找到的答案是:为了效率

  1. 把静态文件放到另一个服务器,甚至另一个域/子域,能大幅优化对它们的处理(比如用Nginx)
  2. 能减少网络阻塞。如果静态文件和动态应用在同一个域内,浏览器访问静态文件时,就会把域的cookies也放到请求里,其实是没必要的;如果静态文件在另一个域内,该域就可以配置为无需cookies的域(cookieless domain)。

接下来问题又来了,为什么小小的cookies会这么影响效率呢?因为网络访问过程中,上传和下载是不对等的,至少是1:10,且一般只对下载做压缩,对上传不做。所以谷歌说了:

The best way to cut down on client request time is to reduce the number of bytes uploaded as request header data. So, minimize request size and serve static content from a cookieless domain. – developers.google.com

详见:Why you need a cookie-less domain

Django开发环境静态文件管理

开发模式下,有两种方法:使用 django.contrib.staticfiles自动管理,或手工配置。

使用 django.contrib.staticfiles 自动管理

Django提供了django.contrib.staticfiles app来管理静态文件。

在开发环境下,如果使用了django.contrib.staticfiles,且DebugTrue时,runserver命令会自动处理静态文件。但这种方式效率极低,且不安全。

配置某个app使用的静态文件

  1. settings.py中,将其加入 INSTALLED_APPS
    在这里插入图片描述
  2. settings.py中,加入:
STATIC_URL = '/static/'
  1. 在模板中用static标签处理相对路径:
{% load static %}
<img src="{% static 'my_app/example.jpg' %}" alt="My image">
  1. 将静态文件存储到app目录下的static文件夹:
my_app/static/my_app/example.jpg

配置多app共用的静态文件

如果有些静态文件并非某app独用,比如有个logo,想让多个app共享使用,可在settings.py中定义:

STATICFILES_DIRS = [
    BASE_DIR / "static",
    '/var/www/static/',
]

Django就会在这些文件夹里寻找静态文件。

但除非是公共静态文件,最好别放到这些目录里。因为Django的STATICFILES_FINDERS还会自动扫描所有INSTALLED_APPS中叫static的子文件夹寻找静态文件,所以最好也用与app同名的命名空间区分,否则就无法区分同名静态文件,直接拿第一个匹配的使用。

手动管理静态文件

如果不用django.contrib.staticfiles,可以使用django.views.static.serve()视图来管理静态文件。

  1. settings.py中,加入:
STATIC_URL = '/static/'
  1. urls.py中,加入helper函数:
from django.conf import settings
from django.conf.urls.static import static

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

该helper函数仅在debug模式下,且前缀是本地路径(如/static/,而非http://static.example.com/)时生效。

并且它只处理STATIC_ROOT文件夹,不会像django.contrib.staticfiles.那样去搜索app中的static文件夹。

STATIC_ROOT表示collectstatic命令会将静态文件采集到的目的地绝对路径(django.contrib.staticfiles app负责采集)。

处理用户上传的静态文件

使用 django.views.static.serve()视图,通过指定MEDIA_ROOT( 如/media/)来处理用户上传的文件:

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

urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

该helper函数仅在debug模式下,且前缀是本地路径(如/media/,而非http://media.example.com/)时生效。

Django生产环境静态文件管理

在同一个服务器上部署

  1. 在服务器上运行collectstatic指令
  2. 设置服务器的静态文件配置为STATIC_URL下的STATIC_ROOT

在专门静态文件服务器上部署

  1. 静态文件发生变动时,在本地执行collectstatic
  2. STATIC_ROOT目录的静态文件部署到静态文件服务器,通常用rsync文件同步工具

参考:rsync用法教程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

彻底搞懂Django静态文件管理 的相关文章

随机推荐

  • 串口接收不定长数据的几种方法

    串口作为单片机开发的一个常用的外设 xff0c 应用范围非常广 大部分时候 xff0c 串口需要接收处理的数据长度是不定的 那么怎么才能判断一帧数据是否结束呢 xff0c 今天就以STM32单片机为例 xff0c 介绍几种接收不定长数据的方
  • 删除分节符的技巧

    WORD中删除分节符有这样的规定 xff1a 如果要删除分节符 xff0c 只要把光标移动到该分节符上 xff0c 按Delete键即可 但是要注意该分节符前面的文字将合并到后面的节中 xff0c 并且采用后者的格式设置 我就不知道天杀的微
  • 虚机创建异常报错No valid host was found,There are not enough hosts available

    虚机创建异常 xff0c 使用nova show 虚机ID提示fault报错信息 xff1a No valid host was found xff0c There are not enough hosts available 检查所在宿主
  • vuzzer 具体原理解析

    目录 1 安装 vmware 15 01环境下安装 xff1a 2 vuzzer使用说明 3 vuzzer原理 3 1权重文件以及有着cmp信息的文件生成 3 2 vuzzer种子生成 xff0c 变异原理 3 2 1 runfuzz py
  • C++ unordered_set

    目录 1 定义 2 基本的函数 2 1 unordered set构造 2 2 添加新的元素 注意无法插入相同元素 2 3 查找元素 2 4 查找桶接口 2 5 观察器 2 6 清除元素 2 7 其他函数 1 定义 unordered se
  • clang 10 介绍——sanitizerCoverage

    1 Introduction llvm内置了一个简单的代码覆盖率检测 xff08 sanitizercoverage xff09 它在函数级 基本块级和边缘级插入对用户定义函数的调用 提供了这些回调的默认实现 xff0c 并实现了简单的覆盖
  • C++ 匿名函数

    1 定义 所谓匿名函数 xff0c 其实类似于python中的lambda函数 xff0c 其实就是没有名字的函数 使用匿名函数 xff0c 可以免去函数的声明和定义 这样匿名函数仅在调用函数的时候才会创建函数对象 xff0c 而调用结束后
  • 给docker中的ubuntu系统安装桌面程序

    原本服务器是centos的 xff0c 用的不是很习惯 xff0c 也为了可以分割功能 xff0c 于是在服务器上装了docker xff0c docker里装了ubuntu系统 xff0c 具体过程可以参见https blog csdn
  • 陇剑杯 2021 write up整理

    竞赛 write up 收集和整理 陇剑杯 2021 write up整理1 签到题1 1 2 JWT2 12 22 32 42 52 6 3 webshell3 13 23 33 43 53 63 7 4 日志分析4 14 24 3 5
  • PBCTF2021

    PBCTF2021 1 MISC1 1 幽灵作家 Ghost Writer 2 Crypto2 1 Alkaloid Stream2 2 Steroid Stream2 3 good hash 1 MISC 1 1 幽灵作家 Ghost W
  • ASISCTF

    warm up 题目代码如下图所示 xff0c 我们会发现整个加密过程如下所示 xff0c 先在flag后面加上p长度的随机字符 xff0c 然后选择pow s i p 的结果选择字符重新连接字符串实现加密 usr bin env pyth
  • burpsuite简介

    1 burpsuite简介 burpsuite作为web渗透较为常用的软件 xff0c 有着9个比较常用的模块 proxy xff0c target xff0c intruder xff0c comparer xff0c repeater
  • libFuzzer

    目录 1 概述 2 版本 3 Fuzz Target 4 Fuzzer Usage 5 Corpus 6 Running 7 Parallel Fuzzing 8 Fork mode 9 Resuming merge 10 Options
  • linux virsh console无法登入虚拟机,宿主机virsh console 登录异常

    创建虚机后在宿主机上通过virsh console 登录不进去 xff0c 一直卡在登录界面 xff08 可以通过命名空间ssh登录 xff0c 排除用户名及密码问题 xff09 原因是相关配置文件没有添加 xff0c 可以通过以下方法进行
  • FrankMocap:A Monocular 3D Whole-Body Pose Estimation System via Regression and Integration 2021阅读理解

    ICCV Workshop 2021 Facebook AI research Btw why the name FrankMocap Our pipeline to integrate body and hand modules remi
  • 网络流算法学习笔记——Dinic有效算法

    屈婉玲 算法设计与分析 第2版第7章网络流算法学习笔记 概述 Dinic有效算法同样用来求最大流 xff0c 相当于FF算法的改进 FF算法参考 xff1a 网络流算法学习笔记 最大流问题基本概念和Ford Fulkerson方法 xff0
  • NDN网络学习笔记(一)——NDN基础

    NDN xff08 Named Data Networking xff09 是用来取代当前TCP IP架构的新的互联网架构 xff0c 在2010年被提出 NDN 的网络架构如下右图 xff0c 它继承了 IP 架构的沙漏型瘦腰结构 xff
  • Meterpreter session 2 closed. Reason: Died 问题解决方法

    问题描述 用msf生成Ubuntu 16 04的反向连接木马 xff1a msfvenom p linux x64 meterpreter reverse tcp LHOST span class token operator 61 spa
  • docker hub连接github无法构建镜像的问题解决

    初次使用docker hub关联github xff0c 参考官方教程 xff1a http docs docker oeynet com docker hub github creating an automated build 关联了g
  • 彻底搞懂Django静态文件管理

    为什么要管理静态文件 Django官方教程说 xff1a We recommend using a separate Web server i e one that s not also running Django for serving