mirror of
https://github.com/cookiecutter/cookiecutter-django.git
synced 2024-11-22 17:47:08 +03:00
Merge branch 'master' of https://github.com/pydanny/cookiecutter-django
This commit is contained in:
commit
1f36ed3c8e
42
CHANGELOG.md
42
CHANGELOG.md
|
@ -2,6 +2,48 @@
|
|||
All enhancements and patches to cookiecutter-django will be documented in this file.
|
||||
This project adheres to [Semantic Versioning](http://semver.org/).
|
||||
|
||||
## [2015-10-22]
|
||||
### Removed
|
||||
- Remove unnecessary .gitkeep in static/images/ (@audreyr)
|
||||
|
||||
## [2015-10-21]
|
||||
### Changed
|
||||
- TODO (@pydanny)
|
||||
- TODO (@theskumar)
|
||||
|
||||
## [2015-10-19]
|
||||
### Changed
|
||||
- On Windows, don't install psycopg2 locally. Still install it in test/prod which are assumed to be Unix. (@audreyr)
|
||||
|
||||
## [2015-10-15]
|
||||
### Changed
|
||||
- Made `post_gen_hook` function to change secret keys in files more generic (@pydanny)
|
||||
- Set cryptographically randomized value to `DJANGO_SECRET_KEY` in `env.example` (@pydanny)
|
||||
|
||||
## [2015-10-14]
|
||||
### Added
|
||||
- Documention of project options (@audreyr)
|
||||
### Changed
|
||||
- Added clarification on building for local or production (@MathijsHoogland)
|
||||
- Whitespace correction in dev.yml (@MathijsHoogland)
|
||||
|
||||
## [2015-10-13]
|
||||
### Changed
|
||||
- Requirements update (@theskumar)
|
||||
|
||||
## [2015-10-11]
|
||||
### Changed
|
||||
- Fixed raven issue on development (#302) (@jazztpt )
|
||||
|
||||
## [2015-10-05]
|
||||
### Changed
|
||||
- Update version of Django, Pillow, hitchselenium, psutil (@luzfcb)
|
||||
|
||||
## [2015-10-04]
|
||||
### Changed
|
||||
- Remove stray closing tags and fix navbar margin in in base.html (@hairychris)
|
||||
- Docker docs to be functional and more understandable (@audreyr)
|
||||
|
||||
## [2015-09-30]
|
||||
### Changed
|
||||
- Fixed Sentry logging with celery (@jayfk)
|
||||
|
|
|
@ -56,6 +56,9 @@ Code Contributors
|
|||
* @kaidokert
|
||||
* Raphael Pierzina / @hackebrot
|
||||
* Alvaro [Andor] / @andor-pierdelacabeza
|
||||
* Chris Franklin / @hairychris
|
||||
* Anna Callahan / @jazztpt
|
||||
* Mathijs Hoogland / @MathijsHoogland
|
||||
|
||||
\* Possesses commit rights
|
||||
|
||||
|
|
|
@ -4,29 +4,28 @@ Getting Up and Running with Docker
|
|||
.. index:: Docker
|
||||
|
||||
The steps below will get you up and running with a local development environment.
|
||||
All of these commands assume you are in the root of your generated project.
|
||||
|
||||
Prerequisites
|
||||
--------------
|
||||
|
||||
If you don't already have these installed, get them all by installing `Docker Toolbox`_.
|
||||
|
||||
* docker
|
||||
* docker-machine
|
||||
* docker-compose
|
||||
* virtualbox
|
||||
|
||||
If you don't already have these installed, you can get them at:
|
||||
.. _`Docker Toolbox`: https://github.com/docker/toolbox/releases
|
||||
|
||||
* https://github.com/docker/toolbox/releases
|
||||
* https://www.virtualbox.org/wiki/Downloads
|
||||
Create the Machine (Optional)
|
||||
-------------------------------
|
||||
|
||||
Go to the Root of your Project
|
||||
------------------------------
|
||||
On Ubuntu you have native Docker, so you don't need to create a VM with
|
||||
docker-machine to use it.
|
||||
|
||||
All of these commands assume you are in the root of your generated project.
|
||||
|
||||
Create the Machine
|
||||
-------------------
|
||||
|
||||
::
|
||||
However, on Mac/Windows/other systems without native Docker, you'll want to
|
||||
start by creating a VM with docker-machine::
|
||||
|
||||
$ docker-machine create --driver virtualbox dev1
|
||||
|
||||
|
@ -34,29 +33,16 @@ Create the Machine
|
|||
name them accordingly. Instead of 'dev1' you might have 'dev2', 'myproject',
|
||||
'djangopackages', et al.
|
||||
|
||||
Make the new machine the active unit
|
||||
-------------------------------------
|
||||
|
||||
This tells our computer that all future commands are specifically for the just
|
||||
created machine. Using the ``eval`` command we can switch machines as needed.
|
||||
|
||||
::
|
||||
|
||||
$ eval "$(docker-machine env dev1)"
|
||||
|
||||
Get the IP Address
|
||||
--------------------
|
||||
|
||||
Acquiring the IP Address is good for two reasons:
|
||||
|
||||
1. Confirms that the machine is up and running.
|
||||
2. Tells us the IP address where our Django project is being served.
|
||||
|
||||
::
|
||||
Once your machine is up and running, run this::
|
||||
|
||||
$ docker-machine ip dev1
|
||||
123.456.789.012
|
||||
|
||||
This is also the IP address where the Django project will be served from.
|
||||
|
||||
Saving changes
|
||||
--------------
|
||||
|
||||
|
@ -64,15 +50,12 @@ If you are using OS X or Windows, you need to create a /data partition inside th
|
|||
virtual machine that runs the docker deamon in order make all changes persistent.
|
||||
If you don't do that your /data directory will get wiped out on every reboot.
|
||||
|
||||
To create a persistent folder, log into the virtual machine by running:
|
||||
|
||||
::
|
||||
To create a persistent folder, log into the virtual machine by running::
|
||||
|
||||
$ docker-machine ssh dev1
|
||||
$ sudo su
|
||||
$ echo 'ln -sfn /mnt/sda1/data /data' >> /var/lib/boot2docker/bootlocal.sh
|
||||
|
||||
|
||||
In case you are wondering why you can't use a host volume to keep the files on
|
||||
your mac: As of `boot2docker` 1.7 you'll run into permission problems with mounted
|
||||
host volumes if the container creates his own user and chown's the directories
|
||||
|
@ -83,57 +66,19 @@ Build the Stack
|
|||
---------------
|
||||
|
||||
This can take a while, especially the first time you run this particular command
|
||||
on your development system.
|
||||
on your development system::
|
||||
|
||||
::
|
||||
$ docker-compose -f dev.yml build
|
||||
|
||||
$ docker-compose build
|
||||
If you want to build the production environment you don't have to pass an argument -f, it will automatically use docker-compose.yml.
|
||||
|
||||
Boot the System
|
||||
------------------------------
|
||||
---------------
|
||||
|
||||
This brings up both Django and PostgreSQL. The first time it is run it might
|
||||
take a while to get started, but subsequent runs will occur quickly.
|
||||
This brings up both Django and PostgreSQL.
|
||||
|
||||
::
|
||||
|
||||
$ docker-compose -f dev.yml up
|
||||
|
||||
If you want to run the entire system in production mode, then run:
|
||||
|
||||
::
|
||||
|
||||
$ docker-compose up
|
||||
|
||||
If you want to run the stack in detached mode (in the background), use the ``-d`` argument::
|
||||
|
||||
::
|
||||
|
||||
$ docker-compose up -d
|
||||
|
||||
Running bash commands (i.e. management commands)
|
||||
----------------------------------------------------
|
||||
|
||||
This is done using the ``docker-compose run`` command. In the following examples
|
||||
we specify the ``django`` container as the location to run our management commands.
|
||||
|
||||
Example:
|
||||
|
||||
$ docker-compose run django python manage.py migrate
|
||||
$ docker-compose run django python manage.py createsuperuser
|
||||
|
||||
|
||||
|
||||
Deprecated
|
||||
==========
|
||||
|
||||
**Note:** This segment of documentation is being kept in this location as part of our documentation transition process.
|
||||
|
||||
|
||||
The steps below will get you up and running with a local development environment. We assume you have the following installed:
|
||||
|
||||
* docker
|
||||
* docker-compose
|
||||
The first time it is run it might take a while to get started, but subsequent
|
||||
runs will occur quickly.
|
||||
|
||||
Open a terminal at the project root and run the following for local development::
|
||||
|
||||
|
@ -147,9 +92,42 @@ And then run::
|
|||
|
||||
$ docker-compose up
|
||||
|
||||
Running management commands
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
As with any shell command that we wish to run in our container, this is done
|
||||
using the ``docker-compose run`` command.
|
||||
|
||||
To migrate your app and to create a superuser, run::
|
||||
|
||||
$ docker-compose run django python manage.py migrate
|
||||
|
||||
$ docker-compose run django python manage.py createsuperuser
|
||||
|
||||
Here we specify the ``django`` container as the location to run our management commands.
|
||||
|
||||
Production Mode
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
Instead of using `dev.yml`, you would use `docker-compose.yml`.
|
||||
|
||||
Other Useful Tips
|
||||
------------------
|
||||
|
||||
Make a machine the active unit
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
This tells our computer that all future commands are specifically for the dev1 machine.
|
||||
Using the ``eval`` command we can switch machines as needed.
|
||||
|
||||
::
|
||||
|
||||
$ eval "$(docker-machine env dev1)"
|
||||
|
||||
Detached Mode
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
If you want to run the stack in detached mode (in the background), use the ``-d`` argument:
|
||||
|
||||
::
|
||||
|
||||
$ docker-compose up -d
|
||||
|
|
|
@ -15,11 +15,9 @@ First make sure to create and activate a virtualenv_, then open a terminal at th
|
|||
|
||||
.. _virtualenv: http://docs.python-guide.org/en/latest/dev/virtualenvs/
|
||||
|
||||
Then, create a PostgreSQL database and add the database configuration using the ``dj-database-url`` app pattern: ``postgres://db_owner:password@dbserver_ip:port/db_name`` either:
|
||||
|
||||
* in the ``config.settings.common.py`` setting file,
|
||||
* or in the environment variable ``DATABASE_URL``
|
||||
Then, create a PostgreSQL database with the following command, where `[repo_name]` is what value you entered for your project's `repo_name`::
|
||||
|
||||
$ createdb [repo_name]
|
||||
|
||||
You can now run the usual Django ``migrate`` and ``runserver`` command::
|
||||
|
||||
|
|
|
@ -15,6 +15,7 @@ Contents:
|
|||
:maxdepth: 2
|
||||
|
||||
|
||||
project-generation-options
|
||||
developing-locally
|
||||
developing-locally-docker
|
||||
settings
|
||||
|
|
55
docs/project-generation-options.rst
Normal file
55
docs/project-generation-options.rst
Normal file
|
@ -0,0 +1,55 @@
|
|||
Project Generation Options
|
||||
==========================
|
||||
|
||||
project_name [project_name]:
|
||||
Your human-readable project name, including any capitalization or spaces.
|
||||
|
||||
repo_name [project_name]:
|
||||
The slug of your project, without dashes or spaces. Used to name your repo
|
||||
and in other places where a Python-importable version of your project name
|
||||
is needed.
|
||||
|
||||
author_name [Your Name]:
|
||||
You! This goes into places like the LICENSE file.
|
||||
|
||||
email [Your email]:
|
||||
Your email address.
|
||||
|
||||
description [A short description of the project.]
|
||||
Used in the generated README.rst and other places.
|
||||
|
||||
domain_name [example.com]
|
||||
Whatever domain name you plan to use for your project when it goes live.
|
||||
|
||||
version [0.1.0]
|
||||
The starting version number for your project.
|
||||
|
||||
timezone [UTC]
|
||||
Used in the common settings file for the `TIME_ZONE` value.
|
||||
|
||||
use_whitenoise [y]
|
||||
Whether to use WhiteNoise_ for static file serving.
|
||||
|
||||
use_celery [n]
|
||||
Whether to use Celery_. This gives you the ability to use distributed task
|
||||
queues in your project.
|
||||
|
||||
use_maildump [n]
|
||||
Whether to use Maildump_. Maildump is a tool that simulates email receiving
|
||||
for development purposes. It runs a super simple SMTP server which catches
|
||||
any message sent to it. Then messages are displayed in a web interface.
|
||||
|
||||
use_sentry [n]
|
||||
Whether to use Sentry_ to log errors from your project.
|
||||
|
||||
windows [n]
|
||||
Whether you'll be developing on Windows.
|
||||
|
||||
use_python2 [n]
|
||||
By default, the Python code generated will be for Python 3.x. But if you
|
||||
answer `y` here, it will be legacy Python 2.7 code.
|
||||
|
||||
.. _WhiteNoise: https://github.com/evansd/whitenoise
|
||||
.. _Celery: https://github.com/celery/celery
|
||||
.. _Maildump: https://github.com/ThiefMaster/maildump
|
||||
.. _Sentry: https://github.com/getsentry/sentry
|
|
@ -55,28 +55,43 @@ def get_random_string(
|
|||
).digest())
|
||||
return ''.join(random.choice(allowed_chars) for i in range(length))
|
||||
|
||||
def make_secret_key(project_directory):
|
||||
"""Generates and saves random secret key"""
|
||||
# Determine the local_setting_file_location
|
||||
local_setting_file_location = os.path.join(
|
||||
project_directory,
|
||||
'config/settings/local.py'
|
||||
)
|
||||
|
||||
def set_secret_key(setting_file_location):
|
||||
# Open locals.py
|
||||
with open(local_setting_file_location) as f:
|
||||
local_py = f.read()
|
||||
with open(setting_file_location) as f:
|
||||
file_ = f.read()
|
||||
|
||||
# Generate a SECRET_KEY that matches the Django standard
|
||||
SECRET_KEY = get_random_string()
|
||||
SECRET_KEY = 'CHANGEME!!!' + SECRET_KEY
|
||||
|
||||
# Replace "CHANGEME!!!" with SECRET_KEY
|
||||
local_py = local_py.replace('CHANGEME!!!', SECRET_KEY)
|
||||
file_ = file_.replace('CHANGEME!!!', SECRET_KEY)
|
||||
|
||||
# Write the results to the locals.py module
|
||||
with open(local_setting_file_location, 'w') as f:
|
||||
f.write(local_py)
|
||||
with open(setting_file_location, 'w') as f:
|
||||
f.write(file_)
|
||||
|
||||
|
||||
def make_secret_key(project_directory):
|
||||
"""Generates and saves random secret key"""
|
||||
# Determine the local_setting_file_location
|
||||
local_setting = os.path.join(
|
||||
project_directory,
|
||||
'config/settings/local.py'
|
||||
)
|
||||
|
||||
# local.py settings file
|
||||
set_secret_key(local_setting)
|
||||
|
||||
env_file = os.path.join(
|
||||
project_directory,
|
||||
'env.example'
|
||||
)
|
||||
|
||||
# env.example file
|
||||
set_secret_key(env_file)
|
||||
|
||||
|
||||
|
||||
def remove_task_app(project_directory):
|
||||
"""Removes the taskapp if celery isn't going to be used"""
|
||||
|
|
|
@ -13,7 +13,6 @@ indent_style = space
|
|||
indent_size = 4
|
||||
|
||||
[*.py]
|
||||
# https://github.com/timothycrosley/isort/wiki/isort-Settings
|
||||
line_length=120
|
||||
known_first_party={{ cookiecutter.repo_name }}
|
||||
multi_line_output=3
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
|
||||
postgres:
|
||||
image: postgres
|
||||
volumes:
|
||||
|
|
|
@ -3,8 +3,8 @@ POSTGRES_USER=postgresuser
|
|||
|
||||
ADMIN_URL=
|
||||
DJANGO_SETTINGS_MODULE=config.settings.production
|
||||
DJANGO_SECRET_KEY=
|
||||
DJANGO_ALLOWED_HOSTS=
|
||||
DJANGO_SECRET_KEY=CHANGEME!!!
|
||||
DJANGO_ALLOWED_HOSTS=.{{ cookiecutter.domain_name }}
|
||||
DJANGO_AWS_ACCESS_KEY_ID=
|
||||
DJANGO_AWS_SECRET_ACCESS_KEY=
|
||||
DJANGO_AWS_STORAGE_BUCKET_NAME=
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
# Bleeding edge Django
|
||||
django==1.8.4
|
||||
django==1.8.5
|
||||
|
||||
# Configuration
|
||||
django-environ==0.4.0
|
||||
|
@ -18,18 +18,23 @@ django-floppyforms==1.5.2
|
|||
django-model-utils==2.3.1
|
||||
|
||||
# Images
|
||||
Pillow==2.9.0
|
||||
Pillow==3.0.0
|
||||
|
||||
# For user registration, either via email or social
|
||||
# Well-built with regular release cycles!
|
||||
django-allauth==0.23.0
|
||||
|
||||
# For the persistence stores
|
||||
{% if cookiecutter.windows == 'y' -%}
|
||||
# On Windows, you must download/install psycopg2 manually
|
||||
# from http://www.lfd.uci.edu/~gohlke/pythonlibs/#psycopg
|
||||
{% else %}
|
||||
# Python-PostgreSQL Database Adapter
|
||||
psycopg2==2.6.1
|
||||
{%- endif %}
|
||||
|
||||
# Unicode slugification
|
||||
unicode-slugify==0.1.3
|
||||
django-autoslug==1.8.0
|
||||
django-autoslug==1.9.3
|
||||
|
||||
# Time zones support
|
||||
pytz==2015.6
|
||||
|
|
|
@ -1,21 +1,21 @@
|
|||
# Local development dependencies go here
|
||||
-r base.txt
|
||||
coverage==4.0
|
||||
coverage==4.0.1
|
||||
Sphinx
|
||||
django-extensions==1.5.7
|
||||
Werkzeug==0.10.4
|
||||
django-test-plus==1.0.9
|
||||
factory_boy==2.5.2
|
||||
factory_boy==2.6.0
|
||||
|
||||
# django-debug-toolbar that works with Django 1.5+
|
||||
django-debug-toolbar==1.3.2
|
||||
django-debug-toolbar==1.4
|
||||
|
||||
# improved REPL
|
||||
ipdb==0.8.1
|
||||
|
||||
{% if cookiecutter.use_maildump == "y" -%}
|
||||
# Required by maildump. Need to pin dependency to gevent beta to be Python 3-compatible.
|
||||
gevent==1.1b5
|
||||
gevent==1.0.2
|
||||
# Enables better email testing
|
||||
maildump==0.5.1
|
||||
{%- endif %}
|
||||
|
|
|
@ -2,6 +2,13 @@
|
|||
# production that isn't in development.
|
||||
-r base.txt
|
||||
|
||||
{% if cookiecutter.windows == 'y' -%}
|
||||
# Python-PostgreSQL Database Adapter
|
||||
# If using Win for dev, this assumes Unix in prod
|
||||
# ------------------------------------------------
|
||||
psycopg2==2.6.1
|
||||
{%- endif %}
|
||||
|
||||
# WSGI Handler
|
||||
# ------------------------------------------------
|
||||
gevent==1.0.2
|
||||
|
|
|
@ -1,5 +1,12 @@
|
|||
# Test dependencies go here.
|
||||
-r base.txt
|
||||
|
||||
{% if cookiecutter.windows == 'y' -%}
|
||||
# Python-PostgreSQL Database Adapter
|
||||
# If using Win for dev, this assumes Unix in test/prod
|
||||
psycopg2==2.6.1
|
||||
{%- endif %}
|
||||
|
||||
coverage==4.0
|
||||
flake8==2.4.1
|
||||
django-test-plus==1.0.9
|
||||
|
|
|
@ -5,7 +5,7 @@ hitchcron==0.2
|
|||
hitchpostgres==0.6.3
|
||||
hitchpython==0.3.8
|
||||
hitchredis==0.4.3
|
||||
hitchselenium==0.4.3
|
||||
hitchselenium==0.4.5
|
||||
hitchserve==0.4.5
|
||||
hitchsmtp==0.2.1
|
||||
hitchtest==0.8.0
|
||||
|
@ -14,7 +14,7 @@ ipython==4.0.0
|
|||
Jinja2==2.8
|
||||
MarkupSafe==0.23
|
||||
patool==1.8
|
||||
psutil==3.2.1
|
||||
psutil==3.2.2
|
||||
python-build==0.2.3
|
||||
pyuv==1.2.0
|
||||
PyYAML==3.11
|
||||
|
|
|
@ -4,10 +4,7 @@ import os
|
|||
from celery import Celery
|
||||
from django.apps import AppConfig
|
||||
from django.conf import settings
|
||||
{% if cookiecutter.use_sentry == "y" -%}
|
||||
from raven import Client
|
||||
from raven.contrib.celery import register_signal
|
||||
{%- endif %}
|
||||
|
||||
|
||||
if not settings.configured:
|
||||
# set the default Django settings module for the 'celery' program.
|
||||
|
@ -30,6 +27,8 @@ class CeleryConfig(AppConfig):
|
|||
{% if cookiecutter.use_sentry == "y" -%}
|
||||
if hasattr(settings, 'RAVEN_CONFIG'):
|
||||
# Celery signal registration
|
||||
from raven import Client
|
||||
from raven.contrib.celery import register_signal
|
||||
client = Client(dsn=settings.RAVEN_CONFIG['dsn'])
|
||||
register_signal(client)
|
||||
{%- endif %}
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
|
||||
<body>
|
||||
|
||||
<div class="m-b-lg">
|
||||
<div class="m-b">
|
||||
<nav class="navbar navbar-dark navbar-static-top bg-inverse">
|
||||
<div class="container">
|
||||
<a class="navbar-brand" href="/">{% endraw %}{{ cookiecutter.project_name }}{% raw %}</a>
|
||||
|
@ -42,17 +42,17 @@
|
|||
<!-- Collect the nav links, forms, and other content for toggling -->
|
||||
<div class="collapse navbar-toggleable-xs" id="bs-navbar-collapse-1">
|
||||
<nav class="nav navbar-nav">
|
||||
<a class="nav-link nav-item" href="{% url 'home' %}">Home</a></li>
|
||||
<a class="nav-link nav-item" href="{% url 'about' %}">About</a></li>
|
||||
<a class="nav-link nav-item" href="{% url 'home' %}">Home</a>
|
||||
<a class="nav-link nav-item" href="{% url 'about' %}">About</a>
|
||||
</nav>
|
||||
|
||||
<nav class="nav navbar-nav pull-right">
|
||||
{% if request.user.is_authenticated %}
|
||||
<a class="nav-link nav-item" href="{% url 'users:detail' request.user.username %}">{% trans "My Profile" %}</a></li>
|
||||
<a class="nav-link nav-item" href="{% url 'account_logout' %}">{% trans "Logout" %}</a></li>
|
||||
<a class="nav-link nav-item" href="{% url 'users:detail' request.user.username %}">{% trans "My Profile" %}</a>
|
||||
<a class="nav-link nav-item" href="{% url 'account_logout' %}">{% trans "Logout" %}</a>
|
||||
{% else %}
|
||||
<a class="nav-link nav-item" href="{% url 'account_signup' %}">{% trans "Sign Up" %}</a></li>
|
||||
<a class="nav-link nav-item" href="{% url 'account_login' %}">{% trans "Log In" %}</a></li>
|
||||
<a class="nav-link nav-item" href="{% url 'account_signup' %}">{% trans "Sign Up" %}</a>
|
||||
<a class="nav-link nav-item" href="{% url 'account_login' %}">{% trans "Log In" %}</a>
|
||||
{% endif %}
|
||||
</nav>
|
||||
</div>
|
||||
|
|
Loading…
Reference in New Issue
Block a user