DEV Community

Cover image for HOW TO DEPLOY EXISTING DJANGO PROJECTS TO RENDER
Okputu Julius
Okputu Julius

Posted on

HOW TO DEPLOY EXISTING DJANGO PROJECTS TO RENDER

In this post I would be demonstrating how to deploy an existing Django project to render, I noticed that the render documentation did not have a guide for persons with already existing projects at the time of writing this article.
the source code is available on githubhere
And the live site here

Prerequisites

Before you hop on, make sure you have created an account on render and have an understanding of Virtual environments and poetry, learn more about poetry here

Step 1 Getting started

Before we can proceed to deploy our application to render, we need to install poetry(a python package for managing dependencies and environments)

To install poetry run the following code in the terminal:
For Linux/macOS/gitbash

shell
curl -sSL https://install.python-poetry.org | python

For Windows in Powershell:

shell
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | python

To verify the installation run the following command in the terminal:

shell
poetry --version

Update it:

shell
poetry self update

Step 2 Deployment Setup

The Django app I would be deploying has the following folder structure
snippeteapi folder structure
the snippets directory is the project directory and the snippetsapi is the application directory

Create a pyproject.toml file
make sure your virtual environment is activated and you're in the root of your project
run the following command in the terminal:

shell
poetry init

Fill in the prompts:

shell

Package name [snipets-api]:           #leave blank and tap enter
Version [0.1.0]:               #leave blank and tap enter
Description []:                #leave blank and tap enter
Author [okputu julius <juliusstan10@gmail.com>, n to skip]:   #leave blank and tap enter  
License []:  #leave blank and tap enter
Compatible Python versions [^3.10]:   #leave blank and tap enter

Would you like to define your main dependencies interactively? (yes/no) [yes] no       #enter no
Would you like to define your development dependencies interactively? (yes/no) [yes] no   #enter no

Enter fullscreen mode Exit fullscreen mode

After filling all the prompts
a file named pyproject.toml would be created at the root of your project

pyproject.toml

#this  file contains details  and dependencies of the particular project
[tool.poetry]
name = "snipets-api"
version = "0.1.0"
description = ""
authors = ["okputu julius <juliusstan10@gmail.com>"]

[tool.poetry.dependencies]
python = "^3.10"

[tool.poetry.dev-dependencies]

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

Enter fullscreen mode Exit fullscreen mode

Add dependencies to the pyproject.toml

To add dependencies individually:

shell
poetry add <package name>

if the project already has a requirements.txt file
run the following code in the terminal:

shell
poetry add `cat requirements.txt`

note: for windows use PowerShell or gitbash

A file poetry.lock which contains details of the installed dependencies is created

poetry.lock

[[package]]
name = "asgiref"
version = "3.5.2"
description = "ASGI specs, helper code, and adapters"
category = "main"
optional = false
python-versions = ">=3.7"

[package.extras]
tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"]

[[package]]
name = "certifi"
version = "2022.6.15"
description = "Python package for providing Mozilla's CA Bundle."
category = "main"
optional = false
python-versions = ">=3.6"
......
Enter fullscreen mode Exit fullscreen mode

Set Environment Vars and Add Build script
Navigate to your settings.py and add the following :

Don't forget to import os at the beginning of the file

settings.py

import os
...

ALLOWED_HOSTS = ['*']

SECRET_KEY = os.environ.get('SECRET_KEY', default='your secret key')
DEBUG = os.environ.get('DEBUG',default=True,cast=bool)
Enter fullscreen mode Exit fullscreen mode

Create a file build.sh at the root of your project, this would contain the commands that build the app

build.sh

#!/usr/bin/env bash
# exit on error
set -o errexit

poetry install

python manage.py collectstatic --no-input
python manage.py migrate
Enter fullscreen mode Exit fullscreen mode

make sure the script is executable before checking it into git

shell
chmod a+x build.sh

we're going to run our project using gunicorn, add the dependency to your project

shell
poetry add gunicorn

Configure database and static Files

Add the following packages

shell

poetry add dj-database-url psycopg2-binary #for database config
poetry add 'whitenoise   #for static files config
Enter fullscreen mode Exit fullscreen mode

At the top of the settings.py file import dj-database-url
update the databases dictionary with the snippet below and add the WhiteNoise middleware just after SecurityMiddleware

settings.py

import dj_database_url
...

DATABASES = {
    'default': dj_database_url.config(        # Feel free to alter this value to suit your needs.        default='',        conn_max_age=600    )}

...
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',    ... #new
]

Enter fullscreen mode Exit fullscreen mode

in the section where static files are configured,make the following modifications

settings.py

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.0.6/howto/static-files/

# This setting tells Django at which URL static files are going to be served to the user.
# Here, they will be accessible at your-domain.onrender.com/static/...
STATIC_URL = '/static/'
# Following settings only make sense in production and may break development environments.
if not DEBUG:    # Tell Django to copy statics to the `static files` directory
    # in your application directory on Render.
    STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')
    # Turn on the WhiteNoise storage backend that takes care of compressing static files
    # and creating unique names for each version so they can safely be cached forever.
    STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
Enter fullscreen mode Exit fullscreen mode

push the project to any online version control(GitHub/GitLab)

Step 3 Deploying To Render

Render database and web service setup
go to your render dashboard and click on new Postgresql

db

put in details for your new database and after that copy the internal database url

Go to your render dashboard and click on new web service, and connect the repository you want to deploy(be sure to give render permission to access it),after that, you'll be asked to put in configuration details for your app

1
put in a unique name for your service

2
Set the build command to

./build.sh

and the start command to

gunicorn <your-project-directory>.wsgi:application

3
Under Advanced set the following Environment variables

DATABASE_URL : The internal database URL for the database you created above

SECRET_KEY : Click Generate to get a secure random value

PYTHON_VERSION : the python version of your project eg 3.10.6

WEB_CONCURRENCY : 4

That's it, click Create web service for your application to be deployed on render, after the build finishes your app would be available at .onrender.com

Top comments (0)