Django 获取静态媒体文件
Posted
技术标签:
【中文标题】Django 获取静态媒体文件【英文标题】:Django get static media files 【发布时间】:2012-07-14 11:20:31 【问题描述】:所有,我正在使用 Django1.4,我有一个关于访问 img 文件、js 文件等的问题...我的文件在目录 /opt/lab/labsite/media/img 中用于图像和 /opt /lab/labsite/media/js 用于 javascript 文件。我应该如何更改设置文件中的设置以使下面的 html 正常工作..我正在使用 django 服务器来运行代码
我的代码目前位于/opt/lab/labsite/settings.py,其他模块位于/opt/lab/labsite/.........
<img src="/media/img/logo.jpg" />
下面是settings.py文件中的设置
# Absolute filesystem path to the directory that will hold user-uploaded files.
# Example: "/home/media/media.lawrence.com/media/"
MEDIA_ROOT = '/opt/lab/labsite/media/'
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
# trailing slash.
# Examples: "http://media.lawrence.com/media/", "http://example.com/media/"
MEDIA_URL = ''
# Absolute path to the directory static files should be collected to.
# Don't put anything in this directory yourself; store your static files
# in apps' "static/" subdirectories and in STATICFILES_DIRS.
# Example: "/home/media/media.lawrence.com/static/"
STATIC_ROOT = ''
# URL prefix for static files.
# Example: "http://media.lawrence.com/static/"
STATIC_URL = '/opt/lab/labsite/media/'
Changes
MEDIA_ROOT = '/opt/lab/labsite/media/'
MEDIA_URL = '/media/'
STATIC_ROOT = '/opt/lab/labsite/static/'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
)
# List of finder classes that know how to find static files in
# various locations.
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
# 'django.contrib.staticfiles.finders.DefaultStorageFinder',
)
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
# 'django.template.loaders.eggs.Loader',
)
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
ROOT_URLCONF = 'labsite.urls'
# Python dotted path to the WSGI application used by Django's runserver.
WSGI_APPLICATION = 'labssite.wsgi.application'
TEMPLATE_DIRS = (
# Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
# Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
'/opt/lab/labsite/templates'
)
INSTALLED_APPS = (
'django.contrib.auth',
'django.contrib.admin',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'home',
# Uncomment the next line to enable admin documentation:
# 'django.contrib.admindocs',
)
# A sample logging configuration. The only tangible logging
# performed by this configuration is to send an email to
# the site admins on every HTTP 500 error when DEBUG=False.
# See http://docs.djangoproject.com/en/dev/topics/logging for
# more details on how to customize your logging configuration.
TEMPLATE_CONTEXT_PROCESSORS = (
'django.core.context_processors.static',
'django.contrib.auth.context_processors.auth'
)
HTML:
<img src=" STATIC_URL img/hi.png" />
<img src="/static/img/hi.png" />
<img src="/media/img/hi.png" />
<img src="/opt/ilabs/ilabs_site/media/img/hi.png">
【问题讨论】:
【参考方案1】:STATIC_URL
你设置的不好看。我认为应该是STATIC_ROOT
。
你应该设置(例如)MEDIA_URL='/media/'
和STATIC_URL='/static/'
,我希望你也在 urls.py 中启用了静态文件服务
【讨论】:
我错过了 urls.py 中的设置并解决了问题。谢谢【参考方案2】:在settings.py中设置:
STATIC_ROOT = '/opt/html/static/'
STATIC_URL = '/static/'
STATICFILES_DIRS = (
'/opt/lab/labsite/static/',
)
在上下文处理器中添加这个:
TEMPLATE_CONTEXT_PROCESSORS = (
...
'django.core.context_processors.static',
...
)
不要忘记INSTALLED_APPS
:
'django.contrib.staticfiles',
然后:
<img src="/static/img/logo.jpg" />
或
<img src=" STATIC_URLimg/logo.jpg" />
如果logo.jpg
位于/opt/lab/labsite/static/img/
此外,STATIC_ROOT
用作静态文件夹,由 Web 服务器/反向代理(如 Apache、nginx 等)提供服务。如果您调用:
python manage.py collectstatic
这会将所有文件从/opt/lab/labsite/static/
复制到STATIC_ROOT
- /opt/html/static/
。这对部署很有用。
但这一切都是为了发展。对于生产来说,有更好的方法来提供静态内容 - https://docs.djangoproject.com/en/dev/howto/static-files/#staticfiles-production
【讨论】:
如前所述:# Absolute filesystem path to the directory that will hold user-uploaded files.
- 这是一个上传目录,具有相应的权限。这应该与 STATIC_URL/STATIC_ROOT 不同,因为假定文件将被上传到那里。所以你可以相应地设置它,以防你真的有这样的功能来上传内容。否则 - 将其留空。要使用它 - 您还需要 django.core.context_processors.media
模板处理器。
django 1.4 中没有像 TEMPLATE_CONTEXT_PROCESSORS 这样的设置,我应该包含它吗...
是的,你应该这样做。不要忘记它是一个元组:TEMPLATE_CONTEXT_PROCESSORS = ( 'django.core.context_processors.static', )
我已按照您的指示添加了设置,但我仍然看不到图像我还验证了图像路径..我在 /opt/lab/labsite/static/ 中创建了一个 /static 文件mg/hi.png .请查看我指出的问题的变化
我已经更新了我的答案 - 实际上 django.core.context_processors.static
来自 STATICFILES_DIRS
而不是来自 STATIC_ROOT
。当collectstatic
使用时,STATIC_ROOT
旨在供外部服务器/代理使用。并且您不需要修改 'urls.py' 即可将上述场景与 STATICFILES_DIRS
一起使用。以上是关于Django 获取静态媒体文件的主要内容,如果未能解决你的问题,请参考以下文章
获取 Django 的静态文件包括在 Vue.js .vue 模板中工作
解决Django设置debug=False静态文件获取不到的问题