我已经尝试过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'),
)
8条答案
按热度按时间ryoqjall1#
使用staticfiles_storage接口代替
STATIC_ROOT
与filename的连接,这也适用于远程静态文件,如S3/django-storages。使用
staticfiles_storage
,您还可以执行简单的文件操作,如打开、删除、保存。wa7juj8i2#
您配置的特定静态文件存储后端将提供
path
方法和url
方法。.url
方法返回的值与Django的静态内置函数相同rslzwgfq3#
当你把Django应用程序部署到Heroku时,或者当你手动运行
manage.py collectstatic
任务时,所有的静态资产都会被复制到你的STATIC_ROOT
目录中用途:xxls0lw84#
STATIC_ROOT = 'staticfiles'
是您的问题。根据文档,STATIC_ROOT
是:collectstatic将收集静态文件以进行部署的目录的绝对路径。
目前,您甚至没有在那里列出路径...
r6l8ljro5#
当你在“dev”或“prod”中时,你的静态文件不在同一个地方。在dev中,你使用django的“runserver”命令,它将为你的静态文件提供“原始”文件(例如:(一个月一个月)
在生产模式下,您必须使用“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 Doc中关于静态查找器的部分,以便更好地理解它的工作原理:https://docs.djangoproject.com/en/3.1/ref/settings/#std:setting-STATICFILES_FINDERS
PS:“HTTP路径”和“Python路径”不一样;)
ybzsozfc6#
只是遇到了同样的问题。不知道这是不是最好的解决办法。
在www.example.com中settings.py我创建了两条路径,用于在生产和开发之间切换。
在我的python文件中,就像在这篇文章中已经说的那样。
此文件的我的结构:
pw9qyyiw7#
让我告诉你我做了什么,我做了一个应用程序,我必须在其中读取CSV文件。
我用***django-startproject***命令创建了主项目目录,然后创建了一个应用程序。
在根目录中,我创建了一个名为static的文件夹,并在其中放置了CSV文件。
现在在我的views.py
所有其他设置都是默认的,这对我很有效!
c0vxltue8#
您可以通过以下方式实现您的目标。首先,您的settings.py文件具有以下基本路径:
您可以通过以下方式获取静态目录中的文件: