将静态文件存放在单独的目录中,使得 Django 可以有效地提供这些静态资源,如图片、CSS 文件、JavaScript 文件等,给用户的浏览器。在部署项目时,可以通过收集静态文件到一个单独的目录,然后将该目录服务于静态文件的 Web 服务器或者 CDN,从而更轻松地部署静态文件。那么对于在使用中我们经常遇到的问题,可以尝试着我这种解决方法。
1、问题背景
在 Django 中,有多个目录用于存储静态文件,每个应用程序都有自己的静态文件目录,便于模块化管理。为了能够访问所有应用程序的静态文件目录,需要修改 settings.py
文件。
以下是我的目录结构:
|-- assets // 静态文件目录,命名为 'assets'
| |-- css
| | |-- bootstrap.css
| | |-- bootstrap.min.css
| | |-- bootstrap-responsive.css
| | |-- bootstrap-responsive.min.css
| | `-- login.css
| |-- img
| | |-- glyphicons-halflings.png
| | `-- glyphicons-halflings-white.png
| `-- js
| |-- bootstrap.js
| |-- bootstrap.min.js
| `-- jquery-1.9.1.min.js
|-- initial // 项目名称
| |-- __init__.py
| |-- __init__.pyc
| |-- settings.py
| |-- settings.pyc
| |-- urls.py
| |-- urls.pyc
| |-- wsgi.py
| `-- wsgi.pyc
|-- manage.py
|-- models.py
|-- modules // 应用程序目录,命名为 'modules'
| |-- dashboard
| | |-- __init__.py
| | |-- __init__.pyc
| | |-- models.py
| | |-- models.pyc
| | |-- static // dashboard 应用程序中的静态文件目录
| | | |-- css
| | | |-- img
| | | `-- js
| | | `-- dashboard.js
| | |-- templates // dashboard 应用程序中的模板目录
| | | `-- dashboard
| | | `-- dashboard.html
| | |-- tests.py
| | |-- urls.py
| | |-- urls.pyc
| | |-- views.py
| | `-- views.pyc
| |-- login // login 应用程序
| | |-- forms.py
| | |-- forms.pyc
| | |-- __init__.py
| | |-- __init__.pyc
| | |-- models.py
| | |-- models.pyc
| | |-- static
| | | |-- css
| | | | `-- login.css
| | | |-- img
| | | `-- js
| | |-- templates
| | | |-- auth
| | | | |-- login.html
| | | | |-- logout.html
| | | | `-- register.html
| | | `-- registration
| | | `-- login.html
| | |-- tests.py
| | |-- urls.py
| | |-- urls.pyc
| | |-- views.py
| | `-- views.pyc
`-- templates // 基础模板目录
|-- base1.html
|-- base2.html
`-- registration
`-- login.html
以下是 settings.py
文件,当所有静态文件都在一个目录下时:
python
MEDIA_ROOT = os.path.normpath( os.path.join(os.path.dirname(__file__), '../assets/'))
MEDIA_URL = ''
STATIC_ROOT = ''
STATIC_URL = '/assets/'
以下是 settings.py
文件,当所有静态文件都在各自的模块/应用程序下时:
python
MEDIA_ROOT = (
os.path.normpath( os.path.join(os.path.dirname(__file__), '../assets/')),
os.path.normpath( os.path.join(os.path.dirname(__file__), '../modules/dashboard/static/')),
os.path.normpath( os.path.join(os.path.dirname(__file__), '../modules/login/static/')),
)
MEDIA_URL = ''
STATIC_ROOT = ''
STATIC_URL = '/assets/'
2、解决方案
- 按照 Django 文档中列出的步骤操作:https://docs.djangoproject.com/en/dev/howto/static-files/。
- 最重要的一步是:将静态文件存储在应用程序的
static
文件夹中。例如:my_app/static/my_app/myimage.jpg
。 - 将 assets 文件夹更名为 static。
过将静态文件放置在单独的静态文件目录,并利用 Web 服务器(如 Nginx、Apache 等)或者 CDN(内容分发网络)来提供静态文件服务,可以有效提高网站的性能和加载速度。总体来说,链接静态文件目录可以提高项目的结构清晰度、开发效率,并有助于提升网站的性能和用户体验。