Django statics возвращает 404 ошибку в cPanel Passenger
Я использовал cPanel и развернул приложение Django на своем сервере с помощью passenger_wsgi.py
. Проблема в том, что когда я пытаюсь получить доступ к статическим файлам (например, к CSS файлу администратора: static/admin/css/base.css
), я сталкиваюсь с ошибкой 404.
Я уже сделал collectstatic
и добавил метод PassengerPathInfoFix
в файл passenger_wsgi.py
, но выходной журнал выглядит следующим образом
Не найдено: /home/mysite/public_html/static/admin/css/base.css
.
несмотря на то, что выводимый путь существует и я могу редактировать его с помощью vim
.
Мой settings.py
:
STATIC_ROOT = os.path.join(BASE_DIR, "static")
STATIC_URL = "/static/"
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
Любая помощь будет принята с благодарностью.
Добавьте это в url.py
from django.conf.urls.static import static
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
Надеюсь, это поможет!
Вы можете попробовать изменить STATIC_URL на STATICFILES_DIRS, это работает у меня!
STATICFILES_DIRS = [
BASE_DIR / 'static',
BASE_DIR / 'static/admin',
]
Спасибо за ответ Ali, Для тех, у кого такая же проблема, вот шаги, которые я сделал. Надеюсь, это будет полезно:
- Убедитесь, что ваш
settings.py
файл содержит эти строки:
STATIC_ROOT = os.path.join(BASE_DIR, "static")
STATIC_URL = "/static/"
бежать
python manage.py collectstatic
Отредактируйте ваш
passenger_wsgi.py
и добавьте эти строки:
# ...
# Import WSGI of your project
# Project Static File Path
cwd = os.getcwd()
sys.path.append(cwd)
sys.path.append(cwd + '/myapp')
SCRIPT_NAME = os.getcwd()
class PassengerPathInfoFix(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
from urllib.parse import unquote
environ['SCRIPT_NAME'] = SCRIPT_NAME
request_uri = unquote(environ['REQUEST_URI'])
script_name = unquote(environ.get('SCRIPT_NAME', ''))
offset = request_uri.startswith(script_name) and len(environ['SCRIPT_NAME']) or 0
environ['PATH_INFO'] = request_uri[offset:].split('?', 1)[0]
return self.app(environ, start_response)
application = PassengerPathInfoFix(application)
- Если вы развернули свой проект Django в подпапке внутри
public_html
, а не в каталогеpublic_html
(как у меня), скопируйте папкуstatic
вpublic_html
или создайте символическую ссылку с помощьюln -s public_html/static/ public_html/subfolder/static/
(суть в том, что файлыstatic
загружаются только из базового каталога вашего домена/поддомена) (возможно, есть лучшее решение, но это решило мою проблему) .
Так что я переместил проект в базовый каталог моего домена, и он заработал.
установите whitenoise и все!
pip install whitenoise
settings.py :
MIDDLEWARE = [ # ... "django.middleware.security.SecurityMiddleware", "whitenoise.middleware.WhiteNoiseMiddleware", # ... ]