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')
通过在project
URL.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'