如何在 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 应用程序的视图中引用静态文件的主要内容,如果未能解决你的问题,请参考以下文章

12.Django中静态文件的引用

Django 1.6:如何访问视图中的静态文件

当静态文件的realative引用不包含'static'时,如何在Django中配置设置?

视图中等效的Django staticfiles静态模板帮助器(Python代码)[重复]

如何返回通过django中的视图的静态文件?

如何返回通过django中的视图的静态文件?