【问题标题】:Django 1.6: How to access static files in viewDjango 1.6:如何访问视图中的静态文件
【发布时间】:2015-05-06 22:23:56
【问题描述】:

我已经尝试过here 的解决方案,但它对我不起作用。我正在为 Python 创建一个基于 Heroku“入门”项目的项目。

在views.py 中,我希望能够访问static/data/ 文件夹中的文件。但是,我为创建文件的正确 url 所做的大多数尝试都失败了。唯一可行的是将文件的绝对路径放在我的本地文件系统上,这在我部署我的应用程序时显然不起作用。

之前打开文件的尝试包括:

from django.templatetags.static import static
url = static('data/foobar.csv')
os.path.isfile(url) # False

from django.conf import settings
url = os.path.join(settings.STATIC_URL, 'data/foobar.csv')
os.path.isfile(url) # False

这是我的目录结构:

/appname
  /app
    /templates
    views.py
  /appname
    /static
      /js
      /css
      /data
    settings.py
    urls.py

settings.py:

BASE_DIR = os.path.dirname(os.path.abspath(__file__))

DEBUG = True

TEMPLATE_DEBUG = True

ALLOWED_HOSTS = []

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app'
)

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
)

ROOT_URLCONF = 'appname.urls'

WSGI_APPLICATION = 'appname.wsgi.application'

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

LANGUAGE_CODE = 'en-us'

TIME_ZONE = 'UTC'

USE_I18N = True

USE_L10N = True

USE_TZ = True

DATABASES['default'] =  dj_database_url.config()

SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

ALLOWED_HOSTS = ['*']

STATIC_ROOT = 'staticfiles'
STATIC_URL = '/static/'

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

【问题讨论】:

  • 试试“/static/data/foobar.csv”

标签: python django heroku


【解决方案1】:

当您在“dev”或“prod”中时,您的静态文件不在同一个位置。 在 dev 中,您使用 django “runserver” 命令,它将为您的静态文件提供“原始”文件(例如:myproject/src/appname/static/appname/images/plop.jpeg)

在生产模式下,您必须使用“collectstatic”django 命令将这些原始文件复制到“直接公共 http 访问文件夹”中(例如:/static/appname/images/plop.jpeg 用于 http 访问)

但是原始文件仍然在同一个地方(myproject/src/appname/static/appname/images/plop.jpeg),因此您的视图可以直接访问这些原始文件。

如果您知道要查找的文件在哪个应用程序中,那就很简单了。如果您想使用 Django 的“静态覆盖”机制,请查看其函数以获取“最终”静态文件(例如,是 myproject/python-env/lib/python2.7/site-packages/coolapp/static/coolapp/images/plop.jpeg 还是 myproject/src/myapp/static/coolapp/images/plop.jpeg)

我建议阅读有关静态查找器的 Django 文档,以更好地了解它的工作原理:https://docs.djangoproject.com/en/3.1/ref/settings/#std:setting-STATICFILES_FINDERS

PS : "HTTP 路径" 和 "python 路径" 不一样 ;)

【讨论】:

    【解决方案2】:

    让我告诉你我做了什么,我制作了一个应用程序,我必须在其中读取一个 CSV 文件。
    我用 django-startproject 命令制作了主项目目录,然后制作了一个应用程序。
    在根目录中,我创建了一个名为 static 的文件夹,并在其中放置了 CSV 文件。

    现在在我的views.py
    read_csv('static/file_name')

    所有其他设置都是默认设置,这对我有用!

    【讨论】:

      【解决方案3】:

      刚刚遇到同样的问题。不知道这是否是最好的解决方案。

      在 settings.py 中,我创建了两条用于在生产和开发之间切换的路径。我需要在部署站点时取消注释。

      #Productive
      #STATIC_ROOT = '/home/DimiDev/RESite/static'
      #Development
      STATIC_ROOT = 'realestate/static'
      

      在我的 python 文件中,如本文所述。

      from django.contrib.staticfiles.storage import staticfiles_storage
      file_path = staticfiles_storage.path('realestate/ml/2xgBoosting_max.sav')
      

      我对这个文件的结构:

      RESite\realestate\static\realestate\ml\2xgBoosting_max.sav
      

      【讨论】:

      • path 比其他响应中使用的 url 更适合我的用例。
      【解决方案4】:

      不要使用文件名加入STATIC_ROOT,而是使用staticfiles_storage 接口。这也适用于 S3/django-storages 等远程静态文件。

      from django.contrib.staticfiles.storage import staticfiles_storage
      
      url = staticfiles_storage.url('data/foobar.csv')
      

      使用staticfiles_storage,您还可以进行简单的文件操作,例如打开、删除、保存。

      【讨论】:

      • 嗯,对我来说,这指向/static/...,并且在开发和生产中都中断了。在开发中,如果我使用 static/... 而不使用前导斜杠,它就可以工作。在生产(Heroku)中,静态文件被复制到STATIC_ROOT = staticfiles,它在static/...下找不到任何东西。
      【解决方案5】:

      您配置的特定静态文件存储后端将提供path 方法和url 方法。

      from django.contrib.staticfiles.storage import staticfiles_storage
      p = staticfiles_storage.path('data/foobar.csv')
      content = p.readlines()
      # manipulate content
      

      .url 方法返回的值与 Django 的静态内置方法相同

      url = static('data/foobar.csv')
      

      【讨论】:

        【解决方案6】:

        当您将 Django 应用程序部署到 Heroku 时,或者当您手动运行 manage.py collectstatic 任务时,所有静态资产将被复制到您的 STATIC_ROOT 目录中。因此你应该使用:

        file_path = os.path.join(settings.STATIC_ROOT, 'data/foobar.csv')
        

        【讨论】:

          【解决方案7】:

          STATIC_ROOT = 'staticfiles' 是你的问题。来自the docs,STATIC_ROOT是:

          collectstatic 将收集用于部署的静态文件的目录的绝对路径。

          目前,您甚至没有列出路径...

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-03-20
            • 2013-11-22
            • 2013-11-29
            • 2014-02-26
            • 1970-01-01
            • 2017-12-23
            • 1970-01-01
            • 2021-08-14
            相关资源
            最近更新 更多