Heavily personalized fork of the project template from "Two Scoops of Django 1.6"
HTML Python JavaScript CoffeeScript Other
#13 Compare This branch is 447 commits ahead of twoscoops:master.

README.md

django-kevin

Django 1.8.4 Requirements Status Dependencies Status devDependencies Status MIT License

A heavily personalized project template for Django 1.8.4 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: 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 PROJECT_NAME

Afterwards please reference the actual README.md you just created in your new project folder, all the references to "{{ project_name }}" will be changed accordingly.

Make virtual environments

Prerequisites: virtualenv, virtualenvwrapper

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

Install python packages

For development:

workon {{ project_name }}-dev
sudo pip install --upgrade pip
sudo pip install --upgrade setuptools
sudo env ARCHFLAGS="-arch i386 -arch x86_64" pip install psycopg2
sudo pip install -r requirements/dev.txt

For production:

workon {{ project_name }}-prod
sudo pip install --upgrade pip
sudo pip install --upgrade setuptools
sudo env ARCHFLAGS="-arch i386 -arch x86_64" pip install psycopg2
sudo pip install -r requirements.txt

For testing:

workon {{ project_name }}-test
sudo pip install --upgrade pip
sudo pip install --upgrade setuptools
sudo env ARCHFLAGS="-arch i386 -arch x86_64" pip install psycopg2
sudo pip install -r requirements/test.txt

Install node packages

Prerequisites: node

sudo npm install

Sometimes the install may stall or not install everything. Try running npm list and then manually installing anything that may be missing.

One-time system installs

Prerequisites: homebrew

In order to use the grunt task runner you need to install it globally:

sudo npm install -g grunt-cli

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 to use django-pipeline for post-processing, you need yuglify installed on your local system:

sudo npm install -g yuglify

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

In order to use Redis for caching and queuing, you need to download it and have it running in the background. This will also set redis-server to automatically run at launch:

brew install redis
ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist
launchctl start ~/Library/LaunchAgents/homebrew.mxcl.redis.plist

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.dev >> .env.dev
echo PYTHONPATH={{ project_name }} >> .env.dev
echo PYTHONUNBUFFERED=True >> .env.dev
echo PYTHONWARNINGS=ignore:RemovedInDjango19Warning >> .env.dev
echo CACHE=dummy >> .env.dev

Recommended to use foreman to use development environment variables and processes:

echo "env: .env.dev" > .foreman
echo "procfile: Procfile.dev" >> .foreman

Compile initial static assets

This will compile all the files in /{{ project_name }}/static for the first run.

grunt build

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

Use the right virtual environment:

workon {{ project_name }}-dev

Start the server with:

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 -n SECRET_KEY=`date | md5` >> .env
sleep 1
echo `date | md5` >> .env
echo DJANGO_SETTINGS_MODULE=config.settings.prod >> .env
echo PYTHONPATH={{ project_name }} >> .env
echo WEB_CONCURRENCY=3 >> .env
echo PYTHONUNBUFFERED=True >> .env
echo PYTHONWARNINGS=ignore:RemovedInDjango19Warning >> .env
echo BUILDPACK_URL=https://github.com/heroku/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 initial Heroku deploy"
heroku create
heroku config:push
git push heroku master

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

git commit -am "Enabled django-pipeline"
git push heroku master
heroku run django-admin.py migrate
heroku open

To run one-off commands like createsuperuser use:

heroku run django-admin.py COMMAND

Debugging tip: sometimes purging the cache can help fix a random error. Just run:

heroku run django-admin.py clear_cache

Run project locally in prod environment

Set the .foreman file to use production environment variables and processes:

echo "env: .env" > .foreman
echo "procfile: Procfile" >> .foreman

Use the right virtual environment:

workon {{ project_name }}-prod

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 in /{{ project_name }}/config/settings/prod.py

heroku config:pull
foreman run django-admin.py collectstatic --noinput
foreman start

The site will be located at localhost:5000

Testing Mode

Set .env.test variable for test

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

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

echo DJANGO_SETTINGS_MODULE=config.settings.test >> .env.test
echo PYTHONPATH={{ project_name }} >> .env.test
echo PYTHONUNBUFFERED=True >> .env.test
echo PYTHONWARNINGS=ignore:RemovedInDjango19Warning >> .env.test

Run tests locally in test environment

Set the .foreman file to use testing environment variables and processes:

echo "env: .env.test" > .foreman
echo "procfile: Procfile.test" >> .foreman

Use the right virtual environment:

workon {{ project_name }}-test

And have static assets prepared (for coverage tests):

grunt build
foreman run django-admin.py collectstatic --noinput

Automatically run all tests and linters and watch files to continuously run tests:

foreman start

You can view the results of the tests in HTML at localhost:9000/tests

You can specifically view the results of Django coverage tests at localhost:9000/tests/django

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.

You can specifically view the results of Jasmine JS unit tests at localhost:9000/tests/jasmine

You can specifically view the results of JS coverage tests at localhost:9000/tests/jasmine/coverage.html

Add-ons & Services

SSL

Enable SSL via Heroku, Cloudflare, or your DNS provider and then uncomment the SECURITY CONFIGURATION section in /{{ project_name }}/config/settings/prod.py to enable security best practices for production.

Invoke

Scripts can be programmed to be run on the command-line using Invoke for repeated tasks like deployment, building, or cleaning. Write your tasks in tasks.py.

Redis Cloud Caching

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

heroku addons:add rediscloud:25

Redis Queue Worker

Add a Redis Queue worker process to Procfile:

echo "worker: django-admin.py rqworker high default low" >> Procfile

Push the changed Procfile to Heroku:

git add Procfile
git commit -m "Added worker process to Procfile, pushing to Heroku"
git push heroku master

Turn on background job worker with this one-liner:

heroku scale worker=1

Redis Queue Scheduler

Add a RQ Scheduler process to Procfile:

echo "scheduler: rqscheduler --url \$REDISCLOUD_URL" >> Procfile

Push the changed Procfile to Heroku:

git add Procfile
git commit -m "Added scheduler process to Procfile, pushing to Heroku"
git push heroku master

Turn on background job scheduler with this one-liner:

heroku scale scheduler=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

Monitoring

Testing

Continuous Integration

Includes a fancy badge for GitHub README

Utilities

Libraries

Python 2.7.9

Currently using Django 1.8.4 for the app framework

base.txt

dev.txt

prod.txt

test.txt

config/lib

  • colorstreamhandler.py - Colored stream handler for python logging framework
  • finders.py - Custom Django finders with ignore setting
  • tdaemon.py - Test daemon in Python modified to work with django-admin.py, django-nose, and coverage

Node 0.12.X

Currently using NPM engine 2.X. Purpose is to watch and compile frontend files

dependencies

devDependencies

Static Assets

Fonts

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: