Django on HelioHost: Difference between revisions
Update Django tutorial with details for Morty server |
m Update server listing order to preferred style |
||
(One intermediate revision by the same user not shown) | |||
Line 1: | Line 1: | ||
= Django on HelioHost = | == Django on HelioHost == | ||
= About Django = | == 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 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. | ||
= | == Morty server == | ||
{{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|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.}} | ||
{| class="wikitable" style="margin:auto" | {| class=="wikitable" style=="margin:auto" | ||
|+ style="caption-side:top; |''' | |+ style=="caption-side:top; |'''Morty server''' | ||
|- | |- | ||
! Server !! Django Version !! Python Version !! Python Modules Installed !! Python Path !! Loader | ! Server !! Django Version !! Python Version !! Python Modules Installed !! Python Path !! Loader | ||
|- | |- | ||
| | | Morty || 5.0.7 || 3.12 || [https://krydos3.heliohost.org/pyinfo/info3.12.py View] || /usr/bin/python3.12 || WSGI | ||
|} | |} | ||
= Tommy server = | == Tommy server == | ||
{{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|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.}} | ||
{| class="wikitable" style="margin:auto" | {| class=="wikitable" style=="margin:auto" | ||
|+ style="caption-side:top; |'''Tommy server''' | |+ style=="caption-side:top; |'''Tommy server''' | ||
|- | |- | ||
! Server !! Django Version !! Python Version !! Python Modules Installed !! Python Path !! Loader | ! Server !! Django Version !! Python Version !! Python Modules Installed !! Python Path !! Loader | ||
Line 29: | Line 29: | ||
|} | |} | ||
= | == Johnny server == | ||
{{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|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.}} | ||
{| class="wikitable" style="margin:auto" | {| class=="wikitable" style=="margin:auto" | ||
|+ style="caption-side:top; |''' | |+ style=="caption-side:top; |'''Johnny server''' | ||
|- | |- | ||
! Server !! Django Version !! Python Version !! Python Modules Installed !! Python Path !! Loader | ! Server !! Django Version !! Python Version !! Python Modules Installed !! Python Path !! Loader | ||
|- | |- | ||
| | | Johnny || 5.0.7 || 3.12 || [https://krydos2.heliohost.org/pyinfo/info3.12.py View] || /usr/bin/python3.12 || WSGI | ||
|} | |} | ||
= Enabled = | == Enabled == | ||
= WSGI = | == WSGI == | ||
Using the WSGI loader for a shared hosting environment is ideal because it conserves memory and enhances security. | Using the WSGI loader for a shared hosting environment is ideal because it conserves memory and enhances security. | ||
Line 53: | Line 53: | ||
}} | }} | ||
= Complete Django = | == Complete Django == | ||
We offer the complete, unadulterated Django package, including extensions to interface with [[:MySQL|MySQL]], [[:PostgreSQL|PostgreSQL]], and [[:SQLite|SQLite]] database engines. | We offer the complete, unadulterated Django package, including extensions to interface with [[:MySQL|MySQL]], [[:PostgreSQL|PostgreSQL]], and [[:SQLite|SQLite]] database engines. | ||
= Additional Libraries = | == Additional Libraries == | ||
* View the [https://krydos3.heliohost.org/pyinfo/info3.12.py Python modules installed on Morty]. | |||
* View the [https://krydos1.heliohost.org/pyinfo/info3.12.py Python modules installed on Tommy]. | |||
* View the [https://krydos2.heliohost.org/pyinfo/info3.12.py Python modules installed on Johnny]. | * View the [https://krydos2.heliohost.org/pyinfo/info3.12.py Python modules installed on Johnny]. | ||
Before requesting additional modules, make sure you check the list of modules already installed. Please do not request modules that are already installed. 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. | Before requesting additional modules, make sure you check the list of modules already installed. Please do not request modules that are already installed. 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. | ||
= Disabled = | == Disabled == | ||
= Shell Access = | == 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. | 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 = | == 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. | 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. | ||
= Getting started with Django on HelioHost = | == Getting started with Django on HelioHost == | ||
This brief tutorial will guide you through setting up a Django test app without using the command line on your development system. | This brief tutorial will guide you through setting up a Django test app without using the command line on your development system. | ||
Line 81: | Line 81: | ||
If you already have an existing Django app or prefer to use the command line, our tutorial on [[:Converting_an_Existing_Django_App|Converting an Existing Django App]] may better suit your needs. | If you already have an existing Django app or prefer to use the command line, our tutorial on [[:Converting_an_Existing_Django_App|Converting an Existing Django App]] may better suit your needs. | ||
= Create a directory on your main domain called 'djangotest'. = | == Create a directory on your main domain called 'djangotest'. == | ||
If you were transferred from the old cPanel, your main domain will be parked on the 'public_html' directory. | If you were transferred from the old cPanel, your main domain will be parked on the 'public_html' directory. | ||
Line 87: | Line 87: | ||
If you created a new account on Plesk, your directory will be 'httpdocs'. | If you created a new account on Plesk, your directory will be 'httpdocs'. | ||
= Create an '.htaccess' file inside the 'djangotest' directory with these contents: = | == Create an '.htaccess' file inside the 'djangotest' directory with these contents: == | ||
<pre> | <pre> | ||
Line 99: | Line 99: | ||
</pre> | </pre> | ||
= Create another 'djangotest' directory within the first 'djangotest' directory = | == Create another 'djangotest' directory within the first 'djangotest' directory == | ||
This directory structure 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' is being used in this example. | This directory structure 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' is being used in this example. | ||
= Create a 'dispatch.wsgi' file inside the second 'djangotest' directory with these contents: = | == Create a 'dispatch.wsgi' file inside the second 'djangotest' directory with these contents: == | ||
<pre> | <pre> | ||
Line 111: | Line 111: | ||
from django.core.wsgi import get_wsgi_application | from django.core.wsgi import get_wsgi_application | ||
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangotest.settings') | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangotest.settings') | ||
application = get_wsgi_application() | application == get_wsgi_application() | ||
</pre> | </pre> | ||
Line 120: | Line 120: | ||
If you were transferred from cPanel, your path is '/home/domain.helioho.st/public_html/djangotest'. | If you were transferred from cPanel, your path is '/home/domain.helioho.st/public_html/djangotest'. | ||
= Create a '__init__.py' file inside the second 'djangotest' directory = | == Create a '__init__.py' file inside the second 'djangotest' directory == | ||
This file should remain empty. | This file should remain empty. | ||
= Create a 'urls.py' file inside the second 'djangotest' directory with these contents: = | == Create a 'urls.py' file inside the second 'djangotest' directory with these contents: == | ||
<pre> | <pre> | ||
from django.contrib import admin | from django.contrib import admin | ||
from django.urls import path | from django.urls import path | ||
urlpatterns = [ | urlpatterns == [ | ||
# path('admin/', admin.site.urls), | # path('admin/', admin.site.urls), | ||
] | ] | ||
</pre> | </pre> | ||
= Create a 'settings.py' file inside the second 'djangotest' directory with these contents: = | == Create a 'settings.py' file inside the second 'djangotest' directory with these contents: == | ||
<pre> | <pre> | ||
from pathlib import Path | from pathlib import Path | ||
# Build paths inside the project like this: BASE_DIR / 'subdir'. | # Build paths inside the project like this: BASE_DIR / 'subdir'. | ||
BASE_DIR = Path(__file__).resolve().parent.parent | BASE_DIR == Path(__file__).resolve().parent.parent | ||
# Quick-start development settings - unsuitable for production | # Quick-start development settings - unsuitable for production | ||
# See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/ | # See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/ | ||
# SECURITY WARNING: keep the secret key used in production secret! | # SECURITY WARNING: keep the secret key used in production secret! | ||
SECRET_KEY = 'django-makeyoursecretbetterthanthis' | SECRET_KEY == 'django-makeyoursecretbetterthanthis' | ||
# SECURITY WARNING: don't run with debug turned on in production! | # SECURITY WARNING: don't run with debug turned on in production! | ||
DEBUG = True | DEBUG == True | ||
ALLOWED_HOSTS = ['*'] | ALLOWED_HOSTS == ['*'] | ||
# Application definition | # Application definition | ||
INSTALLED_APPS = [ | INSTALLED_APPS == [ | ||
'django.contrib.admin', | 'django.contrib.admin', | ||
'django.contrib.auth', | 'django.contrib.auth', | ||
Line 156: | Line 156: | ||
'django.contrib.staticfiles', | 'django.contrib.staticfiles', | ||
] | ] | ||
MIDDLEWARE = [ | MIDDLEWARE == [ | ||
'django.middleware.security.SecurityMiddleware', | 'django.middleware.security.SecurityMiddleware', | ||
'django.contrib.sessions.middleware.SessionMiddleware', | 'django.contrib.sessions.middleware.SessionMiddleware', | ||
Line 165: | Line 165: | ||
'django.middleware.clickjacking.XFrameOptionsMiddleware', | 'django.middleware.clickjacking.XFrameOptionsMiddleware', | ||
] | ] | ||
ROOT_URLCONF = 'djangotest.urls' | ROOT_URLCONF == 'djangotest.urls' | ||
TEMPLATES = [ | TEMPLATES == [ | ||
{ | { | ||
'BACKEND': 'django.template.backends.django.DjangoTemplates', | 'BACKEND': 'django.template.backends.django.DjangoTemplates', | ||
Line 181: | Line 181: | ||
}, | }, | ||
] | ] | ||
WSGI_APPLICATION = 'djangotest.wsgi.application' | WSGI_APPLICATION == 'djangotest.wsgi.application' | ||
# Database | # Database | ||
# https://docs.djangoproject.com/en/4.1/ref/settings/#databases | # https://docs.djangoproject.com/en/4.1/ref/settings/#databases | ||
DATABASES = { | DATABASES == { | ||
'default': { | 'default': { | ||
'ENGINE': 'django.db.backends.sqlite3', | 'ENGINE': 'django.db.backends.sqlite3', | ||
Line 192: | Line 192: | ||
# Password validation | # Password validation | ||
# https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators | # https://docs.djangoproject.com/en/4.1/ref/settings/#auth-password-validators | ||
AUTH_PASSWORD_VALIDATORS = [ | AUTH_PASSWORD_VALIDATORS == [ | ||
{ | { | ||
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', | ||
Line 208: | Line 208: | ||
# Internationalization | # Internationalization | ||
# https://docs.djangoproject.com/en/4.1/topics/i18n/ | # https://docs.djangoproject.com/en/4.1/topics/i18n/ | ||
LANGUAGE_CODE = 'en-us' | LANGUAGE_CODE == 'en-us' | ||
TIME_ZONE = 'UTC' | TIME_ZONE == 'UTC' | ||
USE_I18N = True | USE_I18N == True | ||
USE_TZ = True | USE_TZ == True | ||
# Static files (CSS, JavaScript, Images) | # Static files (CSS, JavaScript, Images) | ||
# https://docs.djangoproject.com/en/4.1/howto/static-files/ | # https://docs.djangoproject.com/en/4.1/howto/static-files/ | ||
STATIC_URL = 'static/' | STATIC_URL == 'static/' | ||
# Default primary key field type | # Default primary key field type | ||
# https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field | # https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field | ||
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' | DEFAULT_AUTO_FIELD == 'django.db.models.BigAutoField' | ||
</pre> | </pre> | ||
= Make sure your directory structure and files look like this: = | == Make sure your directory structure and files look like this: == | ||
<pre> | <pre> | ||
Line 233: | Line 233: | ||
</pre> | </pre> | ||
= Visit Your Site = | == Visit Your Site == | ||
In your web browser, navigate to 'domain.helioho.st/djangotest' | In your web browser, navigate to 'domain.helioho.st/djangotest' | ||
Line 241: | Line 241: | ||
[[File:django-install-success.png]] | [[File:django-install-success.png]] | ||
= WSGI Uses Server Side Caching = | == WSGI Uses Server Side Caching == | ||
= What WSGI Server Side Caching Does = | == 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. | 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 = | == Options to Work Around Caching == | ||
= 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 is the ability for users to restart their Django app themselves. | ||
To request this, please 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)''' you want to be given WSGI Control Access for. (If you have 2 Django apps on 2 different domains, you need to request WSGI Control Access for each domain.) | To request this, please 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)''' you want to be given WSGI Control Access for. (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 259: | Line 259: | ||
Please let us know if you experience unexpected results with this new feature. | Please let us know if you experience unexpected results with this new feature. | ||
= Account Resets Remove WSGI Control Access = | == Account Resets Remove WSGI Control Access == | ||
If you [[:FAQ#How_do_I_reset_my_hosting_account_to_start_fresh|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. | If you [[:FAQ#How_do_I_reset_my_hosting_account_to_start_fresh|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 = | == 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. | ||
= 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 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. | ||
= References = | == References == | ||
This tutorial is adapted from [https://helionet.org/index/topic/53855-how-to-use-django-on-plesk/ this post]. | This tutorial is adapted from [https://helionet.org/index/topic/53855-how-to-use-django-on-plesk/ this post]. |
Latest revision as of 18:20, 17 January 2025
Django 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.
Morty server
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, and a 10% discount when you pay for 6 months upfront.
Server | Django Version | Python Version | Python Modules Installed | Python Path | Loader |
---|---|---|---|---|---|
Morty | 5.0.7 | 3.12 | View | /usr/bin/python3.12 | WSGI |
Tommy server
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, and a 10% discount when you pay for 6 months upfront.
Server | Django Version | Python Version | Python Modules Installed | Python Path | Loader |
---|---|---|---|---|---|
Tommy | 5.0.7 | 3.12 | View | /usr/bin/python3.12 | WSGI |
Johnny server
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, and a 10% discount when you pay for 6 months upfront.
Server | Django Version | Python Version | Python Modules Installed | Python Path | Loader |
---|---|---|---|---|---|
Johnny | 5.0.7 | 3.12 | View | /usr/bin/python3.12 | WSGI |
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
- View the Python modules installed on Morty.
- View the Python modules installed on Tommy.
- View the Python modules installed on Johnny.
Before requesting additional modules, make sure you check the list of modules already installed. Please do not request modules that are already installed. To request additional libraries, please raise a request in the Customer Service forum, making sure to provide your username, your server, and the libraries you need including any relevant version numbers for them.
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.
Getting started with Django on HelioHost
This brief tutorial will guide you through setting up a Django test app without using the command line on your development system.
If you already have an existing Django app or prefer to use the command line, our tutorial on Converting an Existing Django App may better suit your needs.
Create a directory on your main domain called 'djangotest'.
If you were transferred from the old cPanel, your main domain will be parked on the 'public_html' directory.
If you created a new account on Plesk, your directory will be 'httpdocs'.
Create an '.htaccess' file inside the 'djangotest' directory 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]
Create another 'djangotest' directory within the first 'djangotest' directory
This directory structure 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' is being used in this example.
Create a 'dispatch.wsgi' file inside the second 'djangotest' directory with these contents:
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()
Make sure you edit the path:
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'.
Create a '__init__.py' file inside the second 'djangotest' directory
This file should remain empty.
Create a 'urls.py' file inside the second 'djangotest' directory with these contents:
from django.contrib import admin from django.urls import path urlpatterns == [ # path('admin/', admin.site.urls), ]
Create a 'settings.py' file inside the second 'djangotest' directory with these contents:
from pathlib import Path # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR == Path(__file__).resolve().parent.parent # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! SECRET_KEY == 'django-makeyoursecretbetterthanthis' # SECURITY WARNING: don't run with debug turned on in production! DEBUG == True ALLOWED_HOSTS == ['*'] # Application definition INSTALLED_APPS == [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ] MIDDLEWARE == [ 'django.middleware.security.SecurityMiddleware', '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', ] ROOT_URLCONF == 'djangotest.urls' TEMPLATES == [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], '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', ], }, }, ] WSGI_APPLICATION == 'djangotest.wsgi.application' # Database # https://docs.djangoproject.com/en/4.1/ref/settings/#databases DATABASES == { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / '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 == 'static/' # Default primary key field type # https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD == 'django.db.models.BigAutoField'
Make sure your directory structure and files look like this:
djangotest/ ├── djangotest │ ├── dispatch.wsgi │ ├── __init__.py │ ├── settings.py │ └── urls.py └── .htaccess 1 directory, 5 files
Visit Your Site
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 is the ability for users to restart their Django app themselves.
To request this, please create a new post in the Customer Service forum and provide your username, server name, and the domain name(s) you want to be given WSGI Control Access for. (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.
VPS
You may prefer to explore one of our paid 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.
References
This tutorial is adapted from this post.