You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CPanel+Passenger部署Django生产环境:仅根路由可用,其余路由返回500内部服务器错误求助

CPanel+Passenger部署Django生产环境:仅根路由可用,其余路由返回500内部服务器错误求助

我现在碰到个头疼的问题:本地跑完全正常的Django项目,部署到CPanel用Passenger做WSGI服务后,只有根路由/能正常访问,其他所有路由(哪怕是最简单的测试路由)都返回500内部服务器错误,实在找不到问题出在哪,求帮忙看看!

注:哪怕是我加的极简测试路由,在生产环境也报500,本地却完全正常:path('test/', lambda request: HttpResponse('Test route works!'))


主项目urls.py

from django.urls import include, path
from django.http import HttpResponse
urlpatterns = [
    path('', include('accommodation.urls')),
    path('test/', lambda request: HttpResponse('Test route works!')),#This works only on local machine
]

子应用accommodation的urls.py

from django.urls import path
from .views.dashboard_view import dashboard
from .views.booking_view import newBooking,manageBooking,walk_in,walk_in_checkin,check_out,book_workspace,book_room,check_in,booking_requests,get_booking_request_details,delete_booking_request,workspace,check_bed_availability
from .views.guest_view import new_client,new_guest,manageClient,manageGuest,update_guest,delete_guest
from .views.room_view import roomList,room_and_bed_availability,roomMaintenance,stayView,stay_data,dirtyRoom,clean_bed
from .views.settings_view import add_site,manageSite,roomCategory,addRoomCategory,editRoomCategory,bedManagement,addBed,roomManagment, workspaceManagment
from .views.finance_view import Debits,payments,mark_as_paid,completedPayments,rates,processReport,costCenter
from .views.incidents_medical import incidents,medical_cases,add_incident,add_case
from .views.reports_view import generate,generate_report
from .views.miscellaneous_view import meals,vehicleRent


urlpatterns = [

    # Dashboard Routes
    path('', dashboard, name='accommodation_dashboard'), #only this works on live server
    
    #Booking Routes
    path('new_booking/', newBooking, name='new_booking'),
    path('new_booking/book/', book_room, name='book_room'),
    path('manage_booking/', manageBooking, name='manage_booking'),
    path('manage_booking/check_in/<int:booking_id>/', check_in, name='check_in'),
    
    
    path('online_request/', booking_requests, name='online_request'),
    path('online_request/<int:booking_id>/', get_booking_request_details, name='get_booking_request_details'),
    path('online_request/check_bed_availability/<int:bed_id>/<str:checkin_date>/<str:checkout_date>/', check_bed_availability, name='check_bed_availability'),
    path('delete_booking_request/<int:booking_id>/', delete_booking_request, name='delete_booking'),
    path('booking/workspace', workspace, name='workspace'),
    
    #Check-in Routes
    path('check_in/', walk_in, name='check_in'),
    path('check_in_checkin/', walk_in_checkin, name='check_in_checkin'),
    path('check_out/', check_out, name='check_out'),
    ]

Settings.py配置

import os, random, string
from pathlib import Path
from dotenv import load_dotenv
from str2bool import str2bool


load_dotenv()  # take environment variables from .env.

# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent

SECRET_KEY = os.environ.get('SECRET_KEY')
if not SECRET_KEY:
    SECRET_KEY = ''.join(random.choice(string.ascii_lowercase) for i in range(32))

# Enable/Disable DEBUG Mode
DEBUG = str2bool(os.environ.get('DEBUG'))
# DEBUG = False
#print(' DEBUG -> ' + str(DEBUG) ) 

ALLOWED_HOSTS = [
    'accommodation.mydomain.za', 
    'www.accommodation.mydomain.za', 
    'mydomain.za', 
    'www.mydomain.za', 
    '127.0.0.1',
    'mail.mydomain.za',  # Adicione este host
]


# Add here your deployment HOSTS
CSRF_TRUSTED_ORIGINS = [
    'http://mydomain.za',
    'https://mydomain.za',
    'http://accommodation.mydomain.za',
    'https://accommodation.mydomain.za',
    'http://mail.mydomain.za',   
    'https://mail.mydomain.za',  
    'http://localhost:8000',
    'http://localhost:5085',
    'http://127.0.0.1:8000',
    'http://127.0.0.1:5085',
]

