静态文件与媒体文件是Web开发中不可绕过的两个部分,而Django作为一款成熟的、功能丰富的Web开发框架,自然对这两种文件有一套合适的管理方法。
要回答标题中的问题,不如先来了解一下静态文件与媒体文件:
什么是静态文件?
我们都知道,现代的Web应用使用B/S体系结构,它以Web浏览器做客户端,还有一套用来计算的服务端。而静态文件则是不需要经过服务端处理的文件,它们包含图片、音频、视频、CSS、JavaScript等多种类型,它们属于代码资产。其共同点为:它们的内容不随着用户请求的情况而改变,服务器可以不经过逻辑运算直接发送给客户端。
什么是媒体文件?
早期的Web应用,界面上只有文字,随着技术逐渐完善,现代的Web应用已经可以浏览视频、听音乐甚至玩游戏,这些视频文件、音频文件都可以被称作是媒体文件。而在Web开发中,媒体文件更多是指由用户上传的文件。
了解完静态文件和媒体文件之后,我们就可以来聊一聊Django是如何管理它们的了。
Django如何管理静态文件?
在Django5的项目配置文件settings.py中,有三条配置是关于静态文件的:STATIC_URL、STATICFILES_DIRS、STATIC_ROOT。它们各自的功能如下:
- STATIC_URL:用来生成静态文件的URL前缀,浏览器用这个前缀去拼接静态文件访问路径。比如:
配置项 浏览器拼接的url路径
STATIC_URL = '/static/' ————————> localhost:/static/filename.jpg
STATIC_URL = '/asset/' ————————> localhost:/asset/filename.jpg这条配置会影响{% static %}标签生成的URL,但是和物理文件路径、文件查找路径没有关系。
- STATICFILES_DIRS:用来列出除了各个app下的static目录之外,还有哪些项目级的static资源。比如:
STATICFILES_DIRS = [
BASE_DIR / 'static',
]这条配置会告诉Django,除了app下的static目录,项目中还存在这样一个文件夹:
项目根目录/static/文件夹里面有:
项目根目录/static/css/example.css
项目根目录/static/js/example.js
项目根目录/static/image/example.jpg当项目处在开发环境下,DEBUG = True时,runserver会通过 staticfiles finder 去各个app下的静态目录、STATICFILES_DIRS配置项所列出来的文件目录中查找静态文件;当项目准备上线时,执行
python manage.py collectstaticDjango同样会去各个app下的静态目录、STATICFILES_DIRS配置项所列出来的文件目录中收集静态文件并复制到STATIC_ROOT项指定的目录。
也就是说,STATIC_ROOT和STATICFILES_DIRS不可以重名,否则Django会报错。
- STATIC_ROOT:静态文件最终会去的地方。比如:
STATIC_ROOT = BASE_DIR / 'staticfiles'这条配置表示将收集到的静态资源复制到
项目根目录/staticfiles/例如:
项目根目录/static/css/example.css会被复制到
项目根目录/staticfiles/css/example.css当DEBUG = False,Django将不会再提供静态文件,runserver默认情况下也不会去STATIC_ROOT搜索静态文件,届时将需要Nginx或者其它工具从STATIC_ROOT下查找。
Django如何管理媒体文件?
用户上传了一些东西,可能是他的头像,也可能是一段视频或者音频。这些文件可以塞在STATIC_ROOT下吗?理论上是可以的,静态文件包含这一部分,用户请求时服务器只需要拿出来展示给用户,不需要别的逻辑计算。但是显然这样做会造成管理混乱,而且如果用户上传了一些不可名状的东西被服务器读取到,可能会造成网站崩溃。
所以Django为这些媒体文件提供了专门的配置项:
- MEDIA_URL:和STATIC_URL一样,用于拼接浏览器的访问路径,实际上和物理文件路径以及文件查找路径无关。
MEDIA_URL = '/media/'- MEDIA_ROOT:和STATIC_ROOT用于存放静态文件一样,MEDIA_ROOT用于存放媒体文件。
MEDIA_ROOT = BASE_DIR / 'media'在开发环境下DEBUG = True,但是runserver不会主动查找媒体文件,所以需要在urls.py中通过这种方式提供媒体文件:
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# 你的路由
]
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)在生产环境下,依然可以通过Nginx去查找媒体文件。
以上就是Django管理静态文件和媒体文件的方法,简单总结一下的话,就是:
STATIC_URL:给出静态文件 URL 前缀
STATICFILES_DIRS:标记项目级静态文件资源
STATIC_ROOT:存放收集到的静态文件以供查找MEDIA_URL:给出媒体文件URL前缀
MEDIA_ROOT:存放用户上传的媒体文件以供查找如果有谬误,欢迎在评论区进行指正。
评论 (4)