valdimiro einstein
valdimiro einstein

Reputation: 107

Error 500 - Internal Server Error on Django on Production server

I’m facing an issue with my Django application running in production on CPanel, and I'm using Passenger for WSGI. The application works fine on the local machine but on the live server it only works the root route (/), but all other routes return a 500 - Internal Server Error. I haven’t been able to pinpoint what’s causing the issue.

Note: even a teste route like this returns the error 500 on live server: path('test/', lambda request: HttpResponse('Test route works!')),

Main URL.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 URL.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")
    
    from django.core.wsgi import get_wsgi_application
    application = get_wsgi_application()

except Exception as e:
    # Log detalhado de qualquer erro de configuração
    logging.error("WSGI Setup Error:")
    logging.error(traceback.format_exc())
    raise

Upvotes: 0

Views: 67

Answers (0)

Related Questions