RENDER_EXTERNAL_HOSTNAME = os.environ.get('RENDER_EXTERNAL_HOSTNAME')
if RENDER_EXTERNAL_HOSTNAME:    
    ALLOWED_HOSTS.append(RENDER_EXTERNAL_HOSTNAME)

# Application definition

INSTALLED_APPS = [
    'admin_material.apps.AdminMaterialDashboardConfig',
   # "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
   "django.contrib.messages",
    "django.contrib.staticfiles",
    "home",
    'accommodation',
    'django_extensions',
]

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",
    'accommodation.middleware.DisableAuthenticationMiddleware',
]



ROOT_URLCONF = "core.urls"

UI_TEMPLATES = os.path.join(BASE_DIR, 'templates')

TEMPLATES = [
    {
        "BACKEND": "django.template.backends.django.DjangoTemplates",
        "DIRS": [UI_TEMPLATES],  # Diretório global de templates
        "APP_DIRS": True,         # Permite que o Django busque templates dentro de cada app
        "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 = "core.wsgi.application"


# Database
# https://docs.djangoproject.com/en/4.1/ref/settings/#databases

DB_ENGINE   = os.getenv('DB_ENGINE', None)
DB_USERNAME = os.getenv('DB_USERNAME', None)
DB_PASS     = os.getenv('DB_PASS', None)
DB_HOST     = os.getenv('DB_HOST', None)
DB_PORT     = os.getenv('DB_PORT', None)
DB_NAME     = os.getenv('DB_NAME', None)

if DB_ENGINE and DB_NAME and DB_USERNAME:
    DATABASES = { 
        'default': {
            'ENGINE': 'django.db.backends.' + DB_ENGINE, 
            'NAME': DB_NAME,
            'USER': DB_USERNAME,
            'PASSWORD': DB_PASS,
            'HOST': DB_HOST,
            'PORT': DB_PORT,
            'OPTIONS': {
                'options': '-c search_path=accom'
            }
        }, 
    }
else:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': 'db.sqlite3',
        }
    }

# Password validation
# https://docs.djangoproject.com/en/4.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/4.1/topics/i18n/

LANGUAGE_CODE = "en-us"

TIME_ZONE = "UTC"

USE_I18N = True

USE_TZ = True


# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.1/howto/static-files/

STATIC_URL = '/accommodation/static/'
#STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)

STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'


#if not DEBUG:
#    STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
#STATICFILES_STORAGE = 'django.contrib.staticfiles.storage.StaticFilesStorage'

# Default primary key field type
# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"

#LOGIN_URL = '/accommodation/'  # Define a URL de login padrão
#LOGIN_REDIRECT_URL = '/accommodation/'
#LOGOUT_REDIRECT_URL = '/accommodation/'  # Redireciona após logout
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'

LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'file': {
            'level': 'ERROR',
            'class': 'logging.FileHandler',
            'filename': os.path.join(BASE_DIR, 'django_error.log'),
            'formatter': 'verbose',
        },
    },
    'formatters': {
        'verbose': {
            'format': '{levelname} {asctime} {module} {process:d} {thread:d} {message} {exc_info}',
            'style': '{',
        },
    },
    'loggers': {
        'django': {
            'handlers': ['file'],
            'level': 'ERROR',
            'propagate': True,
        },
    },
}

passenger_wsgi.py配置

import sys
import os
import logging
import traceback

# Configuração de log
logging.basicConfig(
    level=logging.ERROR,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    filename='/home/myuser/public_html/accommodation/wsgi_error.log'
)

try:
    # Adicionar projeto ao path
    sys.path.insert(0, '/home/myuser/public_html/accommodation')
    
    # Configurar Django
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "core.settings")
    
    import django
    django.setup()
    
    # Importar o WSGI application
    from django.core.wsgi import get_wsgi_application
    application = get_wsgi_application()
except Exception as e:
    logging.error(f"Erro ao configurar Passenger WSGI: {str(e)}")
    logging.error(traceback.format_exc())
    raise

备注:内容来源于stack exchange,提问作者valdimiro einstein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 18:14:35