Django 1.6:如何在视图中访问静态文件
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'), )
问题的出现原因是代码中使用了错误的路径来访问静态文件。在开发环境中,使用没有前导斜杠的"static/..."路径可以正常工作,但在生产环境中,静态文件被复制到"STATIC_ROOT = staticfiles"目录下,而无法在"static/..."路径下找到任何文件。
解决方法是使用"staticfiles_storage"接口来代替将"STATIC_ROOT"与文件名拼接。可以通过导入"django.contrib.staticfiles.storage"模块并调用"staticfiles_storage.url('data/foobar.csv')"方法来实现。这种方法还适用于像S3/django-storages这样的远程静态文件。
此外,使用"staticfiles_storage"还可以进行简单的文件操作,如打开、删除、保存等。
问题原因:配置了特定的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')