【问题标题】:How to reference static file in Django app's view如何在 Django 应用程序的视图中引用静态文件
【发布时间】: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/'

谢谢

【问题讨论】:

    标签: python django django-staticfiles


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2017-01-25
      • 2011-06-01
      • 2021-12-31
      • 2011-05-18
      • 2016-10-19
      • 2012-02-21
      • 1970-01-01
      • 2021-10-23
      • 2012-04-15
      相关资源
      最近更新 更多