Django static在cPanel Passenger返回404错误



我使用cPanel并使用passenger_wsgi.py在我的服务器上部署了一个Django应用程序。问题是,当我试图访问静态文件(如管理CSS文件:static/admin/css/base.css),我面临404错误。我已经完成了collectstatic并将PassengerPathInfoFix方法添加到passenger_wsgi.py文件,但输出日志是

Not Found:/home/mysite/public_html/build/static/admin/css/base.css

,即使输出路径存在,我可以使用vim编辑它。

Mysettings.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. runpython 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文件只从您的域/子域基础目录加载)(也许有更好的解决方案,但这解决了我的问题)

所以我把项目移到我的域名的基本目录,它工作了。

安装白噪声,就可以了!

  1. pip install whitenoise

  2. settings.py:

    MIDDLEWARE = [
    # ...
    "django.middleware.security.SecurityMiddleware",
    "whitenoise.middleware.WhiteNoiseMiddleware",
    # ...
    ]