Skip to content

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

Notifications You must be signed in to change notification settings

ibrahim12/django-kevin

 
 

Repository files navigation

django-kevin

Django 1.7.7 Stablility Status Requirements Status Dependencies Status MIT License

A heavily personalized project template for Django 1.7.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

Notes Upgrading to Django 1.8

  • Template configuration has been redesigned to use different settings and functions to take into account multiple engines
  • Security enhancements have been integrated from django-secure, do they work together?
  • UUIDField data type has been added naturally, how does it migrate from the same UUIDField from django_extensions?

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
pip install --upgrade pip
pip install --upgrade setuptools
sudo env ARCHFLAGS="-arch i386 -arch x86_64" pip install psycopg2
pip install -r requirements/dev.txt

For production:

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

For testing:

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

Install node packages

Prerequisites: node

sudo npm install

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:RemovedInDjango18Warning >> .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

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 SECRET_KEY=`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:RemovedInDjango18Warning >> .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

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:RemovedInDjango18Warning >> .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):

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 django-secure and other 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

PG Backups

PG Backups is a Heroku add-on for automatic Postgres database backups. Enable with the following one-liner:

heroku addons:add pgbackups:auto-month

Monitoring

Testing

Continuous Integration

Includes a fancy badge for GitHub README

Utilities

Libraries

Python 2.7.9

Currently using Django 1.7.7 for the app framework

base.txt

dev.txt

prod.txt

test.txt

config/lib

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

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:

About

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

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages

  • HTML 46.4%
  • Python 28.8%
  • JavaScript 20.3%
  • CoffeeScript 2.9%
  • Other 1.6%