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

时间:2015-03-05 14:07:36

标签: python django heroku

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

7 个答案:

答案 0 :(得分:4)

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

  

collectstatic将收集静态文件以进行部署的目录的绝对路径。

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

答案 1 :(得分:4)

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

from django.contrib.staticfiles.storage import staticfiles_storage

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

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

答案 2 :(得分:4)

您配置的特定静态文件存储后端将提供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')

答案 3 :(得分:3)

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

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

答案 4 :(得分: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的“静态覆盖”mecanims,请查看其函数以获取“最终”静态文件(例如,myproject/python-env/lib/python2.7/site-packages/coolapp/static/coolapp/images/plop.jpegmyproject/src/myapp/static/coolapp/images/plop.jpeg

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

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

答案 5 :(得分:1)

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

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

其他所有设置均为默认设置,这对我有用!

答案 6 :(得分:0)

也有同样的问题。不知道这是否是最佳解决方案。

在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