如何在Django应用的视图中引用静态文件

4

我知道这里有许多关于在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/' 谢谢。
2个回答

8
您可以将static模板标签导入到您的视图中,并像这样使用它:
from django.templatetags.static import static

url = static('app/file.jpg')

我需要在视图中访问静态文件,而不是在模板标签中。上述方法无法在视图中使用。 - abhinavkulkarni
@SiddharthGupta:在视图内部获取应用程序名称的方法不存在吗? - abhinavkulkarni
@abhinavkulkarni 或许你可以使用 inspect 来实现某些花哨的功能(参见此答案),但我认为最好还是显式地定义它。你可以在模块中使用全局变量来定义应用程序名称,然后无论何时调用 static 都可以使用该变量。或者,你可以在 static 周围定义一个包装器。 - Joseph
@SiddharthGupta:我调用该方法后得到的结果是 {'appname': None}。 - abhinavkulkarni
@abhinavkulkarni 请看一下我的回答,我认为那会有所帮助。 - Siddharth Gupta
显示剩余2条评论

5
你可以在设置中定义 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接