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
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.
Prerequisites: virtualenv, virtualenvwrapper
cd {{ project_name }}
mkvirtualenv {{ project_name }}-dev && add2virtualenv `pwd`
mkvirtualenv {{ project_name }}-prod && add2virtualenv `pwd`
mkvirtualenv {{ project_name }}-test && add2virtualenv `pwd`
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
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.
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
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
This will compile all the files in /{{ project_name }}/static for the first run.
grunt build
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
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.
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
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
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
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
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
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
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.
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.
In order to enable redis for caching and queues, add Redis Cloud to Heroku.
heroku addons:add rediscloud:25
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
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
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
- Librato for Heroku performance monitoring
- New Relic for server performance monitoring (protip: set availability monitoring on to avoid Heroku idling)
- RedisMonitor for Redis server monitoring
- Logentries provides logging backups as well as search and notifications. Can also additionally backup to S3
- Sentry for error tracking with Raven as the client. Make sure to use a synchronous blocking transport.
- Ranger to alert you when your app is down
- Rainforest QA for simple integration testing
- Tinfoil Security for regularly scanning your app for security vulnerabilities
- Loader.io for load testing
Includes a fancy badge for GitHub README
- Travis CI for continuous integration testing
- Coveralls.io for coverage testing
- Requires.io for dependency management
- Filepicker for file uploading and content management
- Twilio for sending SMS, MMS, and Voice. Recommended to use
django-twilio - Mailgun or Sendgrid for email sending. Here are some useful email templates
- MailChimp for email newsletters or create your own custom newsletter emails
Currently using Django 1.8.4 for the app framework
- bpython 0.14.2 - Advanced python interpreter/REPL
- defusedxml 0.4.1 - Secure XML parser protected against XML bombs
- dj-static 0.0.6 - Serve production static files with Django
- django-authtools 1.2.0 - Custom User model classes such as
AbstractEmailUserandAbstractNamedUser - django-braces 1.8.1 - Lots of custom mixins
- django-clear-cache 0.3 - Simple Django management command that clears your cache
- django-extensions 1.5.6 - Useful command line extensions (
shell_plus,create_command,export_emails) - django-floppyforms 1.5.2 - Control of output of form rendering
- django-model-utils 2.3.1 - Useful model mixins and utilities such as
TimeStampedModelandChoices - django-pipeline 1.5.4 - CSS and JS compressor and compiler. Also minifies HTML
- django-redis 4.2.0 - Enables redis caching
- django-rq 0.8.0 - Django integration for RQ
- invoke 0.10.1 - Python task execution in
tasks.py - logutils 0.3.3 - Nifty handlers for the Python standard library’s logging package
- project-runpy 0.3.1 - Helpers for Python projects like ReadableSqlFilter
- psycopg2 2.6.1 - PostgreSQL adapter
- python-magic 0.4.6 - Library to identify uploaded files' headers
- pytz 2015.4 - World timezone definitions
- requests 2.7.0 - HTTP request API
- rq-scheduler 0.5.1 - Job scheduling capabilities to RQ
- six 1.9.0 - Python 2 and 3 compatibility utilities
- static 1.1.1 - Serves static and dynamic content
- unicode-slugify 0.1.3 - A slugifier that works in unicode
- Werkzeug 0.10.4 - WSGI utility library with powerful debugger
- django-debug-toolbar 1.3.2 - Debug information in a toolbar
- django-sslserver 0.15 - SSL localhost server
- Collectfast 0.2.3 - Faster collectstatic
- boto 2.38.0 - Python interface to AWS
- dj-database-url 0.3.0 - Allows Django to use database URLs for Heroku
- django-storages 1.1.8 - Custom storage backends; using S3
- gunicorn 19.3.0 - Production WSGI server with workers
- coverage 3.7.1 - Measures code coverage
- nose-exclude 0.4.1 - Easily specify directories to be excluded from testing
- django-nose 1.4.1 - Django test runner using nose
- factory-boy 2.5.2 - Test fixtures replacement for Python
- flake8 2.4.1 - Python style checker
- 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
Currently using NPM engine 2.X. Purpose is to watch and compile frontend files
- browserify 11.0.1 - Browser-side require() the node.js way
- coffee-script 1.10.0 - Cleaner JavaScript
- grunt 0.4.5 - Automatic Task Runner
- grunt-cli 0.1.13 - Grunt's command line interface
- grunt-autoprefixer 3.0.3 - Parse CSS and add vendor-prefixed CSS properties
- grunt-contrib-clean 0.6.0 - Clear files and folders
- grunt-contrib-coffee 0.13.0 - Compile CoffeeScript files to JavaScript
- grunt-contrib-imagemin 0.9.4 - Minify PNG, JPEG, GIF, and SVG images
- grunt-contrib-jasmine 0.9.1 - Run jasmine specs headlessly through PhantomJS
- grunt-sass 1.0.0 - Compile Sass to CSS
- grunt-template-jasmine-istanbul 0.3.4 - Code coverage template mix-in for grunt-contrib-jasmine, using istanbul
- grunt-text-replace 0.4.0 - General purpose text replacement for grunt
- load-grunt-config 0.17.2 - Grunt plugin that lets you break up your Gruntfile config by task
- time-grunt 1.2.1 - Display the elapsed execution time of grunt tasks
- yuglify 0.1.4 - UglifyJS and cssmin compressor
- coffeelint 1.11.1 - Lint your CoffeeScript
- grunt-coffeelint 0.0.13 - Lint your CoffeeScript
- grunt-concurrent 2.0.3 - Run grunt tasks concurrently
- grunt-contrib-connect 0.11.2 - Start a static web server
- grunt-contrib-copy 0.8.1 - Copy files and folders
- grunt-contrib-watch 0.6.1 - Run tasks whenever watched files change
- grunt-newer 1.1.1 - Configure Grunt tasks to run with changed files only
- grunt-notify 0.4.1 - Automatic desktop notifications for Grunt
- grunt-open 0.2.3 - Open urls and files from a grunt task
- grunt-scss-lint 0.3.8 - Lint your SCSS
- grunt-shell 1.1.2 - Run shell commands
- SS-Standard 1.005 - Standard icon library as a font. Documentation
- Bootstrap 3.3.5 - CSS/JS starting framework
- jQuery 1.11.3 - Useful JS functions
- Bootstrap 3.3.5 - CSS/JS starting framework
- Underscore.js 1.8.3 - Very useful functional programming helpers
- CSRF.js - Django Cross Site Request Forgery protection via AJAX
- Jasmine-Ajax 2.0.1 - Set of helpers for testing AJAX requests with Jasmine
- Jasmine-jQuery 2.0.5 - Set of jQuery helpers for Jasmine
This project follows best practices as espoused in Two Scoops of Django: Best Practices for Django 1.6.
- Daniel Greenfield and Audrey Roy for writing the book
- All of the contributors to the original fork