Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

django deploying separate web & api endpoints on heroku

I have a web application with an associated API and database.

I'd like to use the same Django models in the API, but have it served separately by different processes so I can scale it independently.

I also don't need the API to serve static assets, or any of the other views.

The complication is that the routes I have defined have the API and the webapp sharing the root domain:

http://domain.com/normal/application/stuff
http://domain.com/api/different/stuff

and additionally my Django apps depend on each other's models and constants (so two different settings.py files with different INSTALLED_APPS doesn't quite solve it).

I guess one way is I could define different processes in my Procfile which just start the Django app, but that in one of the processes it might have different environment variables? I don't think I can change the environment per Proc with heroku:config, I think it would actually have to be a directive in the Procfile.

Anyone have any experience or insight with this? Thanks!

like image 696
lollercoaster Avatar asked Jul 02 '15 16:07

lollercoaster


People also ask

Can we make single page website in Django?

A single page application (SPA) is a web application, which runs in a browser, and does not require a page refresh to load new content. Django is a great framework for handling the backend of single-page applications.

Does Django need a web server?

Django, being a web framework, needs a web server in order to operate. And since most web servers don't natively speak Python, we need an interface to make that communication happen. Django currently supports two interfaces: WSGI and ASGI.


1 Answers

As Daniel said you could just use two settings files, with a shared base. If you want to serve a subset of the urls you should just also create separate url definitions in the ROOT_URLCONF setting.

So your project structure would be something like this:

project/
    project/
       settings/
           __init__.py
           base.py
           normal.py
           api.py
       urls/
           __init__.py
           base.py
           normal.py
           api.py
       wsgi/
           __init__.py
           normal.py
           api.py

settings/normal.py (analog for api) would be somthing like this:

from .base import *
ROOT_URLCONF = 'project.urls.normal
like image 163
jgadelange Avatar answered Sep 20 '22 11:09

jgadelange