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

mpl*_*lis 7 python django heroku

我已经在这里尝试了解决方案,它对我不起作用.我正在创建一个基于Heroku"入门"项目的Python项目.

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
Run Code Online (Sandbox Code Playgroud)

这是我的目录结构:

/appname
  /app
    /templates
    views.py
  /appname
    /static
      /js
      /css
      /data
    settings.py
    urls.py
Run Code Online (Sandbox Code Playgroud)

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'),
)
Run Code Online (Sandbox Code Playgroud)

fli*_*lix 8

与其STATIC_ROOT使用文件名加入,不如使用staticfiles_storage接口。这也可以用于远程静态文件,例如S3 / django-storages。

from django.contrib.staticfiles.storage import staticfiles_storage

url = staticfiles_storage.url('data/foobar.csv')
Run Code Online (Sandbox Code Playgroud)

随着staticfiles_storage你也可以做简单的文件操作,如打开,删除,保存。

  • 嗯,对我来说这指向“/static/...”并且在开发和生产中都会中断。在开发中,如果我使用不带前导斜杠的“static/...”,它就可以工作。在生产环境(Heroku)中,静态文件被复制到“STATIC_ROOT = staticfiles”,并且在“static/...”下找不到任何内容。 (3认同)

shu*_*ckc 7

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

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

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

url = static('data/foobar.csv')
Run Code Online (Sandbox Code Playgroud)


Sel*_*cuk 6

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

file_path = os.path.join(settings.STATIC_ROOT, 'data/foobar.csv')
Run Code Online (Sandbox Code Playgroud)


rne*_*ius 5

STATIC_ROOT = 'staticfiles'是你的问题。从文档中STATIC_ROOT是:

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

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