Skip to content

Heavily personalized fork of the project template from "Two Scoops of Django 1.6"

Notifications You must be signed in to change notification settings

digicase/django-kevin

Repository files navigation

django-kevin

Django 1.7

A heavily personalized project template for Django 1.7 using postgres for development and production. Ready to deploy on Heroku with a bunch of other goodies.

Forked from the original django-two-scoops-project

Creating Your Project

Prerequisites: python, django

To create a new Django project, run the following command replacing {{ project_name }} with your actual project name:

django-admin.py startproject --template=https://github.com/imkevinxu/django-kevin/archive/master.zip --extension=py,md,html,json,coveragerc --name=Procfile,Procfile.dev {{ project_name }}

Make virtual environments

Prerequisites: virtualenv, virtualenvwrapper

cd {{ project_name }}
mkvirtualenv {{ project_name }}-dev && add2virtualenv `pwd`
mkvirtualenv {{ project_name }}-prod && add2virtualenv `pwd`

Install python packages

For development:

workon {{ project_name }}-dev
pip install -r requirements/local.txt

For production:

workon {{ project_name }}-prod
pip install -r requirements.txt

Install node packages

Prerequisites: node, homebrew

sudo npm install

In order to be able to lint SCSS files locally you need ruby on your local system and a certain gem. See https://github.com/ahmednuaman/grunt-scss-lint#scss-lint-task

gem install scss-lint

In order for grunt to notify you of warnings and when the build is finished, you need a notification system installed. Below is the Mac OSX notification command-line tool

brew install terminal-notifier

Development Mode

Set .env.dev variable for dev

The environment variables for development sets the appropriate DJANGO_SETTINGS_MODULE and PYTHONPATH in order to use django-admin.py seemlessly. Necessary for Foreman and other worker processes

.env.dev is not version controlled so the first person to create this project needs to create a .env.dev file for Foreman to read into the environment. Future collaboraters need to email the creator for it.

echo DJANGO_SETTINGS_MODULE=config.settings.local >> .env.dev
echo PYTHONPATH={{ project_name }} >> .env.dev
echo PYTHONUNBUFFERED=True >> .env.dev
echo CACHE=dummy >> .env.dev

Create local postgres database for dev

Prerequisites: Postgres and Heroku Toolbelt

Install Postgres for your OS here. For Max OSX the easiest option is to download and run Postgres.app.

# Make sure Postgres.app is running
workon {{ project_name }}-dev
createdb {{ project_name }}-dev
foreman run django-admin.py migrate

Run project locally in dev environment

Recommended to use foreman to start processes:

By default, .foreman uses the development versions of .env and Procfile

foreman start

Create a local super user with:

foreman run django-admin.py createsuperuser

To run one-off commands use:

foreman run django-admin.py COMMAND

To enable Live Reload, download and turn on a browser extension.

Production Mode

Set .env variable for prod

The environment variables for production must contain a separate SECRET_KEY for security and the appropriate DJANGO_SETTINGS_MODULE and PYTHONPATH in order to use django-admin.py seemlessly. Hacky use of date | md5 to generate a pseudo-random string.

.env is not version controlled so the first person to create this project needs to create a .env file for Foreman and Heroku to read into the environment. Future collaboraters need to email the creator for it.

echo "SECRET_KEY=`date | md5`" >> .env
echo "DJANGO_SETTINGS_MODULE=config.settings.production" >> .env
echo "PYTHONPATH={{ project_name }}" >> .env
echo "WEB_CONCURRENCY=3" >> .env
echo "PYTHONUNBUFFERED=True" >> .env
echo "BUILDPACK_URL=https://github.com/ddollar/heroku-buildpack-multi.git" >> .env

Deploy to Heroku

Prerequisites: Heroku Toolbelt and heroku-config

First step is to deploy to Heroku with the post_compile script in bin/ so that node functions can be installed for python to call them.

git init
git add .
git commit -m "ready for heroku deploy"
heroku create
heroku config:push
git push heroku master

After post_compile is successful, uncomment line 205 in /{{ project_name }}/config/settings/base.py with the variable STATICFILES_STORAGE to enable django-pipeline.

git commit -am "enabled django-pipeline"
git push heroku master
heroku open

If you're sure all database migrations are in good condition, migrate models with:

heroku run django-admin.py migrate

To run one-off commands use:

heroku run django-admin.py COMMAND

Run project locally in prod environment

Make sure to edit the .foreman file to use production versions of .env and Procfile

This is meant to mimic production as close as possible using both the production database and environment settings so proceed with caution.

WARNING: If this project has SSL turned on, localhost:5000 won't work anymore because it will always try to redirect to https://localhost:5000. To fix this comment out the SECURITY CONFIGURATION section of production.py lines 66-85.

workon {{ project_name }}-prod
pip install -r requirements.txt
heroku config:pull
foreman run django-admin.py collectstatic --noinput
foreman start

The site will be located at localhost:5000.

Testing

Jasmine JS Unit Tests

Grunt automatically compiles Jasmine tests written in coffeescript at /{{ project_name }}/static/js/tests/coffee and runs the tests upon every save.

Grunt also creates a static file server to view the results of the test located at localhost:9000/tests/jasmine.html.

Add-ons

SSL

Enable SSL via Heroku, Cloudflare, or your DNS provider and then uncomment lines 84-108 in /{{ project_name }}/config/settings/production.py to enable django-secure security best practices for production.

Redis Cloud

In order to enable redis for caching and queues, add Redis Cloud to Heroku.

heroku addons:add rediscloud:25

Redis Queue

Turn on background job worker queue with this one-liner:

heroku scale worker=1

Amazon S3

To use Amazon S3 as a static and media file storage, create a custom Group and User via IAM and then a custom static bucket and media bucket with public read policies.

Add the following config variables to Heroku:

heroku config:set AWS_ACCESS_KEY_ID=INSERT_ACCESS_KEY_ID
heroku config:set AWS_SECRET_ACCESS_KEY=INSERT_SECRET_ACCESS_KEY
heroku config:set AWS_STATIC_STORAGE_BUCKET_NAME={{ project_name }}-static
heroku config:set AWS_MEDIA_STORAGE_BUCKET_NAME={{ project_name }}-media

Libraries

Python 2.7.8

Currently using Django 1.7 for the app framework

base.txt

local.txt

production.txt

test.txt

Node 0.10.X

post_compile

Using post_compile script for the Heroku python environment to recognize node packages

package.json

Locally using node and grunt to watch and compile frontend files

Static Assets

Fonts

  • SS-Standard 1.005 - Standard icon library as a font. Documentation located locally at /{{ project_name }}/static/css/fonts/ss-standard/documentation.html

CSS

JS

Jasmine

Acknowledgements

Two Scoops of Django

This project follows best practices as espoused in Two Scoops of Django: Best Practices for Django 1.6.

Many thanks to:

  • Daniel Greenfield and Audrey Roy for writing the book
  • Randall Degges for django-skel
  • All of the contributors to the original fork

About

Heavily personalized fork of the project template from "Two Scoops of Django 1.6"

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages

  • HTML 44.5%
  • Python 28.4%
  • JavaScript 22.8%
  • CoffeeScript 2.8%
  • Other 1.5%