Python Django Heroku Debug=False,静态文件导致内部服务器错误
已解决: 我不确定我做了什么组合来最终修复它,但最后一件事是修复我的静态文件层次结构。以前,我只是使用了Python Django Heroku Debug=False,静态文件导致内部服务器错误,python,django,heroku,internal-server-error,Python,Django,Heroku,Internal Server Error,已解决: 我不确定我做了什么组合来最终修复它,但最后一件事是修复我的静态文件层次结构。以前,我只是使用了//static/main.css,但我将其更改为//static//main.css,这以某种方式解决了这个问题 原始问题: 我目前正在尝试使用Heroku部署django应用程序。但是,当我尝试使用Debug=False部署时,我得到一个内部服务器错误,因为服务器找不到main.css样式表。请注意,当Debug=True时,一切正常 当我在命令行中尝试python manage.py f
//static/main.css
,但我将其更改为//static//main.css
,这以某种方式解决了这个问题
原始问题:
我目前正在尝试使用Heroku部署django应用程序。但是,当我尝试使用Debug=False
部署时,我得到一个内部服务器错误,因为服务器找不到main.css
样式表。请注意,当Debug=True
时,一切正常
当我在命令行中尝试python manage.py findstatic--verbosity 2 main.css
时,我得到了错误消息
找不到与“main.css”匹配的文件。正在查找以下位置:
/Users/Kyle/.local/share/virtualenvs/hostable-Ij2AFM0k/lib/python3.6/site-packages/django/contrib/admin/static”,但我不知道它为什么会出现在这里
下面我提供了我的settings.py
文件。我的文件层次结构很混乱,因为执行collectstatic
会将一大堆静态文件生成到staticfiles
文件夹中,但我不知道它们来自何处,也不知道它们的用途。我把样式表放在静态文件夹中,但似乎不再调用它了
我想知道的是:为了找到main.css
,我应该在设置或文件层次结构中更改什么
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
ALLOWED_HOSTS = ['*']
# Application definition
INSTALLED_APPS = [
'crispy_forms',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'menus.apps.MenusConfig',
'events.apps.EventsConfig',
'users.apps.UsersConfig',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'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 = 'project.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
os.path.join(BASE_DIR, 'templates'),
os.path.join(BASE_DIR, 'users/templates'),
os.path.join(BASE_DIR, 'events/templates'),
os.path.join(BASE_DIR, 'menus/templates'),
],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'project.wsgi.application'
# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# Password validation
# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/2.1/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
DEBUG_PROPAGATE_EXCEPTIONS = True
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'staticfiles')
另外,我也尝试过使用whitenoise
,但都没有成功
我还应该提到,当我查看日志文件时,我得到了此处引用的消息的ValueError:Missing staticfiles manifest条目
设置.py的工作版本
:
DEBUG = False
ALLOWED_HOSTS = ['*']
# Application definition
INSTALLED_APPS = [
'crispy_forms',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'menus.apps.MenusConfig',
'events.apps.EventsConfig',
'users.apps.UsersConfig',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'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 = 'project.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
os.path.join(BASE_DIR, 'templates'),
os.path.join(BASE_DIR, 'users/templates'),
os.path.join(BASE_DIR, 'events/templates'),
os.path.join(BASE_DIR, 'menus/templates'),
],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'project.wsgi.application'
# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# Password validation
# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/2.1/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
DEBUG_PROPAGATE_EXCEPTIONS = True
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), ]
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
在Debug=False
中,尝试在项目目录的url.py文件中添加静态文件的url:
from django.contrib import admin
from django.urls import path, re_path, include
from django.conf.urls.static import static
from django.conf import settings
from django.views.static import serve
urlpatterns = [
path('admin/', admin.site.urls),
re_path(r'^', include('app.urls')),
re_path(r'^static/(?P<path>.*)$', serve,
{'document_root': settings.STATIC_ROOT}),
]
来自django.contrib导入管理
从django.url导入路径,re_路径,包括
从django.conf.url.static导入静态
从django.conf导入设置
从django.views.static导入服务
URL模式=[
路径('admin/',admin.site.url),
回复路径(r'^',包括('app.url'),
重新路径(r'^static/(?P.*)$),服务,
{'document_root':settings.STATIC_root}),
]
更新:
DEBUG = False
ALLOWED_HOSTS = ['*']
# Application definition
INSTALLED_APPS = [
'crispy_forms',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'menus.apps.MenusConfig',
'events.apps.EventsConfig',
'users.apps.UsersConfig',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'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 = 'project.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [
os.path.join(BASE_DIR, 'templates'),
os.path.join(BASE_DIR, 'users/templates'),
os.path.join(BASE_DIR, 'events/templates'),
os.path.join(BASE_DIR, 'menus/templates'),
],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'project.wsgi.application'
# Database
# https://docs.djangoproject.com/en/2.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# Password validation
# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/2.1/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
DEBUG_PROPAGATE_EXCEPTIONS = True
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'), ]
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
通过在projectURL.py
文件中添加上述内容,Django将检查您的静态URL设置,并连接视图以相应地提供静态文件
此外,如中所述,当处于生产模式时(即,DEBUG=False
),您应该使用web服务器来服务静态文件,而不是django。出于这个原因,staticfiles
将拒绝为您的资产提供服务,如果DEBUG=False
基本上
WhiteNoise可与任何WSGI兼容的应用程序配合使用,但对于Django有一些特殊的自动配置功能
WhiteNoise为您提供最佳实践,例如:
- 提供压缩内容(gzip和Brotli格式,处理
接受编码并正确更改标题)
- 在不会更改的内容上设置将来的缓存头
在settings.py中的任意位置添加此行
STATICFILES_STORAGE = ‘whitenoise.storage.CompressedManifestStaticFilesStorage’
在Heroku上的应用程序中,我使用了来自的指令。在settings.py
中,我配置了:
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATIC_URL = '/static/'
STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static'), ]
STATIC_ROOT = os.path.join(BASE_DIR, 'collectstatic')
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
我还使用此命令将所有文件从静态文件夹复制到static\u ROOT
目录:python manage.py collectstatic
这不起作用,并给出相同的错误。你能解释一下这句话的意思吗?非常感谢你的帮助。我最终在我的工作版本中也使用了这个。不过,我不确定这件作品有多完整,所以如果你能提供任何进一步的解释,我还是会喜欢的。这是行不通的。正如我在文章中提到的,我曾尝试使用whitenoise,但没有成功。我再次尝试上面的那一行只是为了确定,但没有成功。我最终在工作版本中包含了这一行。你能告诉我你为什么特别使用这个存储空间吗?我现在正在使用它(请参阅我文章中的编辑),最后我使用了这一行。当我做了这些更改并且在本地运行python manage.py collectstatic
时,我收到了一条消息0静态文件复制到了
。当我运行heroku运行python manage.py collectstatic
时,我还将0个静态文件复制到“/app/staticfiles”
。将这些行添加到settings.py
中不起作用。另一方面,至少在本地,当我运行python manage.py findstatic--verbosity 2 main.css
时,它现在确实找到了main.css
!尽管如此,从远程错误日志中,我仍然可以得到消息ValueError:Missing staticfiles manifest entry for'/main.css'