Configure Django on a Linux shared hosting account (cPanel)
Tags: cpanel, django, hosting, djangohosting
Published: 2021-09-24 04:30:42

## Step 1: Create a Python application in cPanel
The first step is to create a Python application within cPanel that will host the Django project. To do this, follow these steps:

1. Log in to cPanel.
<li>In the **SOFTWARE** section of the cPanel home screen, click **Setup Python App**:
![Setup Python App](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tj61kdf4qn8ci7md848x.png)
3. Click **CREATE APPLICATION** and the following application form appears:
![Create Python App](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1dwxoqjqy544rm9z35hd.png)

4. In the Python version list box, select **3.8.1**.
5. In the **Application root** text box, type myapp.
6. In the **Application URL** list box, select the domain. Leave the rest of the URL blank.
7. Leave the **Application startup file** text box and **Application Entry point** text box blank.
- When these text boxes are blank, cPanel automatically creates a passenger_wsgi.py startup file and default application object for you.
8. In the **Passenger log file** text box, you can optionally specify a log file for the application.

9. In the top right corner of the page, click **CREATE**.
10. At the top of the page, next to **Enter to the virtual environment. To enter to virtual environment, run the command**, copy the command. You will need this information in the following procedure.

## Step 2: Configure the Django project
After you create the Python application in cPanel, you are ready to do the following tasks at the command line:
- Install Django.
- Create and configure the Django project.
- Configure Passenger to work with the Django project.

To do this, follow these steps:

1. Log in to your account using SSH.
2. Activate the virtual environment, using the command you noted in step 10 above. For example: (Replace username with your own)
  ```
source /home/username/virtualenv/myapp/3.8/bin/activate && cd /home/username/myapp
  ```

> The command prompt now starts with (myapp:3.8) to indicate that you are working in the myapp virtual environment with Python 3.8. All of the following commands in this article assume that you are working in the Python virtual environment. If you log out of your SSH session (or deactivate the virtual environment by using the deactivate command), make sure you reactivate the virtual environment before following any of the steps below.

<span>3.</span> To install Django, type the following commands:
```
cd ~
pip install django==3.1
```
<span>4.</span> To create a Django project, type the following command:
```
django-admin startproject myapp ~/myapp
```
<span>5.</span> To create directories for the static project files, type the following commands:
```
mkdir -p ~/myapp/templates/static_pages
mkdir ~/myapp/static_files
mkdir ~/myapp/static_media
```
<span>6.</span> Use a text editor to open the ~/myapp/myapp/settings.py file, and then make the following changes:

- Locate the **ALLOWED_HOSTS** line, and then modify it as follows. Replace **example.com** with your own domain name:
```
ALLOWED_HOSTS = ['example.com']
```
- Locate the **TEMPLATES** block, and then modify it as follows:

```
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [os.path.join(BASE_DIR,'templates')],
        'APP_DIRS': True,
        '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',
            ],
        },
    },
]
```

- Locate the **STATIC_URL** line, and then add the following lines beneath it:
```
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static_files')

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, "static_media")
```
<span>7.</span> Use a text editor to open the ~/myapp/myapp/urls.py file. Delete all of the existing text, and then copy the following text into the file:

```
from django.contrib import admin
from django.urls import path, include
from django.conf import settings
from django.conf.urls.static import static
from django.conf.urls import url
from django.views.generic.base import TemplateView

urlpatterns = [
    path('admin/', admin.site.urls),
    url(r'^$', TemplateView.as_view(template_name='static_pages/index.html'), name='home'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
```
<span>8.</span> Use a text editor to open the ~/myapp/passenger_wsgi.py file. Delete all of the existing text, and then copy the following text into the file:

```
import os
import sys

import django.core.handlers.wsgi
from django.core.wsgi import get_wsgi_application

# Set up paths and environment variables
sys.path.append(os.getcwd())
os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'

# Set script name for the PATH_INFO fix below
SCRIPT_NAME = os.getcwd()

class PassengerPathInfoFix(object):
    """
        Sets PATH_INFO from REQUEST_URI because Passenger doesn't provide it.
    """
    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)

# Set the application
application = get_wsgi_application()
application = PassengerPathInfoFix(application)
```
<span>9.</span> Use a text editor to create a basic index.html file in the ***~/myapp/templates/static_pages*** directory. The file can be as simple as a text file that says Hello world.
<span>10.</span> Type the following command:
```
python ~/myapp/manage.py migrate
```
<span>11.</span> Set up the superuser account:
- Type the following command:
```
python ~/myapp/manage.py createsuperuser
```
- At the **Username** prompt, type the administrator username, and then press Enter.
- At the **Email address** prompt, type the administrator e-mail address, and then press Enter.
- At the **Password** prompt, type the administrator password, and then press Enter.
<span>12.</span>Type the following command to collect the static files:
```
python ~/myapp/manage.py collectstatic
```

> If you are asked if you want to overwrite existing files, type yes and then press Enter.

<span>13.</span> In cPanel, restart the Python application:
- Log in to cPanel.
- In the SOFTWARE section of the cPanel home screen, click Setup Python App.
- Under WEB APPLICATIONS, locate the myapp application, and then click the Restart icon.

<span>14.</span> Test the Django site:

- Use your browser to go to http://www.**example.com**, where **example.com** represents your domain name. The index.html file should load.
- Use your browser to go to http://www.**example.com**/admin, where **example.com** represents your domain name. You should see the Django administration login page. To log in, use the superuser credentials that you created earlier.

> If the web site does not appear in your browser, try running the passenger_wsgi.py file manually. To do this, type the following command:
```
python ~/myapp/passenger_wsgi.py
```
> There should not be any text output to the console when you run this file. If there are any errors, check the syntax in the configuration files.

[Ecourge Innovations](https://ecourge.com)