Skip to content

Instantly share code, notes, and snippets.

@codingforentrepreneurs
Last active June 16, 2023 19:38
Show Gist options
  • Star 22 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save codingforentrepreneurs/76e570d759f83d690bf36a8a8fa4cfbe to your computer and use it in GitHub Desktop.
Save codingforentrepreneurs/76e570d759f83d690bf36a8a8fa4cfbe to your computer and use it in GitHub Desktop.
Django Setup for use in Jupyter Notebooks

Django for Jupyter

It's true packages exist to make it "easy" to use Django inside of a jupyter notebook. I seem to always run into issues successfully running these packages. I've found the below method useful although I cannot recall how I discovered how this works (aka attribution needed).

Requirements

  • Virtual Environment (virtualenv, venv, pipenv, etc)
  • Django installed & project created (we'll use the project name cfehome)
  • Jupyter installed at least in the virtual environment

Setup:

It's simple. Just copy django_for_jupyter.py next to your Jupyter notebook files (.ipynb).

init_django Via Project Name

First cell

from django_for_jupyter import init_django
init_django("cfehome")

Change cfehome to your Django project name.

init_django Using Environment Variables

In, .env:

DJANGO_PROJECT="cfehome"

Or on the CLI:

DJANGO_PROJECT="cfehome" jupyter notebook

First cell

from django_for_jupyter import init_django
init_django()

Change cfehome to your Django project name.

Using Django Models

Now that you've run init_django with no errors. You can import Django models:

Second Cell

from myapp.models import MyModel

MyModel.objects.all()

Simple enough right?

import os, sys
PWD = os.getenv('PWD')
PROJ_MISSING_MSG = """Set an enviroment variable:\n
`DJANGO_PROJECT=your_project_name`\n
or call:\n
`init_django(your_project_name)`
"""
def init_django(project_name=None):
os.chdir(PWD)
project_name = project_name or os.environ.get('DJANGO_PROJECT') or None
if project_name == None:
raise Exception(PROJ_MISSING_MSG)
sys.path.insert(0, os.getenv('PWD'))
os.environ.setdefault('DJANGO_SETTINGS_MODULE', f'{project_name}.settings')
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
import django
django.setup()
@mtparagon5
Copy link

Very cool and much appreciated!

I had issues getting this to work on my windows work pc. Not sure of the exact cause but I was having issues getting the correct directory with os.getenv('PWD').

Instead of:
PWD = os.getenv("PWD")
I had to use:
PWD = os.path.dirname(os.getcwd())

and then instead of os.getenv('PWD') on line 15, I used my new PWD variable:
sys.path.insert(0, PWD)

@deniz195
Copy link

Same for me!

@anton-pytel
Copy link

Very useful! Thank you. Works perfectly with jupyter-lab and xeus-python so having debugger directly in the browser.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment