如何在 Django 应用程序的视图中引用静态文件
Posted
技术标签:
【中文标题】如何在 Django 应用程序的视图中引用静态文件【英文标题】:How to reference static file in Django app's view 【发布时间】:2015-05-29 20:41:30 【问题描述】:我知道这里有很多关于访问 Django 项目中的静态文件的问题,但是我找不到我正在处理的问题的满意答案。所以,这是我的项目结构:
.
├── project
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ ├── wsgi.py
├── db.sqlite3
├── manage.py
└── app
├── admin.py
├── __init__.py
├── migrations
│ ├── __init__.py
├── models.py
├── static
│ └── app
│ └── file.txt
├── tests.py
├── urls.py
└── views.py
根据Django 1.7 documentation,我已将静态文件 file.txt 存储在 app/static/app 文件夹中。现在,如何在视图中引用此文件?假设我需要为 app/views.py 中定义的每个调用读取此文件的内容。
像往常一样,我在 project/settings.py 中有默认设置 STATIC_URL = '/static/'
谢谢
【问题讨论】:
【参考方案1】:您可以将static
模板标签导入到您的视图中并像这样使用它:
from django.templatetags.static import static
url = static('app/file.jpg')
【讨论】:
我需要在视图中访问静态文件,而不是在模板标签中。以上无法在视图中使用。 有没有办法不对应用名称进行硬编码? 您必须硬编码应用程序的名称,因为它定义了存储目录。 @SiddharthGupta:有没有办法在其视图中获取应用程序的名称? @abhinavkulkarni 你可以用inspect
做一些花哨的事情(见this answer),但IMO 你最好明确定义它。您可以在模块中使用全局变量来定义应用程序名称,并在您调用static
的任何地方使用它。或者,您可以在 static
周围定义一个包装器。【参考方案2】:
您可以通过在设置中定义 STATIC_ROOT 来做到这一点。然后在运行您的项目之前,您可以运行
python manage.py collectstatic
然后可以使用以下方式访问静态文件:-
file = open(os.path.join(settings.STATIC_ROOT, 'app/a.txt'))
这基本上就是这种方式,它应该在生产环境中完成,因为静态文件与 django html 视图分开托管。
在project/urls.py中动态加载app名称
url(r'^', include('app.urls', app_name="app")),
然后在视图中:-
from django.core.urlresolvers import resolve
def appname(request):
return resolve(request.path).app_name
【讨论】:
以上是关于如何在 Django 应用程序的视图中引用静态文件的主要内容,如果未能解决你的问题,请参考以下文章
当静态文件的realative引用不包含'static'时,如何在Django中配置设置?