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, Для тех, у кого такая же проблема, вот шаги, которые я сделал. Надеюсь, это будет полезно:

  1. Убедитесь, что ваш settings.py файл содержит эти строки:
STATIC_ROOT = os.path.join(BASE_DIR, "static")
STATIC_URL = "/static/"
  1. бежать python manage.py collectstatic

  2. Отредактируйте ваш 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)
  1. Если вы развернули свой проект Django в подпапке внутри public_html, а не в каталоге public_html (как у меня), скопируйте папку static в public_html или создайте символическую ссылку с помощью ln -s public_html/static/ public_html/subfolder/static/ (суть в том, что файлы static загружаются только из базового каталога вашего домена/поддомена) (возможно, есть лучшее решение, но это решило мою проблему)
  2. .

Так что я переместил проект в базовый каталог моего домена, и он заработал.

установите whitenoise и все!

  1. pip install whitenoise

  2. settings.py :

    MIDDLEWARE = [
        # ...
        "django.middleware.security.SecurityMiddleware",
        "whitenoise.middleware.WhiteNoiseMiddleware",
        # ...
    ]
    
Вернуться на верх