Deploy Django Web Application to Apache Server Step by Step Guide
In this post, you’ll learn step by step to Deploy Django Web Application to Apache Server Step by Step Guide.
Table of Contents
- Introduction
- Install Libraries
- Install Virtualenv
- Make Project Directory
- Install MySQL Client
- Create a Django Project
- Create a Django App
- Migrate Django Models to MySQL Database
- Setup Django Admin ( using createsuperuser )
- Django CollectStatic Files
- Start Deploying to Apache Web Server
- Resolving Permissions for Accessing Django App
- Configuring Django Apps settings.py File
- Restart Apache Web Server
- Conclusion
Introduction
Django Deployment requires some configuration to be done in an apache server. In this post, we’ll guide you in creating a Django app and deploying it to the server.
Note
Instructions in this post are for Ubuntu users. You can also visit official Django Installation by clicking here
Install Libraries
First, make sure you have installed Python. You can find out python version by opening terminal and typing python –version.
We need to install some libraries to let apache and Django communicate.
- First, use sudo apt-get update that will update existing packages in your Ubuntu System.
- python3-pip is a package manager for python.
- apache2 is a web server.
- libapache2-mod-wsgi-py3 is an adapter for running python application in the apache web server.
sudo apt-get update sudo apt-get install python3-pip apache2 libapache2-mod-wsgi-py3
Install Virtualenv
Virtualenv is helpful when we need to work with different Django application that uses different python versions. This avoids conflicting with other versions.
To install virtualenv type below command.
sudo pip3 install virtualenv
Make Project Directory
Let’s start creating a directory for the project
mkdir django_projects cd django_projects
Now you are inside django_projects directory. Within this directory create a Python virtual environment by typing below command.
virtualenv env
In directory django_projects you will find a folder env which has all python related files.
Now we have to activate env to do that type below command.
source env/bin/activate
You will get output something like this below.
(env)user:~/django_projects$
If you see (env) than it means that env is now activated. If you want to get out then use deactivate command.
Install Django with a specific version
You can install Django using pip command. But note that you must be inside django_projects and env must be activated
(env)user:~/django_projects$ pip3 install django
To install specific Django version use pip3 install django==.
example : pip3 install django==2.2.7
Install MySQL client
This step is optional but if your project uses MySQL as database than we’ll need this.
To install MySQL client for Django type below command.
(env)user:~/django_projects$ pip3 install mysqlclient
You can also a specific which version on MySQL client you would like to install by adding equals to sign pip3 mysqlclient==.
Create a Django Project
To create a new Django app type command below command.
(env)user:~/django_projects$ django-admin startproject test_django
startproject will create a new project and test_django is a project name.
Create a Django App
After startproject command, you can find folder test_django and inside it, there will be a settings.py file which means that Django has created a project.
Now to create app go inside project root and type below command.
(env)user:~/django_projects/test_django$ django-admin startapp myapp
You can see that Django as created myapp in directory django_projects/test_django.
Migrate Django models to MySQL database
Now if you goto settings.py file there is a section DATABASES
there you have to configure database settings.
For MySQL use below settings.
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'database_name', 'USER': 'database_user_name', 'PASSWORD': 'database_password', 'HOST': 'localhost', # Or an IP Address that your DB is hosted on 'PORT': '3306', 'OPTIONS': { 'sql_mode': 'traditional', } } }
If your database does not have PASSWORD
then leave it blank. Now to run your project goto project root django_projects/test_django and type below command.
(env)user:~/django_projects/test_django$ python manage.py runserver
Your response in the terminal will be like this below.
Watching for file changes with StatReloader Performing system checks... System check identified no issues (0 silenced). You have 17 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions. Run 'python manage.py migrate' to apply them. July 06, 2020 - 02:24:38 Django version 2.2.7, using settings 'test_django.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
To see your project in the browser go to http://127.0.0.1:8000/ and you’ll find a page like this below.
If warning shows up like above-unapplied migration(s) then this is because Django has some default models such as authentication, permissions, migrations etc which must be migrated to the database.
To migrate models use below command.
(env)user:~/django_projects/test_django$ python manage.py migrate
You’ll get below message from the terminal like below.
(env)user:~/django_projects/test_django$ python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying admin.0003_logentry_add_action_flag_choices... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying auth.0009_alter_user_last_name_max_length... OK Applying auth.0010_alter_group_name_max_length... OK Applying auth.0011_update_proxy_permissions... OK Applying sessions.0001_initial... OK
Now you can go to the database and you’ll see that all models are migrated to tables in the database.
Setup Django Admin (using createsuperuser)
Django provides backend admin functionality out of the box. To enable this feature type below command.
(env)user:~/django_projects/test_django$ python manage.py createsuperuser
You’ll be asked to type authentication-related information such as username, email and password using these you’ll be logging to Django Administration Panel.
To login into admin panel goto URL http://127.0.0.1:8000/admin/login/ and you be shown login below like below.
And after you type username and password you’ll be redirected to this page like below.
Django CollectStatic files
Static Files are those CSS, images and js files and while deploying our app Django recommends to use collectstatic command and this command will create a folder in the root directory of our project and stores all our projects static files in that folder.
To set the static folder goto settings.py file and at end of document specify STATIC_URL
and STATIC_ROOT
.
STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'static')
Run below command to collect all the project static files into the static folder.
(env)user:~/django_projects/test_django$ python manage.py collectstatic
Now exit env by typing below command.
deactivate
Start Deploying to Apache Web Server
Create and Configure the .conf file for Django App
To configure the Apache Web Server to host our Django app we’ll create a virtual host file by below command.
sudo nano /etc/apache2/sites-available/testdjango.conf
and to tell apache webserver about location of our Django project add below content to file.
<VirtualHost *:80> ServerAdmin admin@testdjango.localhost ServerName testdjango.localhost ServerAlias www.testdjango.localhost DocumentRoot /home/django_projects/test_django ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined Alias /static /home/django_projects/test_django/static <Directory /home/django_projects/test_django/static> Require all granted </Directory> Alias /static /home/django_projects/test_django/media <Directory /home/django_projects/test_django/media> Require all granted </Directory> <Directory /home/django_projects/test_django> <Files wsgi.py> Require all granted </Files> </Directory> WSGIDaemonProcess django_project python-path=/home/django_projects/test_django python-home=/home/django_projects/test_django/env WSGIProcessGroup django_project WSGIScriptAlias / /home/django_projects/test_django/wsgi.py </VirtualHost>
test_django.conf contains all the details of our projects location and static folders.
Enable Virtual Host
After this, we must enable our newly created host to do that use below command.
cd /etc/apache2/sites-available sudo a2ensite testdjango.conf
Adding the project URL to host file
127.0.0.1 testdjango.localhost
We’ll access our app using url testdjango.localhost.
Resolving Permissions for accessing the Django app.
sudo ufw allow 'Apache Full'
Allows apache to access Django application out of its scope.
Other Permissions related to database and project
sudo chown :www-data /home/django_projects/test_django/
To check whether all the above steps are correct and have no syntax errors type below command.
sudo apache2ctl configtest
Below output will be displayed.
Syntax OK
Configuring Django Apps settings.py File
We must add testproject.localhost to ALLOWED_HOSTS
in Django settings.py file.
ALLOWED_HOSTS = ['testproject.localhost']
Restart Apache Web Server
You may find your Django app not displaying in the webpage for this you need to restart the apache web server.
sudo service apache2 restart
Now if you goto URL testproject.localhost it will display your Django app.
Conclusion
So we have come to the conclusion part of our Deploy Django Web Application to Apache Server Step by Step Guide.
If you like this then please share and for queries comment below. We’ll reach to you soon.
Related Posts
- How to Send Emails and Attachments using Django
- Python Django – Multiple Files Validation and Uploads




