Converting an Existing Django App: Difference between revisions

m Condense 'Django Versions Available' and 'Python Modules Installed' into a single table for all servers
m Use {{Template:VPSInfo}} for VPS Info
 
(13 intermediate revisions by 2 users not shown)
Line 7: Line 7:
== Django Versions Available ==
== Django Versions Available ==


{{Info|If you need to run Django on another version of Python, you'll need to get a [https://heliohost.org/vps/ VPS]. We offer a range of VPS plans, and a 10% discount when you pay for 6 months upfront.}}
{{Info|To check if a module is already installed, use the '''View''' link for the server and Python version of your choice, and then press '''Ctrl + F''' to search the page for a module name. If there is a result, this means the module is already installed on the server.}}


{| class="wikitable" style="margin:auto"
{| class="wikitable" style="margin:auto"
Line 19: Line 19:
| Johnny || 5.0.7 || 3.12 || [https://krydos2.heliohost.org/pyinfo/info3.12.py View] || /usr/bin/python3.12 || WSGI
| Johnny || 5.0.7 || 3.12 || [https://krydos2.heliohost.org/pyinfo/info3.12.py View] || /usr/bin/python3.12 || WSGI
|}
|}
=== Running Django on a Different Python Version ===
{{Info|If you need to run Django on another version of Python, you'll need to get a VPS. {{Template:VPSInfo}}}}


== Enabled ==
== Enabled ==
Line 29: Line 33:
Django changes can take '''up to 2 hours''' to appear consistently on your site because [[:Converting_an_Existing_Django_App#WSGI_Uses_Server_Side_Caching|WSGI uses server side caching]].
Django changes can take '''up to 2 hours''' to appear consistently on your site because [[:Converting_an_Existing_Django_App#WSGI_Uses_Server_Side_Caching|WSGI uses server side caching]].


If you want site changes to take effect immediately, we offer [[:Converting_an_Existing_Django_App#Options_to_Work_Around_Caching|a few options to work around caching]].
If you want site changes to take effect immediately, we offer [[#Options_to_Work_Around_Caching|a few options to work around caching]].
}}
}}


Line 38: Line 42:
== Additional Libraries ==
== Additional Libraries ==


{{Info|Before requesting additional modules, make sure you check the list of modules already installed. Please do not request modules that are already installed.}}
{{Caution|
Before requesting additional modules, make sure you check the list of modules already installed.
 
When viewing the list of Python modules already installed, press '''Ctrl + F''' to search the page for a module name. If there is a result, this means the module is already installed on the server and you do not need to request it.
 
Please do not request modules that are already installed.}}


{| class="wikitable" style="margin:auto"
{| class="wikitable" style="margin:auto"
Line 51: Line 60:
|}
|}


After checking the list of modules that are already installed, if you need to request additional libraries, please raise a request in the [https://helionet.org/index/forum/45-customer-service/?do=add Customer Service forum], making sure to provide your '''username''', your '''server''', and '''the libraries you need''' including any relevant '''version numbers''' for them.
'''After you have checked''' the list of modules already installed, if you need to request additional libraries, please raise a request in the [https://helionet.org/index/forum/45-customer-service/?do=add Customer Service forum]. Make sure you provide:
# Your account username.
# Your server.
# The version of Python you're using.
# The module(s) you need, including any specific version numbers.


== Disabled ==
== Disabled ==
Line 78: Line 91:
On your local computer, open a terminal, create a new project and perform the minimal configuration:
On your local computer, open a terminal, create a new project and perform the minimal configuration:


<pre>text
<pre>
$ django-admin startproject djangotest
$ django-admin startproject djangotest
$ cd djangotest/ && python3 manage.py migrate
$ cd djangotest/ && python3 manage.py migrate
Line 287: Line 300:
== Request WSGI Control Access ==
== Request WSGI Control Access ==


A new feature currently in beta is the ability for users to restart their Django app themselves.  
A new feature currently in beta on the [[:Morty]] server only is the ability for users to restart their Django app themselves. Please note that this feature takes '''at a minimum''' 260 GB memory per day, which will result in a bill of '''$1.91 or more'''.
 
WSGI Control Access is no longer available on the [[:Tommy]] and [[:Johnny]] servers. Users who need WSGI Control Access can [[:Moving_Your_Account | move their account]] to Morty using our [https://heliohost.org/dashboard/move/ Dashboard page for account moves].


Once you have created a Django app that has a 'dispatch.wsgi file', create a new post in the [https://helionet.org/index/forum/45-customer-service/?do=add Customer Service forum] and provide your '''username''', '''server name''', and the '''domain name(s)''' for which you want WSGI Control Access. (If you have 2 Django apps on 2 different domains, you need to request WSGI Control Access for each domain.)
To try to keep the cost as low as possible, users on Morty also have the option to request that WSGI Control Access be temporarily enabled it to allow for debugging. Once they have completed troubleshooting, they can request for WSGI Control Access to be disabled.
 
Once you have created a Django app that has a 'dispatch.wsgi' file, create a new post in the [https://helionet.org/index/forum/45-customer-service/?do=add Customer Service forum]. Make sure to provide:
# Your username.
# Confirmation that you are on the Morty server.
# Confirmation that you have already created a 'dispatch.wsgi' file.
# Confirmation that you understand that WSGI Control Access uses '''at a minimum''' 260 GB memory per day and your bill will probably be about '''$1.91 or more per month'''.
# The domain name(s) for which you want WSGI Control Access. '''Note:''' If you have 2 Django apps on 2 different domains, you need to request WSGI Control Access for each domain.


Once you have been given WSGI Control Access, you can edit your 'dispatch.wsgi' to reload your Django app so new code changes load immediately. The edits to the file can be as simple as adding or removing a space or a blank line. As long as the file's 'last modified date' changes, it will discard the cache and reload your Django app.
Once you have been given WSGI Control Access, you can edit your 'dispatch.wsgi' to reload your Django app so new code changes load immediately. The edits to the file can be as simple as adding or removing a space or a blank line. As long as the file's 'last modified date' changes, it will discard the cache and reload your Django app.
Line 303: Line 325:
== Use Local Development Environment ==
== Use Local Development Environment ==


Another option to see code changes reflected immediately is to develop your Django app on your home computer and then host the production copy on the server.
Another option to see code changes reflected immediately is to develop your Django app on your home computer and then host the production copy on the server. This is a useful approach for users on the [[:Tommy]] and [[:Johnny]] servers, where WSGI Control Access is no longer offered.  


== VPS ==
== VPS ==


You may prefer to explore one of our paid [https://heliohost.org/vps/ VPS Plan] options, depending on your requirements. We offer a range of VPS plans, and a 10% discount when you pay for 6 months upfront.
You may prefer to upgrade to a VPS, depending on your requirements. {{Template:VPSInfo}} The main advantage of the VPS over Morty is you get root SSH access, which makes Flask development even easier.
 
== Troubleshooting ==
 
=== ImportError: Interpreter change detected - this module can only be loaded into one interpreter per process ===
 
If you receive an error of 'ImportError: Interpreter change detected - this module can only be loaded into one interpreter per process', this happens because we use WSGI in embedded mode to reduce load on [[:Tommy | Tommy]] and [[:Johnny | Johnny.]]
 
On [[:Morty | Morty]] you have the option to use WSGI in daemon mode, but it uses 260 GB memory per day so you would get overage charges every day and pay about $1.91 per month.
 
You can also upgrade to a VPS to get rid of the error. {{Template:VPSInfo}}
 
== Further Support ==
 
If this tutorial has not worked for you, please go back and check all of your steps again to make sure you didn't miss anything. If you can't figure out what is wrong, please check your account [[:View_Error_Logs | error logs]], since these will often provide information that can help you resolve the problem. If you're still stuck, please post in the [https://helionet.org/index/forum/45-customer-service/?do=add Customer Service forum], making sure to provide your '''username''' and any '''error message(s)''' received.


== References ==
== References ==
Line 313: Line 349:
* This tutorial is adapted from [https://www.helionet.org/index/topic/27585-django-on-tommy/?p=126077 this post] on the HelioNet forum.
* This tutorial is adapted from [https://www.helionet.org/index/topic/27585-django-on-tommy/?p=126077 this post] on the HelioNet forum.
* A ready-made template using an older Django version (1.11) is available at [https://github.com/rahul-gj/cookiecutter-helio https://github.com/rahul-gj/cookiecutter-helio].
* A ready-made template using an older Django version (1.11) is available at [https://github.com/rahul-gj/cookiecutter-helio https://github.com/rahul-gj/cookiecutter-helio].
[[Category:Tutorials]]

Latest revision as of 17:42, 31 August 2025

Converting an Existing Django App to work on HelioHost

About Django

Django is a web development framework designed specifically for Python. As Ruby on Rails does for Ruby, Django aims to provide an MVC (Model-View-Controller) architecture for web application development as well as a large set of prebuilt libraries to simplify the development of common web app features. Django's modularity also allows easy scalability and enables the reuse of various code blocks, aligning to the DRY ("Don't Repeat Yourself") software development principle.

Django Versions Available

To check if a module is already installed, use the View link for the server and Python version of your choice, and then press Ctrl + F to search the page for a module name. If there is a result, this means the module is already installed on the server.

Server Django Version Python Version Python Modules Installed Python Path Loader
Morty 5.0.7 3.12 View /usr/bin/python3.12 WSGI
Tommy 5.0.7 3.12 View /usr/bin/python3.12 WSGI
Johnny 5.0.7 3.12 View /usr/bin/python3.12 WSGI

Running Django on a Different Python Version

If you need to run Django on another version of Python, you'll need to get a VPS. We offer a range of VPS plans starting at only $4 a month, with storage options from 50 GB to 300 GB, and a 10% discount when you pay for six months upfront.

Enabled

WSGI

Using the WSGI loader for a shared hosting environment is ideal because it conserves memory and enhances security.

Django changes can take up to 2 hours to appear consistently on your site because WSGI uses server side caching.

If you want site changes to take effect immediately, we offer a few options to work around caching.

Complete Django

We offer the complete, unadulterated Django package, including extensions to interface with MySQL, PostgreSQL, and SQLite database engines.

Additional Libraries

Before requesting additional modules, make sure you check the list of modules already installed.

When viewing the list of Python modules already installed, press Ctrl + F to search the page for a module name. If there is a result, this means the module is already installed on the server and you do not need to request it.

Please do not request modules that are already installed.

Server Python Modules Installed
Morty View
Tommy View
Johnny View

After you have checked the list of modules already installed, if you need to request additional libraries, please raise a request in the Customer Service forum. Make sure you provide:

  1. Your account username.
  2. Your server.
  3. The version of Python you're using.
  4. The module(s) you need, including any specific version numbers.

Disabled

Shell Access

We don't offer shell (command line) access to our users. Many Django tutorials and installation instructions assume that users have command line access, which may make working with Python & Django more difficult. Most people tend to develop on their home computer and then upload to their web server, which almost negates the need for this feature. Furthermore, most configuration done through the command line can be done through other methods, such as FTP and manual file editing.

WSGI Daemon Mode

There are two ways to configure Django to work with the mod_wsgi loader in Apache. You can either create a separate daemon for each Django process (daemon mode) or embed Django into the Apache daemon (embedded mode). While daemon mode tends to be the standard among Django admins because of the increased control it offers, we use embedded mode because it can be set up on a per-user basis without very much root-level configuration. Embedded mode is slightly harder to get working (see directions below), and might break compatibility with some Django tutorials. In most cases, it should not be a problem.

Converting an Existing Django App to work on HelioHost

This tutorial will guide you through using the command line on your development system to convert an existing Django app for hosting on HelioHost.

If you prefer not to use the command line, our brief Django on HelioHost tutorial may better suit your needs.

We recommend referring to the official Django documentation and following the introduction tutorial relevant to the Django version you are using. We also suggest using 'virtualenv' to differentiate each Django installation for each project. The below tutorial has been designed for Linux users, but Windows users should work it out easily.

Conventions: The following commands don't need root access to be executed. Shell commands are preceded by a '$' (dollar sign) to differentiate them from the output. The Python executable name used on the local computer is 'python3', but this can vary depending on the distribution used, so change it as needed to match your system requirements.

Create a new project called 'djangotest'

On your local computer, open a terminal, create a new project and perform the minimal configuration:

$ django-admin startproject djangotest
$ cd djangotest/ && python3 manage.py migrate

Verify Project Structure

The below directory structure, with a 'djangotest' folder nested inside another 'djangotest' folder, is standard for a Django project. Please note that you cannot name the project folder 'django', it will not work. This is why the name 'djangotest' has been used for this tutorial.

Make sure that your directory structure and files look like this:

$ tree ../djangotest/

../djangotest/
├── db.sqlite3
├── djangotest
│   ├── __init__.py
│   ├── __pycache__/
│   │   ├── ...
│   ├── asgi.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

2 directories, 10 files

Run the Test Server

Inside the first (outer) 'djangotest' folder, start the testing server.

$ python3 manage.py runserver 0.0.0.0:8000

Watching for file changes with StatReloader
Performing system checks...

System check identified no issues (0 silenced).
May 31, 2024 - 18:12:55
Django version 4.1, using settings 'djangotest.settings'
Starting development server at http://0.0.0.0:8000/
Quit the server with CONTROL-C.

Open Test Server in Browser

By using the test server, you can develop the app on your local computer and changes you make will take effect immediately.

Point your web browser to http://127.0.0.1:8000 and you should see a message confirming the installation worked successfully:

Configuring the Project for Deployment

Django changes can take up to 2 hours to appear consistently on your site because WSGI uses server side caching.

If you want site changes to take effect immediately, we offer a few options to work around caching.

Rename the 'wsgi.py' file to 'dispatch.wsgi'

To prepare the project for deployment, rename the 'wsgi.py' file to 'dispatch.wsgi'. Both files are inside the second (inner) 'djangotest' folder.

$ mv djangotest/wsgi.py djangotest/dispatch.wsgi

Create an '.htaccess' file

Inside the first (outer) 'djangotest' folder, create an '.htaccess' file with these contents:

Options +ExecCGI
RewriteEngine On
RewriteBase /
RewriteRule ^(media/.*)$ - [L]
RewriteRule ^(admin_media/.*)$ - [L]
RewriteRule ^(djangotest/dispatch\.wsgi/.*)$ - [L]
RewriteRule ^(.*)$ djangotest/djangotest/dispatch.wsgi/$1 [QSA,PT,L]

This instructs Apache to redirect all the requests (except those requesting something from 'media/' or 'admin_media/') to the dispatcher file.

Edit the 'dispatch.wsgi' file

Inside the second (inner) 'djangotest' folder, edit the dispatcher file 'dispatch.wsgi' to instruct it how to load your Django settings. Change it from:

import os

from django.core.wsgi import get_wsgi_application

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangotest.settings')

application = get_wsgi_application()

To the below:

import os, sys

# edit your path below
sys.path.append("/home/domain.helioho.st/httpdocs/djangotest")

from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangotest.settings')
application = get_wsgi_application()

Update the code example, beneath where it says "edit your path below", and type in the path to your actual website address, instead of the placeholder 'domain.helioho.st' part.

On Plesk, your path is "/home/domain.helioho.st/httpdocs/djangotest"

If you were transferred from cPanel, your path is "/home/domain.helioho.st/public_html/djangotest"

Edit the 'urls.py' file

Inside the second (inner) 'djangotest' folder, edit the 'urls.py' file. Change it from:

from django.contrib import admin
from django.urls import path

urlpatterns = [
    path('admin/', admin.site.urls),
]

To the below:

from django.contrib import admin
from django.urls import path

urlpatterns = [
#    path('admin/', admin.site.urls),
]

Commenting out the path to the admin interface is done for security reasons, to prevent unauthorized access to the admin panel in a production environment.

Edit the 'settings.py' file

Inside the second (inner) 'djangotest' folder, edit the 'settings.py' file.

Adding the web server address to the app settings will allow the web server to serve your Django app. Change it from:

ALLOWED_HOSTS = []

To the below:

ALLOWED_HOSTS = ["*"]

This will ensure that your website (such as 'domain.heliohost.us') can serve your application from any custom domains you have (such as 'domain.com') as well as every subdomain (such as 'www').

Upload Your Project to HelioHost

Upload the entire first (outer) 'djangotest' folder to your main domain. Make sure that your directory structure and files look like this:

home/
└── domain/
    └── httpdocs/
        ├── .htaccess
        ├── db.sqlite3
        ├── manage.py
        └── djangotest/
            └── djangotest/
                ├── __init__.py
                ├── asgi.py
                ├── dispatch.wsgi
                ├── settings.py
                ├── urls.py
                └── __pycache__/ 
                    ├── ...

Visit Your Deployed Site

Django changes can take up to 2 hours to appear consistently on your site because WSGI uses server side caching.

If you want site changes to take effect immediately, we offer a few options to work around caching.

In your web browser, navigate to 'domain.helioho.st/djangotest'

If you did everything right it should look like this:

WSGI Uses Server Side Caching

What WSGI Server Side Caching Does

Multiple Apache processes are running on the server, and each time you refresh your site you are randomly assigned to one of these processes. If that particular process has already displayed your site, it shows the cached version of your code; otherwise, it shows the new code changes. This means that during the first 2 hours after a site change, you may intermittently see old or new content, depending on which process you get assigned to. This situation will resolve when Apache is restarted, which happens every 2 hours.

Options to Work Around Caching

Request WSGI Control Access

A new feature currently in beta on the Morty server only is the ability for users to restart their Django app themselves. Please note that this feature takes at a minimum 260 GB memory per day, which will result in a bill of $1.91 or more.

WSGI Control Access is no longer available on the Tommy and Johnny servers. Users who need WSGI Control Access can move their account to Morty using our Dashboard page for account moves.

To try to keep the cost as low as possible, users on Morty also have the option to request that WSGI Control Access be temporarily enabled it to allow for debugging. Once they have completed troubleshooting, they can request for WSGI Control Access to be disabled.

Once you have created a Django app that has a 'dispatch.wsgi' file, create a new post in the Customer Service forum. Make sure to provide:

  1. Your username.
  2. Confirmation that you are on the Morty server.
  3. Confirmation that you have already created a 'dispatch.wsgi' file.
  4. Confirmation that you understand that WSGI Control Access uses at a minimum 260 GB memory per day and your bill will probably be about $1.91 or more per month.
  5. The domain name(s) for which you want WSGI Control Access. Note: If you have 2 Django apps on 2 different domains, you need to request WSGI Control Access for each domain.

Once you have been given WSGI Control Access, you can edit your 'dispatch.wsgi' to reload your Django app so new code changes load immediately. The edits to the file can be as simple as adding or removing a space or a blank line. As long as the file's 'last modified date' changes, it will discard the cache and reload your Django app.

Please let us know if you experience unexpected results with this new feature.

Account Resets Remove WSGI Control Access

If you request an account reset you will need to re-request WSGI Control Access after the reset has been completed. By default, account resets will disable WSGI Control Access.

Use Local Development Environment

Another option to see code changes reflected immediately is to develop your Django app on your home computer and then host the production copy on the server. This is a useful approach for users on the Tommy and Johnny servers, where WSGI Control Access is no longer offered.

VPS

You may prefer to upgrade to a VPS, depending on your requirements. We offer a range of VPS plans starting at only $4 a month, with storage options from 50 GB to 300 GB, and a 10% discount when you pay for six months upfront. The main advantage of the VPS over Morty is you get root SSH access, which makes Flask development even easier.

Troubleshooting

ImportError: Interpreter change detected - this module can only be loaded into one interpreter per process

If you receive an error of 'ImportError: Interpreter change detected - this module can only be loaded into one interpreter per process', this happens because we use WSGI in embedded mode to reduce load on Tommy and Johnny.

On Morty you have the option to use WSGI in daemon mode, but it uses 260 GB memory per day so you would get overage charges every day and pay about $1.91 per month.

You can also upgrade to a VPS to get rid of the error. We offer a range of VPS plans starting at only $4 a month, with storage options from 50 GB to 300 GB, and a 10% discount when you pay for six months upfront.

Further Support

If this tutorial has not worked for you, please go back and check all of your steps again to make sure you didn't miss anything. If you can't figure out what is wrong, please check your account error logs, since these will often provide information that can help you resolve the problem. If you're still stuck, please post in the Customer Service forum, making sure to provide your username and any error message(s) received.

References


This page was last edited on 31 August 2025, at 17:42.