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

16 浏览
0 Comments

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

我已经尝试过这里的解决方案,但对我没用。我正在基于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

这是我的目录结构:

/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'),
)

0
0 Comments

问题的出现原因是代码中使用了错误的路径来访问静态文件。在开发环境中,使用没有前导斜杠的"static/..."路径可以正常工作,但在生产环境中,静态文件被复制到"STATIC_ROOT = staticfiles"目录下,而无法在"static/..."路径下找到任何文件。

解决方法是使用"staticfiles_storage"接口来代替将"STATIC_ROOT"与文件名拼接。可以通过导入"django.contrib.staticfiles.storage"模块并调用"staticfiles_storage.url('data/foobar.csv')"方法来实现。这种方法还适用于像S3/django-storages这样的远程静态文件。

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

0
0 Comments

问题原因:配置了特定的staticfiles storage backend,但在视图中无法访问静态文件。

解决方法:

1. 导入静态文件存储的模块:from django.contrib.staticfiles.storage import staticfiles_storage

2. 使用path方法获取静态文件的路径:p = staticfiles_storage.path('data/foobar.csv')

3. 使用readlines方法读取静态文件内容:content = p.readlines()

4. 对内容进行操作

5. 使用url方法获取静态文件的URL:url = static('data/foobar.csv')

0
0 Comments

问题的出现原因是,在部署Django应用到Heroku或手动运行`manage.py collectstatic`任务时,所有的静态资源会被复制到`STATIC_ROOT`目录中。因此,解决方法是使用`os.path.join(settings.STATIC_ROOT, 'data/foobar.csv')`来访问静态文件。

0