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
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
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
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.
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:
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.
Set .env variable for prodThe 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
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
Set .env.test variable for testThe 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:
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:
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:
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
Includes a fancy badge for GitHub README
django-twilio
Currently using Django 1.8.4 for the app framework
AbstractEmailUser
and AbstractNamedUser
shell_plus
, create_command
, export_emails
)TimeStampedModel
and Choices
tasks.py
Currently using NPM engine 2.X. Purpose is to watch and compile frontend files
This project follows best practices as espoused in Two Scoops of Django: Best Practices for Django 1.6.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4