mirror of
https://github.com/cookiecutter/cookiecutter-django.git
synced 2024-11-25 02:54:01 +03:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
commit
c68393309c
|
@ -107,11 +107,13 @@ Listed in alphabetical order.
|
||||||
Lyla Fischer
|
Lyla Fischer
|
||||||
Martin Blech
|
Martin Blech
|
||||||
Mathijs Hoogland `@MathijsHoogland`_
|
Mathijs Hoogland `@MathijsHoogland`_
|
||||||
|
Matt Braymer-Hayes `@mattayes`_ @mattayes
|
||||||
Matt Linares
|
Matt Linares
|
||||||
Matt Menzenski `@menzenski`_
|
Matt Menzenski `@menzenski`_
|
||||||
Matt Warren `@mfwarren`_
|
Matt Warren `@mfwarren`_
|
||||||
Matthew Sisley `@mjsisley`_
|
Matthew Sisley `@mjsisley`_
|
||||||
Meghan Heintz `@dot2dotseurat`_
|
Meghan Heintz `@dot2dotseurat`_
|
||||||
|
Mesut Yılmaz `@myilmaz`_
|
||||||
Michael Gecht `@mimischi`_ @_mischi
|
Michael Gecht `@mimischi`_ @_mischi
|
||||||
mozillazg `@mozillazg`_
|
mozillazg `@mozillazg`_
|
||||||
Pablo `@oubiga`_
|
Pablo `@oubiga`_
|
||||||
|
@ -124,9 +126,10 @@ Listed in alphabetical order.
|
||||||
Roman Osipenko `@romanosipenko`_
|
Roman Osipenko `@romanosipenko`_
|
||||||
Russell Davies
|
Russell Davies
|
||||||
Sam Collins `@MightySCollins`_
|
Sam Collins `@MightySCollins`_
|
||||||
stepmr `@stepmr`_
|
Shupeyko Nikita `@webyneter`_
|
||||||
Sławek Ehlert `@slafs`_
|
Sławek Ehlert `@slafs`_
|
||||||
Srinivas Nyayapati `@shireenrao`_
|
Srinivas Nyayapati `@shireenrao`_
|
||||||
|
stepmr `@stepmr`_
|
||||||
Steve Steiner `@ssteinerX`_
|
Steve Steiner `@ssteinerX`_
|
||||||
Sule Marshall `@suledev`_
|
Sule Marshall `@suledev`_
|
||||||
Taylor Baldwin
|
Taylor Baldwin
|
||||||
|
@ -138,6 +141,7 @@ Listed in alphabetical order.
|
||||||
Vitaly Babiy
|
Vitaly Babiy
|
||||||
Vivian Guillen `@viviangb`_
|
Vivian Guillen `@viviangb`_
|
||||||
Will Farley `@goldhand`_ @g01dhand
|
Will Farley `@goldhand`_ @g01dhand
|
||||||
|
William Archinal `@archinal`_
|
||||||
Yaroslav Halchenko
|
Yaroslav Halchenko
|
||||||
========================== ============================ ==============
|
========================== ============================ ==============
|
||||||
|
|
||||||
|
@ -149,6 +153,7 @@ Listed in alphabetical order.
|
||||||
.. _@amjith: https://github.com/amjith
|
.. _@amjith: https://github.com/amjith
|
||||||
.. _@andor-pierdelacabeza: https://github.com/andor-pierdelacabeza
|
.. _@andor-pierdelacabeza: https://github.com/andor-pierdelacabeza
|
||||||
.. _@antoniablair: https://github.com/antoniablair
|
.. _@antoniablair: https://github.com/antoniablair
|
||||||
|
.. _@archinal: https://github.com/archinal
|
||||||
.. _@areski: https://github.com/areski
|
.. _@areski: https://github.com/areski
|
||||||
.. _@arruda: https://github.com/arruda
|
.. _@arruda: https://github.com/arruda
|
||||||
.. _@bittner: https://github.com/bittner
|
.. _@bittner: https://github.com/bittner
|
||||||
|
@ -193,10 +198,12 @@ Listed in alphabetical order.
|
||||||
.. _@knitatoms: https://github.com/knitatoms
|
.. _@knitatoms: https://github.com/knitatoms
|
||||||
.. _@krzysztofzuraw: https://github.com/krzysztofzuraw
|
.. _@krzysztofzuraw: https://github.com/krzysztofzuraw
|
||||||
.. _@MathijsHoogland: https://github.com/MathijsHoogland
|
.. _@MathijsHoogland: https://github.com/MathijsHoogland
|
||||||
|
.. _@mattayes: https://github.com/mattayes
|
||||||
.. _@menzenski: https://github.com/menzenski
|
.. _@menzenski: https://github.com/menzenski
|
||||||
.. _@mfwarren: https://github.com/mfwarren
|
.. _@mfwarren: https://github.com/mfwarren
|
||||||
.. _@mimischi: https://github.com/mimischi
|
.. _@mimischi: https://github.com/mimischi
|
||||||
.. _@mjsisley: https://github.com/mjsisley
|
.. _@mjsisley: https://github.com/mjsisley
|
||||||
|
.. _@myilmaz: https://github.com/myilmaz
|
||||||
.. _@mozillazg: https://github.com/mozillazg
|
.. _@mozillazg: https://github.com/mozillazg
|
||||||
.. _@noisy: https://github.com/noisy
|
.. _@noisy: https://github.com/noisy
|
||||||
.. _@originell: https://github.com/originell
|
.. _@originell: https://github.com/originell
|
||||||
|
@ -206,6 +213,7 @@ Listed in alphabetical order.
|
||||||
.. _@rm--: https://github.com/rm--
|
.. _@rm--: https://github.com/rm--
|
||||||
.. _@romanosipenko: https://github.com/romanosipenko
|
.. _@romanosipenko: https://github.com/romanosipenko
|
||||||
.. _@shireenrao: https://github.com/shireenrao
|
.. _@shireenrao: https://github.com/shireenrao
|
||||||
|
.. _@webyneter: https://github.com/webyneter
|
||||||
.. _@show0k: https://github.com/show0k
|
.. _@show0k: https://github.com/show0k
|
||||||
.. _@shultz: https://github.com/shultz
|
.. _@shultz: https://github.com/shultz
|
||||||
.. _@siauPatrick: https://github.com/siauPatrick
|
.. _@siauPatrick: https://github.com/siauPatrick
|
||||||
|
|
35
README.rst
35
README.rst
|
@ -32,6 +32,7 @@ Features
|
||||||
* Renders Django projects with 100% starting test coverage
|
* Renders Django projects with 100% starting test coverage
|
||||||
* Twitter Bootstrap_ v4.0.0 - `alpha 4`_ (`maintained Foundation fork`_ also available)
|
* Twitter Bootstrap_ v4.0.0 - `alpha 4`_ (`maintained Foundation fork`_ also available)
|
||||||
* 12-Factor_ based settings via django-environ_
|
* 12-Factor_ based settings via django-environ_
|
||||||
|
* Secure by default. We believe in SSL.
|
||||||
* Optimized development and production settings
|
* Optimized development and production settings
|
||||||
* Registration via django-allauth_
|
* Registration via django-allauth_
|
||||||
* Comes with custom user model ready to go
|
* Comes with custom user model ready to go
|
||||||
|
@ -140,8 +141,7 @@ Answer the prompts with your own desired options_. For example::
|
||||||
Select js_task_runner:
|
Select js_task_runner:
|
||||||
1 - Gulp
|
1 - Gulp
|
||||||
2 - Grunt
|
2 - Grunt
|
||||||
3 - Webpack
|
3 - None
|
||||||
4 - None
|
|
||||||
Choose from 1, 2, 3, 4 [1]: 1
|
Choose from 1, 2, 3, 4 [1]: 1
|
||||||
use_lets_encrypt [n]: n
|
use_lets_encrypt [n]: n
|
||||||
Select open_source_license:
|
Select open_source_license:
|
||||||
|
@ -193,6 +193,13 @@ For Readers of Two Scoops of Django 1.8
|
||||||
|
|
||||||
You may notice that some elements of this project do not exactly match what we describe in chapter 3. The reason for that is this project, amongst other things, serves as a test bed for trying out new ideas and concepts. Sometimes they work, sometimes they don't, but the end result is that it won't necessarily match precisely what is described in the book I co-authored.
|
You may notice that some elements of this project do not exactly match what we describe in chapter 3. The reason for that is this project, amongst other things, serves as a test bed for trying out new ideas and concepts. Sometimes they work, sometimes they don't, but the end result is that it won't necessarily match precisely what is described in the book I co-authored.
|
||||||
|
|
||||||
|
For pyup.io Users
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
If you are using `pyup.io`_ to keep your dependencies updated and secure, use the code *cookiecutter* during checkout to get 15% off every month.
|
||||||
|
|
||||||
|
.. _`pyup.io`: https://pyup.io
|
||||||
|
|
||||||
"Your Stuff"
|
"Your Stuff"
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
|
@ -258,10 +265,26 @@ Support This Project
|
||||||
|
|
||||||
This project is maintained by volunteers. Support their efforts by spreading the word about:
|
This project is maintained by volunteers. Support their efforts by spreading the word about:
|
||||||
|
|
||||||
.. image:: https://s3.amazonaws.com/tsacademy/images/tsa-logo-250x60-transparent-01.png
|
Two Scoops Press
|
||||||
:name: Two Scoops Academy
|
~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. image:: https://cdn.shopify.com/s/files/1/0304/6901/t/2/assets/logo.png?11985289740589874793
|
||||||
|
:name: Two Scoops Press
|
||||||
:align: center
|
:align: center
|
||||||
:alt: Two Scoops Academy
|
:alt: Two Scoops Press
|
||||||
:target: https://twoscoops.academy/
|
:target: https://twoscoopspress.com
|
||||||
|
|
||||||
|
Two Scoops Press brings you the best dairy-themed Django references in the universe
|
||||||
|
|
||||||
|
pyup
|
||||||
|
~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. image:: https://pyup.io/static/images/logo.png
|
||||||
|
:name: pyup
|
||||||
|
:align: center
|
||||||
|
:alt: pyup
|
||||||
|
:target: https://pyup.io/
|
||||||
|
|
||||||
|
Pyup brings you automated security and dependency updates used by Google and other organizations. Free for open source projects!
|
||||||
|
|
||||||
.. _`PyPA Code of Conduct`: https://www.pypa.io/en/latest/code-of-conduct/
|
.. _`PyPA Code of Conduct`: https://www.pypa.io/en/latest/code-of-conduct/
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
"use_pycharm": "n",
|
"use_pycharm": "n",
|
||||||
"windows": "n",
|
"windows": "n",
|
||||||
"use_python3": "y",
|
"use_python3": "y",
|
||||||
"use_docker": "y",
|
"use_docker": "n",
|
||||||
"use_heroku": "n",
|
"use_heroku": "n",
|
||||||
"use_elasticbeanstalk_experimental": "n",
|
"use_elasticbeanstalk_experimental": "n",
|
||||||
"use_compressor": "n",
|
"use_compressor": "n",
|
||||||
|
|
|
@ -3,7 +3,7 @@ Deployment on Heroku
|
||||||
|
|
||||||
.. index:: Heroku
|
.. index:: Heroku
|
||||||
|
|
||||||
You can either push the 'deploy' button in your generated README.rst or run these commands to deploy the project to Heroku:
|
Run these commands to deploy the project to Heroku:
|
||||||
|
|
||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,7 @@ Generate a secret key for yourself, eg like this:
|
||||||
|
|
||||||
.. code-block:: bash
|
.. code-block:: bash
|
||||||
|
|
||||||
python -c 'import random; print("".join(random.SystemRandom().choice("abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)") for _ in range(50)))'
|
python -c 'import random;import string; print("".join(random.SystemRandom().choice(string.digits + string.ascii_letters + string.punctuation) for _ in range(50)))'
|
||||||
|
|
||||||
Make a note of it, since we'll need it here in the console and later on in the web app config tab.
|
Make a note of it, since we'll need it here in the console and later on in the web app config tab.
|
||||||
|
|
||||||
|
@ -140,6 +140,7 @@ Click through to the **WSGI configuration file** link (near the top) and edit th
|
||||||
os.environ['DJANGO_ADMIN_URL'] = '<as above>'
|
os.environ['DJANGO_ADMIN_URL'] = '<as above>'
|
||||||
os.environ['DJANGO_MAILGUN_API_KEY'] = '<as above>'
|
os.environ['DJANGO_MAILGUN_API_KEY'] = '<as above>'
|
||||||
os.environ['DJANGO_MAILGUN_SERVER_NAME'] = '<as above>'
|
os.environ['DJANGO_MAILGUN_SERVER_NAME'] = '<as above>'
|
||||||
|
os.environ['MAILGUN_SENDER_DOMAIN'] = '<as above>'
|
||||||
os.environ['DJANGO_AWS_ACCESS_KEY_ID'] = ''
|
os.environ['DJANGO_AWS_ACCESS_KEY_ID'] = ''
|
||||||
os.environ['DJANGO_AWS_SECRET_ACCESS_KEY'] = ''
|
os.environ['DJANGO_AWS_SECRET_ACCESS_KEY'] = ''
|
||||||
os.environ['DJANGO_AWS_STORAGE_BUCKET_NAME'] = ''
|
os.environ['DJANGO_AWS_STORAGE_BUCKET_NAME'] = ''
|
||||||
|
@ -179,5 +180,3 @@ For subsequent deployments, the procedure is much simpler. In a Bash console:
|
||||||
And then go to the Web tab and hit **Reload**
|
And then go to the Web tab and hit **Reload**
|
||||||
|
|
||||||
**TIP:** *if you're really keen, you can set up git-push based deployments: https://blog.pythonanywhere.com/87/*
|
**TIP:** *if you're really keen, you can set up git-push based deployments: https://blog.pythonanywhere.com/87/*
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,19 @@ root directory of this project as a starting point. Add your own variables to th
|
||||||
file won't be tracked by git by default so you'll have to make sure to use some other mechanism to copy your secret if
|
file won't be tracked by git by default so you'll have to make sure to use some other mechanism to copy your secret if
|
||||||
you are relying solely on git.
|
you are relying solely on git.
|
||||||
|
|
||||||
|
HTTPS is on by default
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
SSL (Secure Sockets Layer) is a standard security technology for establishing an encrypted link between a server and a client, typically in this case, a web server (website) and a browser. Not having HTTPS means that malicious network users can sniff authentication credentials between your website and end users' browser.
|
||||||
|
|
||||||
|
It is always better to deploy a site behind HTTPS and will become crucial as the web services extend to the IoT (Internet of Things). For this reason, we have set up a number of security defaults to help make your website secure:
|
||||||
|
|
||||||
|
* In the `.env.example`, we have made it simpler for you to change the default `Django Admin` into a custom name through an environmental variable. This should make it harder to guess the access to the admin panel.
|
||||||
|
|
||||||
|
* If you are not using a subdomain of the domain name set in the project, then remember to put the your staging/production IP address in the ``ALLOWED_HOSTS``_ environment variable before you deploy your website. Failure to do this will mean you will not have access to your website through the HTTP protocol.
|
||||||
|
|
||||||
|
* Access to the Django admin is set up by default to require HTTPS in production or once *live*. We recommend that you look into setting up the *Certbot and Let's Encrypt Setup* mentioned below or another HTTPS certification service.
|
||||||
|
|
||||||
Optional: nginx-proxy Setup
|
Optional: nginx-proxy Setup
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
|
@ -52,8 +65,7 @@ This pass all incoming requests on `nginx-proxy`_ to the nginx service your appl
|
||||||
Optional: Postgres Data Volume Modifications
|
Optional: Postgres Data Volume Modifications
|
||||||
---------------------------------------------
|
---------------------------------------------
|
||||||
|
|
||||||
Postgres is saving its database files to the `postgres_data` volume by default. Change that if you wan't
|
Postgres is saving its database files to the `postgres_data` volume by default. Change that if you want something else and make sure to make backups since this is not done automatically.
|
||||||
something else and make sure to make backups since this is not done automatically.
|
|
||||||
|
|
||||||
Optional: Certbot and Let's Encrypt Setup
|
Optional: Certbot and Let's Encrypt Setup
|
||||||
------------------------------------------
|
------------------------------------------
|
||||||
|
@ -143,7 +155,7 @@ If you have errors, you can always check your stack with `docker-compose`. Switc
|
||||||
Supervisor Example
|
Supervisor Example
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
Once you are ready with your initial setup, you wan't to make sure that your application is run by a process manager to
|
Once you are ready with your initial setup, you want to make sure that your application is run by a process manager to
|
||||||
survive reboots and auto restarts in case of an error. You can use the process manager you are most familiar with. All
|
survive reboots and auto restarts in case of an error. You can use the process manager you are most familiar with. All
|
||||||
it needs to do is to run `docker-compose up` in your projects root directory.
|
it needs to do is to run `docker-compose up` in your projects root directory.
|
||||||
|
|
||||||
|
|
|
@ -73,6 +73,11 @@ To migrate your app and to create a superuser, run::
|
||||||
|
|
||||||
Here we specify the ``django`` container as the location to run our management commands.
|
Here we specify the ``django`` container as the location to run our management commands.
|
||||||
|
|
||||||
|
Add your Docker development server IP
|
||||||
|
------------------------------------
|
||||||
|
|
||||||
|
When ``DEBUG`` is set to `True`, the host is validated against ``['localhost', '127.0.0.1', '[::1]']``. This is adequate when running a ``virtualenv``. For Docker, in the ``config.settings.local``, add your host development server IP to ``INTERNAL_IPS`` or ``ALLOWED_HOSTS`` if the variable exists.
|
||||||
|
|
||||||
Production Mode
|
Production Mode
|
||||||
~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@ Setup your email backend
|
||||||
|
|
||||||
django-allauth sends an email to verify users (and superusers) after signup and login (if they are still not verified). To send email you need to `configure your email backend`_
|
django-allauth sends an email to verify users (and superusers) after signup and login (if they are still not verified). To send email you need to `configure your email backend`_
|
||||||
|
|
||||||
.. _configure your email backend: http://docs.djangoproject.com/en/1.9/topics/email/#smtp-backend
|
.. _configure your email backend: https://docs.djangoproject.com/en/dev/topics/email/#smtp-backend
|
||||||
|
|
||||||
In development you can (optionally) use MailHog_ for email testing. MailHog is built with Go so there are no dependencies. To use MailHog:
|
In development you can (optionally) use MailHog_ for email testing. MailHog is built with Go so there are no dependencies. To use MailHog:
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ version [0.1.0]
|
||||||
The starting version number for your project.
|
The starting version number for your project.
|
||||||
|
|
||||||
timezone [UTC]
|
timezone [UTC]
|
||||||
Used in the common settings file for the `TIME_ZONE` value.
|
Used in the base settings file for the `TIME_ZONE` value.
|
||||||
|
|
||||||
use_whitenoise [y]
|
use_whitenoise [y]
|
||||||
Whether to use WhiteNoise_ for static file serving.
|
Whether to use WhiteNoise_ for static file serving.
|
||||||
|
@ -74,8 +74,7 @@ js_task_runner [1]
|
||||||
|
|
||||||
1. Gulp_
|
1. Gulp_
|
||||||
2. Grunt_
|
2. Grunt_
|
||||||
3. Webpack_
|
3. None
|
||||||
4. None
|
|
||||||
|
|
||||||
use_lets_encrypt [n]
|
use_lets_encrypt [n]
|
||||||
Use `Let's Encrypt`_ as the certificate authority for this project.
|
Use `Let's Encrypt`_ as the certificate authority for this project.
|
||||||
|
|
|
@ -3,7 +3,14 @@ Settings
|
||||||
|
|
||||||
This project relies extensively on environment settings which **will not work with Apache/mod_wsgi setups**. It has been deployed successfully with both Gunicorn/Nginx and even uWSGI/Nginx.
|
This project relies extensively on environment settings which **will not work with Apache/mod_wsgi setups**. It has been deployed successfully with both Gunicorn/Nginx and even uWSGI/Nginx.
|
||||||
|
|
||||||
For configuration purposes, the following table maps environment variables to their Django setting:
|
For configuration purposes, the following table maps environment variables to their Django setting and project settings:
|
||||||
|
|
||||||
|
|
||||||
|
======================================= =========================== ============================================== ======================================================================
|
||||||
|
Environment Variable Django Setting Development Default Production Default
|
||||||
|
======================================= =========================== ============================================== ======================================================================
|
||||||
|
DJANGO_READ_DOT_ENV_FILE READ_DOT_ENV_FILE False False
|
||||||
|
======================================= =========================== ============================================== ======================================================================
|
||||||
|
|
||||||
|
|
||||||
======================================= =========================== ============================================== ======================================================================
|
======================================= =========================== ============================================== ======================================================================
|
||||||
|
|
|
@ -16,6 +16,7 @@ from __future__ import print_function
|
||||||
import os
|
import os
|
||||||
import random
|
import random
|
||||||
import shutil
|
import shutil
|
||||||
|
import string
|
||||||
|
|
||||||
# Get the root project directory
|
# Get the root project directory
|
||||||
PROJECT_DIRECTORY = os.path.realpath(os.path.curdir)
|
PROJECT_DIRECTORY = os.path.realpath(os.path.curdir)
|
||||||
|
@ -28,16 +29,19 @@ except NotImplementedError:
|
||||||
using_sysrandom = False
|
using_sysrandom = False
|
||||||
|
|
||||||
|
|
||||||
def get_random_string(
|
def get_random_string(length=50):
|
||||||
length=50,
|
|
||||||
allowed_chars='abcdefghijklmnopqrstuvwxyz0123456789!@#%^&*(-_=+)'):
|
|
||||||
"""
|
"""
|
||||||
Returns a securely generated random string.
|
Returns a securely generated random string.
|
||||||
The default length of 12 with the a-z, A-Z, 0-9 character set returns
|
The default length of 12 with the a-z, A-Z, 0-9 character set returns
|
||||||
a 71-bit value. log_2((26+26+10)^12) =~ 71 bits
|
a 71-bit value. log_2((26+26+10)^12) =~ 71 bits
|
||||||
"""
|
"""
|
||||||
|
punctuation = string.punctuation.replace('"', '').replace("'", '')
|
||||||
|
punctuation = punctuation.replace('\\', '')
|
||||||
if using_sysrandom:
|
if using_sysrandom:
|
||||||
return ''.join(random.choice(allowed_chars) for i in range(length))
|
return ''.join(random.choice(
|
||||||
|
string.digits + string.ascii_letters + punctuation
|
||||||
|
) for i in range(length))
|
||||||
|
|
||||||
print(
|
print(
|
||||||
"Cookiecutter Django couldn't find a secure pseudo-random number generator on your system."
|
"Cookiecutter Django couldn't find a secure pseudo-random number generator on your system."
|
||||||
" Please change change your SECRET_KEY variables in conf/settings/local.py and env.example"
|
" Please change change your SECRET_KEY variables in conf/settings/local.py and env.example"
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
cookiecutter==1.5.0
|
cookiecutter==1.5.1
|
||||||
flake8==3.2.1 # pyup: != 2.6.0
|
flake8==3.3.0 # pyup: != 2.6.0
|
||||||
sh==1.12.9
|
sh==1.12.13
|
||||||
binaryornot==0.4.0
|
binaryornot==0.4.0
|
||||||
|
|
||||||
# Testing
|
# Testing
|
||||||
pytest==3.0.6
|
pytest==3.0.7
|
||||||
pep8==1.7.0
|
pep8==1.7.0
|
||||||
pyflakes==1.5.0
|
pyflakes==1.5.0
|
||||||
tox==2.5.0
|
tox==2.6.0
|
||||||
pytest-cookies==0.2.0
|
pytest-cookies==0.2.0
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
# These requirements prevented an upgrade to Django 1.10.
|
# These requirements prevented an upgrade to Django 1.10.
|
||||||
django-coverage-plugin==1.4.1
|
django-coverage-plugin==1.5.0
|
||||||
django-autoslug==1.9.3
|
django-autoslug==1.9.3
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ mkdir -p .cache/docker
|
||||||
cd .cache/docker
|
cd .cache/docker
|
||||||
|
|
||||||
# create the project using the default settings in cookiecutter.json
|
# create the project using the default settings in cookiecutter.json
|
||||||
cookiecutter ../../ --no-input --overwrite-if-exists
|
cookiecutter ../../ --no-input --overwrite-if-exists use_docker=y js_task_runner=None
|
||||||
cd project_name
|
cd project_name
|
||||||
|
|
||||||
# run the project's tests
|
# run the project's tests
|
||||||
|
|
|
@ -24,7 +24,7 @@ Resources:
|
||||||
CacheNodeType:
|
CacheNodeType:
|
||||||
Fn::GetOptionSetting:
|
Fn::GetOptionSetting:
|
||||||
OptionName : "CacheNodeType"
|
OptionName : "CacheNodeType"
|
||||||
DefaultValue : "cache.t1.micro"
|
DefaultValue : "cache.t2.micro"
|
||||||
NumCacheNodes:
|
NumCacheNodes:
|
||||||
Fn::GetOptionSetting:
|
Fn::GetOptionSetting:
|
||||||
OptionName : "NumCacheNodes"
|
OptionName : "NumCacheNodes"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
option_settings:
|
option_settings:
|
||||||
"aws:elasticbeanstalk:customoption":
|
"aws:elasticbeanstalk:customoption":
|
||||||
CacheNodeType : cache.t1.micro
|
CacheNodeType : cache.t2.micro
|
||||||
NumCacheNodes : 1
|
NumCacheNodes : 1
|
||||||
Engine : redis
|
Engine : redis
|
||||||
CachePort : 6379
|
CachePort : 6379
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<option name="PARENT_ENVS" value="true" />
|
<option name="PARENT_ENVS" value="true" />
|
||||||
<envs>
|
<envs>
|
||||||
<env name="PYTHONUNBUFFERED" value="1" />
|
<env name="PYTHONUNBUFFERED" value="1" />
|
||||||
<env name="DJANGO_SETTINGS_MODULE" value="config.settings.local" />
|
<env name="DJANGO_SETTINGS_MODULE" value="config.settings.test" />
|
||||||
</envs>
|
</envs>
|
||||||
<option name="SDK_HOME" value="docker-compose://$PROJECT_DIR$/dev.yml:pycharm/python" />
|
<option name="SDK_HOME" value="docker-compose://$PROJECT_DIR$/dev.yml:pycharm/python" />
|
||||||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<option name="PARENT_ENVS" value="true" />
|
<option name="PARENT_ENVS" value="true" />
|
||||||
<envs>
|
<envs>
|
||||||
<env name="PYTHONUNBUFFERED" value="1" />
|
<env name="PYTHONUNBUFFERED" value="1" />
|
||||||
<env name="DJANGO_SETTINGS_MODULE" value="config.settings.local" />
|
<env name="DJANGO_SETTINGS_MODULE" value="config.settings.test" />
|
||||||
</envs>
|
</envs>
|
||||||
<option name="SDK_HOME" value="docker-compose://$PROJECT_DIR$/dev.yml:pycharm/python" />
|
<option name="SDK_HOME" value="docker-compose://$PROJECT_DIR$/dev.yml:pycharm/python" />
|
||||||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<option name="PARENT_ENVS" value="true" />
|
<option name="PARENT_ENVS" value="true" />
|
||||||
<envs>
|
<envs>
|
||||||
<env name="PYTHONUNBUFFERED" value="1" />
|
<env name="PYTHONUNBUFFERED" value="1" />
|
||||||
<env name="DJANGO_SETTINGS_MODULE" value="config.settings.local" />
|
<env name="DJANGO_SETTINGS_MODULE" value="config.settings.test" />
|
||||||
</envs>
|
</envs>
|
||||||
<option name="SDK_HOME" value="docker-compose://$PROJECT_DIR$/dev.yml:pycharm/python" />
|
<option name="SDK_HOME" value="docker-compose://$PROJECT_DIR$/dev.yml:pycharm/python" />
|
||||||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<option name="PARENT_ENVS" value="true" />
|
<option name="PARENT_ENVS" value="true" />
|
||||||
<envs>
|
<envs>
|
||||||
<env name="PYTHONUNBUFFERED" value="1" />
|
<env name="PYTHONUNBUFFERED" value="1" />
|
||||||
<env name="DJANGO_SETTINGS_MODULE" value="config.settings.local" />
|
<env name="DJANGO_SETTINGS_MODULE" value="config.settings.test" />
|
||||||
</envs>
|
</envs>
|
||||||
<option name="SDK_HOME" value="docker-compose://$PROJECT_DIR$/dev.yml:pycharm/python" />
|
<option name="SDK_HOME" value="docker-compose://$PROJECT_DIR$/dev.yml:pycharm/python" />
|
||||||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
<option name="PARENT_ENVS" value="true" />
|
<option name="PARENT_ENVS" value="true" />
|
||||||
<envs>
|
<envs>
|
||||||
<env name="PYTHONUNBUFFERED" value="1" />
|
<env name="PYTHONUNBUFFERED" value="1" />
|
||||||
<env name="DJANGO_SETTINGS_MODULE" value="config.settings.local" />
|
<env name="DJANGO_SETTINGS_MODULE" value="config.settings.test" />
|
||||||
</envs>
|
</envs>
|
||||||
<option name="SDK_HOME" value="docker-compose://$PROJECT_DIR$/dev.yml:pycharm/python" />
|
<option name="SDK_HOME" value="docker-compose://$PROJECT_DIR$/dev.yml:pycharm/python" />
|
||||||
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
|
||||||
|
|
|
@ -12,15 +12,27 @@ from __future__ import absolute_import, unicode_literals
|
||||||
|
|
||||||
import environ
|
import environ
|
||||||
|
|
||||||
ROOT_DIR = environ.Path(__file__) - 3 # ({{ cookiecutter.project_slug }}/config/settings/common.py - 3 = {{ cookiecutter.project_slug }}/)
|
ROOT_DIR = environ.Path(__file__) - 3 # ({{ cookiecutter.project_slug }}/config/settings/base.py - 3 = {{ cookiecutter.project_slug }}/)
|
||||||
APPS_DIR = ROOT_DIR.path('{{ cookiecutter.project_slug }}')
|
APPS_DIR = ROOT_DIR.path('{{ cookiecutter.project_slug }}')
|
||||||
|
|
||||||
|
# Load operating system environment variables and then prepare to use them
|
||||||
env = environ.Env()
|
env = environ.Env()
|
||||||
env.read_env()
|
|
||||||
|
# .env file, should load only in development environment
|
||||||
|
READ_DOT_ENV_FILE = env.bool('DJANGO_READ_DOT_ENV_FILE', default=False)
|
||||||
|
|
||||||
|
if READ_DOT_ENV_FILE:
|
||||||
|
# Operating System Environment variables have precedence over variables defined in the .env file,
|
||||||
|
# that is to say variables from the .env files will only be used if not defined
|
||||||
|
# as environment variables.
|
||||||
|
env_file = str(ROOT_DIR.path('.env'))
|
||||||
|
print('Loading : {}'.format(env_file))
|
||||||
|
env.read_env(env_file)
|
||||||
|
print('The .env file has been loaded. See base.py for more information')
|
||||||
|
|
||||||
# APP CONFIGURATION
|
# APP CONFIGURATION
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
DJANGO_APPS = (
|
DJANGO_APPS = [
|
||||||
# Default Django apps:
|
# Default Django apps:
|
||||||
'django.contrib.auth',
|
'django.contrib.auth',
|
||||||
'django.contrib.contenttypes',
|
'django.contrib.contenttypes',
|
||||||
|
@ -34,27 +46,27 @@ DJANGO_APPS = (
|
||||||
|
|
||||||
# Admin
|
# Admin
|
||||||
'django.contrib.admin',
|
'django.contrib.admin',
|
||||||
)
|
]
|
||||||
THIRD_PARTY_APPS = (
|
THIRD_PARTY_APPS = [
|
||||||
'crispy_forms', # Form layouts
|
'crispy_forms', # Form layouts
|
||||||
'allauth', # registration
|
'allauth', # registration
|
||||||
'allauth.account', # registration
|
'allauth.account', # registration
|
||||||
'allauth.socialaccount', # registration
|
'allauth.socialaccount', # registration
|
||||||
)
|
]
|
||||||
|
|
||||||
# Apps specific for this project go here.
|
# Apps specific for this project go here.
|
||||||
LOCAL_APPS = (
|
LOCAL_APPS = [
|
||||||
# custom users app
|
# custom users app
|
||||||
'{{ cookiecutter.project_slug }}.users.apps.UsersConfig',
|
'{{ cookiecutter.project_slug }}.users.apps.UsersConfig',
|
||||||
# Your stuff: custom apps go here
|
# Your stuff: custom apps go here
|
||||||
)
|
]
|
||||||
|
|
||||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps
|
# See: https://docs.djangoproject.com/en/dev/ref/settings/#installed-apps
|
||||||
INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS
|
INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS
|
||||||
|
|
||||||
# MIDDLEWARE CONFIGURATION
|
# MIDDLEWARE CONFIGURATION
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
MIDDLEWARE = (
|
MIDDLEWARE = [
|
||||||
'django.middleware.security.SecurityMiddleware',
|
'django.middleware.security.SecurityMiddleware',
|
||||||
'django.contrib.sessions.middleware.SessionMiddleware',
|
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||||
'django.middleware.common.CommonMiddleware',
|
'django.middleware.common.CommonMiddleware',
|
||||||
|
@ -62,7 +74,7 @@ MIDDLEWARE = (
|
||||||
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||||
'django.contrib.messages.middleware.MessageMiddleware',
|
'django.contrib.messages.middleware.MessageMiddleware',
|
||||||
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||||
)
|
]
|
||||||
|
|
||||||
# MIGRATIONS CONFIGURATION
|
# MIGRATIONS CONFIGURATION
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
@ -89,9 +101,9 @@ EMAIL_BACKEND = env('DJANGO_EMAIL_BACKEND', default='django.core.mail.backends.s
|
||||||
# MANAGER CONFIGURATION
|
# MANAGER CONFIGURATION
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#admins
|
# See: https://docs.djangoproject.com/en/dev/ref/settings/#admins
|
||||||
ADMINS = (
|
ADMINS = [
|
||||||
("""{{cookiecutter.author_name}}""", '{{cookiecutter.email}}'),
|
("""{{cookiecutter.author_name}}""", '{{cookiecutter.email}}'),
|
||||||
)
|
]
|
||||||
|
|
||||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#managers
|
# See: https://docs.djangoproject.com/en/dev/ref/settings/#managers
|
||||||
MANAGERS = ADMINS
|
MANAGERS = ADMINS
|
||||||
|
@ -176,15 +188,15 @@ STATIC_ROOT = str(ROOT_DIR('staticfiles'))
|
||||||
STATIC_URL = '/static/'
|
STATIC_URL = '/static/'
|
||||||
|
|
||||||
# See: https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#std:setting-STATICFILES_DIRS
|
# See: https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#std:setting-STATICFILES_DIRS
|
||||||
STATICFILES_DIRS = (
|
STATICFILES_DIRS = [
|
||||||
str(APPS_DIR.path('static')),
|
str(APPS_DIR.path('static')),
|
||||||
)
|
]
|
||||||
|
|
||||||
# See: https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#staticfiles-finders
|
# See: https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#staticfiles-finders
|
||||||
STATICFILES_FINDERS = (
|
STATICFILES_FINDERS = [
|
||||||
'django.contrib.staticfiles.finders.FileSystemFinder',
|
'django.contrib.staticfiles.finders.FileSystemFinder',
|
||||||
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
|
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
|
||||||
)
|
]
|
||||||
|
|
||||||
# MEDIA CONFIGURATION
|
# MEDIA CONFIGURATION
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
@ -201,6 +213,16 @@ ROOT_URLCONF = 'config.urls'
|
||||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#wsgi-application
|
# See: https://docs.djangoproject.com/en/dev/ref/settings/#wsgi-application
|
||||||
WSGI_APPLICATION = 'config.wsgi.application'
|
WSGI_APPLICATION = 'config.wsgi.application'
|
||||||
|
|
||||||
|
# PASSWORD STORAGE SETTINGS
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# See https://docs.djangoproject.com/en/dev/topics/auth/passwords/#using-argon2-with-django
|
||||||
|
PASSWORD_HASHERS = [
|
||||||
|
'django.contrib.auth.hashers.Argon2PasswordHasher',
|
||||||
|
'django.contrib.auth.hashers.PBKDF2PasswordHasher',
|
||||||
|
'django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher',
|
||||||
|
'django.contrib.auth.hashers.BCryptSHA256PasswordHasher',
|
||||||
|
'django.contrib.auth.hashers.BCryptPasswordHasher',
|
||||||
|
]
|
||||||
|
|
||||||
# PASSWORD VALIDATION
|
# PASSWORD VALIDATION
|
||||||
# https://docs.djangoproject.com/en/dev/ref/settings/#auth-password-validators
|
# https://docs.djangoproject.com/en/dev/ref/settings/#auth-password-validators
|
||||||
|
@ -223,10 +245,10 @@ AUTH_PASSWORD_VALIDATORS = [
|
||||||
|
|
||||||
# AUTHENTICATION CONFIGURATION
|
# AUTHENTICATION CONFIGURATION
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
AUTHENTICATION_BACKENDS = (
|
AUTHENTICATION_BACKENDS = [
|
||||||
'django.contrib.auth.backends.ModelBackend',
|
'django.contrib.auth.backends.ModelBackend',
|
||||||
'allauth.account.auth_backends.AuthenticationBackend',
|
'allauth.account.auth_backends.AuthenticationBackend',
|
||||||
)
|
]
|
||||||
|
|
||||||
# Some really nice defaults
|
# Some really nice defaults
|
||||||
ACCOUNT_AUTHENTICATION_METHOD = 'username'
|
ACCOUNT_AUTHENTICATION_METHOD = 'username'
|
||||||
|
@ -247,9 +269,7 @@ LOGIN_URL = 'account_login'
|
||||||
AUTOSLUG_SLUGIFY_FUNCTION = 'slugify.slugify'
|
AUTOSLUG_SLUGIFY_FUNCTION = 'slugify.slugify'
|
||||||
{% if cookiecutter.use_celery == 'y' %}
|
{% if cookiecutter.use_celery == 'y' %}
|
||||||
########## CELERY
|
########## CELERY
|
||||||
INSTALLED_APPS += ('{{cookiecutter.project_slug}}.taskapp.celery.CeleryConfig',)
|
INSTALLED_APPS += ['{{cookiecutter.project_slug}}.taskapp.celery.CeleryConfig']
|
||||||
# if you are not using the django database broker (e.g. rabbitmq, redis, memcached), you can remove the next line.
|
|
||||||
INSTALLED_APPS += ('kombu.transport.django',)
|
|
||||||
BROKER_URL = env('CELERY_BROKER_URL', default='django://')
|
BROKER_URL = env('CELERY_BROKER_URL', default='django://')
|
||||||
if BROKER_URL == 'django://':
|
if BROKER_URL == 'django://':
|
||||||
CELERY_RESULT_BACKEND = 'redis://'
|
CELERY_RESULT_BACKEND = 'redis://'
|
||||||
|
@ -261,8 +281,8 @@ else:
|
||||||
{%- if cookiecutter.use_compressor == 'y'-%}
|
{%- if cookiecutter.use_compressor == 'y'-%}
|
||||||
# django-compressor
|
# django-compressor
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
INSTALLED_APPS += ("compressor", )
|
INSTALLED_APPS += ['compressor']
|
||||||
STATICFILES_FINDERS += ("compressor.finders.CompressorFinder", )
|
STATICFILES_FINDERS += ['compressor.finders.CompressorFinder']
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
|
||||||
# Location of root django.contrib.admin URL, use {% raw %}{% url 'admin:index' %}{% endraw %}
|
# Location of root django.contrib.admin URL, use {% raw %}{% url 'admin:index' %}{% endraw %}
|
|
@ -14,7 +14,7 @@ Local settings
|
||||||
|
|
||||||
import socket
|
import socket
|
||||||
import os
|
import os
|
||||||
from .common import * # noqa
|
from .base import * # noqa
|
||||||
|
|
||||||
# DEBUG
|
# DEBUG
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
@ -32,7 +32,7 @@ SECRET_KEY = env('DJANGO_SECRET_KEY', default='CHANGEME!!!')
|
||||||
|
|
||||||
EMAIL_PORT = 1025
|
EMAIL_PORT = 1025
|
||||||
{% if cookiecutter.use_mailhog == 'y' and cookiecutter.use_docker == 'y' %}
|
{% if cookiecutter.use_mailhog == 'y' and cookiecutter.use_docker == 'y' %}
|
||||||
EMAIL_HOST = env("EMAIL_HOST", default='mailhog')
|
EMAIL_HOST = env('EMAIL_HOST', default='mailhog')
|
||||||
{% else %}
|
{% else %}
|
||||||
EMAIL_HOST = 'localhost'
|
EMAIL_HOST = 'localhost'
|
||||||
EMAIL_BACKEND = env('DJANGO_EMAIL_BACKEND',
|
EMAIL_BACKEND = env('DJANGO_EMAIL_BACKEND',
|
||||||
|
@ -50,14 +50,14 @@ CACHES = {
|
||||||
|
|
||||||
# django-debug-toolbar
|
# django-debug-toolbar
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
MIDDLEWARE += ('debug_toolbar.middleware.DebugToolbarMiddleware',)
|
MIDDLEWARE += ['debug_toolbar.middleware.DebugToolbarMiddleware', ]
|
||||||
INSTALLED_APPS += ('debug_toolbar', )
|
INSTALLED_APPS += ['debug_toolbar', ]
|
||||||
|
|
||||||
INTERNAL_IPS = ['127.0.0.1', '10.0.2.2', ]
|
INTERNAL_IPS = ['127.0.0.1', '10.0.2.2', ]
|
||||||
# tricks to have debug toolbar when developing with docker
|
# tricks to have debug toolbar when developing with docker
|
||||||
if os.environ.get('USE_DOCKER') == 'yes':
|
if os.environ.get('USE_DOCKER') == 'yes':
|
||||||
ip = socket.gethostbyname(socket.gethostname())
|
ip = socket.gethostbyname(socket.gethostname())
|
||||||
INTERNAL_IPS += [ip[:-1] + "1"]
|
INTERNAL_IPS += [ip[:-1] + '1']
|
||||||
|
|
||||||
DEBUG_TOOLBAR_CONFIG = {
|
DEBUG_TOOLBAR_CONFIG = {
|
||||||
'DISABLE_PANELS': [
|
'DISABLE_PANELS': [
|
||||||
|
@ -68,7 +68,7 @@ DEBUG_TOOLBAR_CONFIG = {
|
||||||
|
|
||||||
# django-extensions
|
# django-extensions
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
INSTALLED_APPS += ('django_extensions', )
|
INSTALLED_APPS += ['django_extensions', ]
|
||||||
|
|
||||||
# TESTING
|
# TESTING
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
|
|
@ -20,7 +20,7 @@ from django.utils import six
|
||||||
import logging
|
import logging
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
from .common import * # noqa
|
from .base import * # noqa
|
||||||
|
|
||||||
# SECRET CONFIGURATION
|
# SECRET CONFIGURATION
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
@ -36,36 +36,34 @@ SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
|
||||||
{%- if cookiecutter.use_sentry_for_error_reporting == 'y' %}
|
{%- if cookiecutter.use_sentry_for_error_reporting == 'y' %}
|
||||||
# raven sentry client
|
# raven sentry client
|
||||||
# See https://docs.sentry.io/clients/python/integrations/django/
|
# See https://docs.sentry.io/clients/python/integrations/django/
|
||||||
INSTALLED_APPS += ('raven.contrib.django.raven_compat', )
|
INSTALLED_APPS += ['raven.contrib.django.raven_compat', ]
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{%- if cookiecutter.use_whitenoise == 'y' %}
|
{%- if cookiecutter.use_whitenoise == 'y' %}
|
||||||
# Use Whitenoise to serve static files
|
# Use Whitenoise to serve static files
|
||||||
# See: https://whitenoise.readthedocs.io/
|
# See: https://whitenoise.readthedocs.io/
|
||||||
WHITENOISE_MIDDLEWARE = ('whitenoise.middleware.WhiteNoiseMiddleware', )
|
WHITENOISE_MIDDLEWARE = ['whitenoise.middleware.WhiteNoiseMiddleware', ]
|
||||||
MIDDLEWARE = WHITENOISE_MIDDLEWARE + MIDDLEWARE
|
MIDDLEWARE = WHITENOISE_MIDDLEWARE + MIDDLEWARE
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{%- if cookiecutter.use_sentry_for_error_reporting == 'y' -%}
|
{%- if cookiecutter.use_sentry_for_error_reporting == 'y' -%}
|
||||||
RAVEN_MIDDLEWARE = ('raven.contrib.django.raven_compat.middleware.SentryResponseErrorIdMiddleware', )
|
RAVEN_MIDDLEWARE = ['raven.contrib.django.raven_compat.middleware.SentryResponseErrorIdMiddleware']
|
||||||
MIDDLEWARE = RAVEN_MIDDLEWARE + MIDDLEWARE
|
MIDDLEWARE = RAVEN_MIDDLEWARE + MIDDLEWARE
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{%- if cookiecutter.use_opbeat == 'y' -%}
|
{%- if cookiecutter.use_opbeat == 'y' -%}
|
||||||
# opbeat integration
|
# opbeat integration
|
||||||
# See https://opbeat.com/languages/django/
|
# See https://opbeat.com/languages/django/
|
||||||
INSTALLED_APPS += ('opbeat.contrib.django',)
|
INSTALLED_APPS += ['opbeat.contrib.django', ]
|
||||||
OPBEAT = {
|
OPBEAT = {
|
||||||
'ORGANIZATION_ID': env('DJANGO_OPBEAT_ORGANIZATION_ID'),
|
'ORGANIZATION_ID': env('DJANGO_OPBEAT_ORGANIZATION_ID'),
|
||||||
'APP_ID': env('DJANGO_OPBEAT_APP_ID'),
|
'APP_ID': env('DJANGO_OPBEAT_APP_ID'),
|
||||||
'SECRET_TOKEN': env('DJANGO_OPBEAT_SECRET_TOKEN')
|
'SECRET_TOKEN': env('DJANGO_OPBEAT_SECRET_TOKEN')
|
||||||
}
|
}
|
||||||
MIDDLEWARE = (
|
MIDDLEWARE = ['opbeat.contrib.django.middleware.OpbeatAPMMiddleware', ] + MIDDLEWARE
|
||||||
'opbeat.contrib.django.middleware.OpbeatAPMMiddleware',
|
|
||||||
) + MIDDLEWARE
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
# SECURITY CONFIGURATION
|
# SECURITY CONFIGURATION
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
# See https://docs.djangoproject.com/en/1.9/ref/middleware/#module-django.middleware.security
|
# See https://docs.djangoproject.com/en/dev/ref/middleware/#module-django.middleware.security
|
||||||
# and https://docs.djangoproject.com/ja/1.9/howto/deployment/checklist/#run-manage-py-check-deploy
|
# and https://docs.djangoproject.com/en/dev/howto/deployment/checklist/#run-manage-py-check-deploy
|
||||||
|
|
||||||
# set this to 60 seconds and then to 518400 when you can prove it works
|
# set this to 60 seconds and then to 518400 when you can prove it works
|
||||||
SECURE_HSTS_SECONDS = 60
|
SECURE_HSTS_SECONDS = 60
|
||||||
|
@ -84,11 +82,11 @@ X_FRAME_OPTIONS = 'DENY'
|
||||||
# SITE CONFIGURATION
|
# SITE CONFIGURATION
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
# Hosts/domain names that are valid for this site
|
# Hosts/domain names that are valid for this site
|
||||||
# See https://docs.djangoproject.com/en/1.6/ref/settings/#allowed-hosts
|
# See https://docs.djangoproject.com/en/dev/ref/settings/#allowed-hosts
|
||||||
ALLOWED_HOSTS = env.list('DJANGO_ALLOWED_HOSTS', default=['{{cookiecutter.domain_name}}'])
|
ALLOWED_HOSTS = env.list('DJANGO_ALLOWED_HOSTS', default=['{{cookiecutter.domain_name}}', ])
|
||||||
# END SITE CONFIGURATION
|
# END SITE CONFIGURATION
|
||||||
|
|
||||||
INSTALLED_APPS += ('gunicorn', )
|
INSTALLED_APPS += ['gunicorn', ]
|
||||||
|
|
||||||
|
|
||||||
# STORAGE CONFIGURATION
|
# STORAGE CONFIGURATION
|
||||||
|
@ -96,9 +94,7 @@ INSTALLED_APPS += ('gunicorn', )
|
||||||
# Uploaded Media Files
|
# Uploaded Media Files
|
||||||
# ------------------------
|
# ------------------------
|
||||||
# See: http://django-storages.readthedocs.io/en/latest/index.html
|
# See: http://django-storages.readthedocs.io/en/latest/index.html
|
||||||
INSTALLED_APPS += (
|
INSTALLED_APPS += ['storages', ]
|
||||||
'storages',
|
|
||||||
)
|
|
||||||
|
|
||||||
AWS_ACCESS_KEY_ID = env('DJANGO_AWS_ACCESS_KEY_ID')
|
AWS_ACCESS_KEY_ID = env('DJANGO_AWS_ACCESS_KEY_ID')
|
||||||
AWS_SECRET_ACCESS_KEY = env('DJANGO_AWS_SECRET_ACCESS_KEY')
|
AWS_SECRET_ACCESS_KEY = env('DJANGO_AWS_SECRET_ACCESS_KEY')
|
||||||
|
@ -143,7 +139,7 @@ STATICFILES_STORAGE = 'config.settings.production.StaticRootS3BotoStorage'
|
||||||
# For Django 1.7+, 'collectfast' should come before
|
# For Django 1.7+, 'collectfast' should come before
|
||||||
# 'django.contrib.staticfiles'
|
# 'django.contrib.staticfiles'
|
||||||
AWS_PRELOAD_METADATA = True
|
AWS_PRELOAD_METADATA = True
|
||||||
INSTALLED_APPS = ('collectfast', ) + INSTALLED_APPS
|
INSTALLED_APPS = ['collectfast', ] + INSTALLED_APPS
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
{% if cookiecutter.use_compressor == 'y'-%}
|
{% if cookiecutter.use_compressor == 'y'-%}
|
||||||
# COMPRESSOR
|
# COMPRESSOR
|
||||||
|
@ -156,16 +152,16 @@ COMPRESS_ENABLED = env.bool('COMPRESS_ENABLED', default=True)
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
DEFAULT_FROM_EMAIL = env('DJANGO_DEFAULT_FROM_EMAIL',
|
DEFAULT_FROM_EMAIL = env('DJANGO_DEFAULT_FROM_EMAIL',
|
||||||
default='{{cookiecutter.project_name}} <noreply@{{cookiecutter.domain_name}}>')
|
default='{{cookiecutter.project_name}} <noreply@{{cookiecutter.domain_name}}>')
|
||||||
EMAIL_SUBJECT_PREFIX = env('DJANGO_EMAIL_SUBJECT_PREFIX', default='[{{cookiecutter.project_name}}] ')
|
EMAIL_SUBJECT_PREFIX = env('DJANGO_EMAIL_SUBJECT_PREFIX', default='[{{cookiecutter.project_name}}]')
|
||||||
SERVER_EMAIL = env('DJANGO_SERVER_EMAIL', default=DEFAULT_FROM_EMAIL)
|
SERVER_EMAIL = env('DJANGO_SERVER_EMAIL', default=DEFAULT_FROM_EMAIL)
|
||||||
|
|
||||||
# Anymail with Mailgun
|
# Anymail with Mailgun
|
||||||
INSTALLED_APPS += ("anymail", )
|
INSTALLED_APPS += ['anymail', ]
|
||||||
ANYMAIL = {
|
ANYMAIL = {
|
||||||
"MAILGUN_API_KEY": env('DJANGO_MAILGUN_API_KEY'),
|
'MAILGUN_API_KEY': env('DJANGO_MAILGUN_API_KEY'),
|
||||||
"MAILGUN_SENDER_DOMAIN": env('MAILGUN_SENDER_DOMAIN')
|
'MAILGUN_SENDER_DOMAIN': env('MAILGUN_SENDER_DOMAIN')
|
||||||
}
|
}
|
||||||
EMAIL_BACKEND = "anymail.backends.mailgun.MailgunBackend"
|
EMAIL_BACKEND = 'anymail.backends.mailgun.MailgunBackend'
|
||||||
|
|
||||||
# TEMPLATE CONFIGURATION
|
# TEMPLATE CONFIGURATION
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
|
@ -199,7 +195,7 @@ DATABASES['default'] = env.db('DATABASE_URL')
|
||||||
# CACHING
|
# CACHING
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
{% if cookiecutter.use_elasticbeanstalk_experimental.lower() == 'y' -%}
|
{% if cookiecutter.use_elasticbeanstalk_experimental.lower() == 'y' -%}
|
||||||
REDIS_LOCATION = "redis://{}:{}/0".format(
|
REDIS_LOCATION = 'redis://{}:{}/0'.format(
|
||||||
env('REDIS_ENDPOINT_ADDRESS'),
|
env('REDIS_ENDPOINT_ADDRESS'),
|
||||||
env('REDIS_PORT')
|
env('REDIS_PORT')
|
||||||
)
|
)
|
||||||
|
@ -228,7 +224,7 @@ LOGGING = {
|
||||||
'disable_existing_loggers': True,
|
'disable_existing_loggers': True,
|
||||||
'root': {
|
'root': {
|
||||||
'level': 'WARNING',
|
'level': 'WARNING',
|
||||||
'handlers': ['sentry'],
|
'handlers': ['sentry', ],
|
||||||
},
|
},
|
||||||
'formatters': {
|
'formatters': {
|
||||||
'verbose': {
|
'verbose': {
|
||||||
|
@ -250,22 +246,22 @@ LOGGING = {
|
||||||
'loggers': {
|
'loggers': {
|
||||||
'django.db.backends': {
|
'django.db.backends': {
|
||||||
'level': 'ERROR',
|
'level': 'ERROR',
|
||||||
'handlers': ['console'],
|
'handlers': ['console', ],
|
||||||
'propagate': False,
|
'propagate': False,
|
||||||
},
|
},
|
||||||
'raven': {
|
'raven': {
|
||||||
'level': 'DEBUG',
|
'level': 'DEBUG',
|
||||||
'handlers': ['console'],
|
'handlers': ['console', ],
|
||||||
'propagate': False,
|
'propagate': False,
|
||||||
},
|
},
|
||||||
'sentry.errors': {
|
'sentry.errors': {
|
||||||
'level': 'DEBUG',
|
'level': 'DEBUG',
|
||||||
'handlers': ['console'],
|
'handlers': ['console', ],
|
||||||
'propagate': False,
|
'propagate': False,
|
||||||
},
|
},
|
||||||
'django.security.DisallowedHost': {
|
'django.security.DisallowedHost': {
|
||||||
'level': 'ERROR',
|
'level': 'ERROR',
|
||||||
'handlers': ['console', 'sentry'],
|
'handlers': ['console', 'sentry', ],
|
||||||
'propagate': False,
|
'propagate': False,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -282,7 +278,7 @@ RAVEN_CONFIG = {
|
||||||
# A sample logging configuration. The only tangible logging
|
# A sample logging configuration. The only tangible logging
|
||||||
# performed by this configuration is to send an email to
|
# performed by this configuration is to send an email to
|
||||||
# the site admins on every HTTP 500 error when DEBUG=False.
|
# the site admins on every HTTP 500 error when DEBUG=False.
|
||||||
# See http://docs.djangoproject.com/en/dev/topics/logging for
|
# See https://docs.djangoproject.com/en/dev/topics/logging for
|
||||||
# more details on how to customize your logging configuration.
|
# more details on how to customize your logging configuration.
|
||||||
LOGGING = {
|
LOGGING = {
|
||||||
'version': 1,
|
'version': 1,
|
||||||
|
@ -301,7 +297,7 @@ LOGGING = {
|
||||||
'handlers': {
|
'handlers': {
|
||||||
'mail_admins': {
|
'mail_admins': {
|
||||||
'level': 'ERROR',
|
'level': 'ERROR',
|
||||||
'filters': ['require_debug_false'],
|
'filters': ['require_debug_false', ],
|
||||||
'class': 'django.utils.log.AdminEmailHandler'
|
'class': 'django.utils.log.AdminEmailHandler'
|
||||||
},
|
},
|
||||||
'console': {
|
'console': {
|
||||||
|
@ -312,13 +308,13 @@ LOGGING = {
|
||||||
},
|
},
|
||||||
'loggers': {
|
'loggers': {
|
||||||
'django.request': {
|
'django.request': {
|
||||||
'handlers': ['mail_admins'],
|
'handlers': ['mail_admins', ],
|
||||||
'level': 'ERROR',
|
'level': 'ERROR',
|
||||||
'propagate': True
|
'propagate': True
|
||||||
},
|
},
|
||||||
'django.security.DisallowedHost': {
|
'django.security.DisallowedHost': {
|
||||||
'level': 'ERROR',
|
'level': 'ERROR',
|
||||||
'handlers': ['console', 'mail_admins'],
|
'handlers': ['console', 'mail_admins', ],
|
||||||
'propagate': True
|
'propagate': True
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@ Test settings
|
||||||
- Used to run tests fast on the continuous integration server and locally
|
- Used to run tests fast on the continuous integration server and locally
|
||||||
'''
|
'''
|
||||||
|
|
||||||
from .common import * # noqa
|
from .base import * # noqa
|
||||||
|
|
||||||
|
|
||||||
# DEBUG
|
# DEBUG
|
||||||
|
@ -47,16 +47,16 @@ TEST_RUNNER = 'django.test.runner.DiscoverRunner'
|
||||||
# PASSWORD HASHING
|
# PASSWORD HASHING
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
# Use fast password hasher so tests run faster
|
# Use fast password hasher so tests run faster
|
||||||
PASSWORD_HASHERS = (
|
PASSWORD_HASHERS = [
|
||||||
'django.contrib.auth.hashers.MD5PasswordHasher',
|
'django.contrib.auth.hashers.MD5PasswordHasher',
|
||||||
)
|
]
|
||||||
|
|
||||||
# TEMPLATE LOADERS
|
# TEMPLATE LOADERS
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
# Keep templates in memory so tests run faster
|
# Keep templates in memory so tests run faster
|
||||||
TEMPLATES[0]['OPTIONS']['loaders'] = [
|
TEMPLATES[0]['OPTIONS']['loaders'] = [
|
||||||
('django.template.loaders.cached.Loader', [
|
['django.template.loaders.cached.Loader', [
|
||||||
'django.template.loaders.filesystem.Loader',
|
'django.template.loaders.filesystem.Loader',
|
||||||
'django.template.loaders.app_directories.Loader',
|
'django.template.loaders.app_directories.Loader',
|
||||||
]),
|
], ],
|
||||||
]
|
]
|
||||||
|
|
|
@ -19,7 +19,8 @@ services:
|
||||||
dockerfile: ./compose/django/Dockerfile-dev
|
dockerfile: ./compose/django/Dockerfile-dev
|
||||||
command: /start-dev.sh
|
command: /start-dev.sh
|
||||||
depends_on:
|
depends_on:
|
||||||
- postgres
|
- postgres{% if cookiecutter.use_mailhog == 'y' %}
|
||||||
|
- mailhog{% endif %}
|
||||||
environment:
|
environment:
|
||||||
- POSTGRES_USER={{cookiecutter.project_slug}}
|
- POSTGRES_USER={{cookiecutter.project_slug}}
|
||||||
- USE_DOCKER=yes
|
- USE_DOCKER=yes
|
||||||
|
@ -27,11 +28,6 @@ services:
|
||||||
- .:/app
|
- .:/app
|
||||||
ports:
|
ports:
|
||||||
- "8000:8000"
|
- "8000:8000"
|
||||||
links:
|
|
||||||
- postgres
|
|
||||||
{% if cookiecutter.use_mailhog == 'y' %}
|
|
||||||
- mailhog
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if cookiecutter.use_pycharm == 'y' %}
|
{% if cookiecutter.use_pycharm == 'y' %}
|
||||||
pycharm:
|
pycharm:
|
||||||
|
@ -44,8 +40,6 @@ services:
|
||||||
- POSTGRES_USER={{cookiecutter.project_slug}}
|
- POSTGRES_USER={{cookiecutter.project_slug}}
|
||||||
volumes:
|
volumes:
|
||||||
- .:/app
|
- .:/app
|
||||||
links:
|
|
||||||
- postgres
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if cookiecutter.use_mailhog == 'y' %}
|
{% if cookiecutter.use_mailhog == 'y' %}
|
||||||
|
|
|
@ -31,7 +31,7 @@ The Docker compose tool (previously known as `fig`_) makes linking these contain
|
||||||
...
|
...
|
||||||
docker-compose.yml
|
docker-compose.yml
|
||||||
|
|
||||||
Each component of your application would get its own `Dockerfile`_. The rest of this example assumes you are using the `base postgres image`_ for your database. Your database settings in `config/common.py` might then look something like:
|
Each component of your application would get its own `Dockerfile`_. The rest of this example assumes you are using the `base postgres image`_ for your database. Your database settings in `config/base.py` might then look something like:
|
||||||
|
|
||||||
.. _Dockerfile: https://docs.docker.com/reference/builder/
|
.. _Dockerfile: https://docs.docker.com/reference/builder/
|
||||||
.. _base postgres image: https://registry.hub.docker.com/_/postgres/
|
.. _base postgres image: https://registry.hub.docker.com/_/postgres/
|
||||||
|
|
|
@ -14,7 +14,7 @@ This repository comes with already prepared "Run/Debug Configurations" for docke
|
||||||
|
|
||||||
.. image:: images/2.png
|
.. image:: images/2.png
|
||||||
|
|
||||||
But as you can see, at the beggining there is something wrong with them. They have red X on django icon, and they cannot be used, withot configuring remote python interpteter. To do that, you have to go to *Settings > Build, Execution, Deployment* first.
|
But as you can see, at the beggining there is something wrong with them. They have red X on django icon, and they cannot be used, without configuring remote python interpteter. To do that, you have to go to *Settings > Build, Execution, Deployment* first.
|
||||||
|
|
||||||
|
|
||||||
Next, you have to add new remote python interpreter, based on already tested deployment settings. Go to *Settings > Project > Project Interpreter*. Click on the cog icon, and click *Add Remote*.
|
Next, you have to add new remote python interpreter, based on already tested deployment settings. Go to *Settings > Project > Project Interpreter*. Click on the cog icon, and click *Add Remote*.
|
||||||
|
@ -48,7 +48,7 @@ After few seconds, all *Run/Debug Configurations* should be ready to use.
|
||||||
* run and debug tests
|
* run and debug tests
|
||||||
.. image:: images/f2.png
|
.. image:: images/f2.png
|
||||||
.. image:: images/f3.png
|
.. image:: images/f3.png
|
||||||
* run and debug migrations or different django managment commands
|
* run and debug migrations or different django management commands
|
||||||
.. image:: images/f4.png
|
.. image:: images/f4.png
|
||||||
* and many others..
|
* and many others..
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ POSTGRES_PASSWORD=mysecretpass
|
||||||
POSTGRES_USER=postgresuser
|
POSTGRES_USER=postgresuser
|
||||||
|
|
||||||
# General settings
|
# General settings
|
||||||
|
# DJANGO_READ_DOT_ENV_FILE=True
|
||||||
DJANGO_ADMIN_URL=
|
DJANGO_ADMIN_URL=
|
||||||
DJANGO_SETTINGS_MODULE=config.settings.production
|
DJANGO_SETTINGS_MODULE=config.settings.production
|
||||||
DJANGO_SECRET_KEY=CHANGEME!!!
|
DJANGO_SECRET_KEY=CHANGEME!!!
|
||||||
|
|
|
@ -48,7 +48,7 @@ gulp.task('styles', function() {
|
||||||
return gulp.src(paths.sass + '/project.scss')
|
return gulp.src(paths.sass + '/project.scss')
|
||||||
.pipe(sass().on('error', sass.logError))
|
.pipe(sass().on('error', sass.logError))
|
||||||
.pipe(plumber()) // Checks for errors
|
.pipe(plumber()) // Checks for errors
|
||||||
.pipe(autoprefixer({browsers: ['last 2 version']})) // Adds vendor prefixes
|
.pipe(autoprefixer({browsers: ['last 2 versions']})) // Adds vendor prefixes
|
||||||
.pipe(pixrem()) // add fallbacks for rem units
|
.pipe(pixrem()) // add fallbacks for rem units
|
||||||
.pipe(gulp.dest(paths.css))
|
.pipe(gulp.dest(paths.css))
|
||||||
.pipe(rename({ suffix: '.min' }))
|
.pipe(rename({ suffix: '.min' }))
|
||||||
|
@ -88,17 +88,8 @@ gulp.task('browserSync', function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
// Default task
|
|
||||||
gulp.task('default', function() {
|
|
||||||
runSequence(['styles', 'scripts', 'imgCompression'], 'runServer', 'browserSync');
|
|
||||||
});
|
|
||||||
|
|
||||||
////////////////////////////////
|
|
||||||
//Watch//
|
|
||||||
////////////////////////////////
|
|
||||||
|
|
||||||
// Watch
|
// Watch
|
||||||
gulp.task('watch', ['default'], function() {
|
gulp.task('watch', function() {
|
||||||
|
|
||||||
gulp.watch(paths.sass + '/*.scss', ['styles']);
|
gulp.watch(paths.sass + '/*.scss', ['styles']);
|
||||||
gulp.watch(paths.js + '/*.js', ['scripts']).on("change", reload);
|
gulp.watch(paths.js + '/*.js', ['scripts']).on("change", reload);
|
||||||
|
@ -106,3 +97,8 @@ gulp.task('watch', ['default'], function() {
|
||||||
gulp.watch(paths.templates + '/**/*.html').on("change", reload);
|
gulp.watch(paths.templates + '/**/*.html').on("change", reload);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Default task
|
||||||
|
gulp.task('default', function() {
|
||||||
|
runSequence(['styles', 'scripts', 'imgCompression'], 'runServer', 'browserSync', 'watch');
|
||||||
|
});
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
[pytest]
|
[pytest]
|
||||||
DJANGO_SETTINGS_MODULE=config.settings.local
|
DJANGO_SETTINGS_MODULE=config.settings.test
|
||||||
|
|
|
@ -7,7 +7,7 @@ wheel==0.29.0
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
|
||||||
# Bleeding edge Django
|
# Bleeding edge Django
|
||||||
django==1.10.5
|
django==1.10.7 # pyup: >=1.10,<1.11
|
||||||
|
|
||||||
# Configuration
|
# Configuration
|
||||||
django-environ==0.4.1
|
django-environ==0.4.1
|
||||||
|
@ -26,30 +26,33 @@ django-model-utils==2.6.1
|
||||||
# Images
|
# Images
|
||||||
Pillow==4.0.0
|
Pillow==4.0.0
|
||||||
|
|
||||||
|
# Password storage
|
||||||
|
argon2-cffi==16.3.0
|
||||||
|
|
||||||
# For user registration, either via email or social
|
# For user registration, either via email or social
|
||||||
# Well-built with regular release cycles!
|
# Well-built with regular release cycles!
|
||||||
django-allauth==0.30.0
|
django-allauth==0.31.0
|
||||||
|
|
||||||
{% if cookiecutter.windows == 'y' -%}
|
{% if cookiecutter.windows == 'y' -%}
|
||||||
# On Windows, you must download/install psycopg2 manually
|
# On Windows, you must download/install psycopg2 manually
|
||||||
# from http://www.lfd.uci.edu/~gohlke/pythonlibs/#psycopg
|
# from http://www.lfd.uci.edu/~gohlke/pythonlibs/#psycopg
|
||||||
{% else %}
|
{% else %}
|
||||||
# Python-PostgreSQL Database Adapter
|
# Python-PostgreSQL Database Adapter
|
||||||
psycopg2==2.6.2
|
psycopg2==2.7.1
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
|
||||||
# Unicode slugification
|
# Unicode slugification
|
||||||
awesome-slugify==1.6.5
|
awesome-slugify==1.6.5
|
||||||
|
|
||||||
# Time zones support
|
# Time zones support
|
||||||
pytz==2016.10
|
pytz==2017.2
|
||||||
|
|
||||||
# Redis support
|
# Redis support
|
||||||
django-redis==4.7.0
|
django-redis==4.7.0
|
||||||
redis>=2.10.5
|
redis>=2.10.5
|
||||||
|
|
||||||
{% if cookiecutter.use_celery == "y" %}
|
{% if cookiecutter.use_celery == "y" %}
|
||||||
celery==3.1.24
|
celery==4.0.2
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if cookiecutter.use_compressor == "y" %}
|
{% if cookiecutter.use_compressor == "y" %}
|
||||||
|
|
|
@ -2,15 +2,15 @@
|
||||||
-r base.txt
|
-r base.txt
|
||||||
|
|
||||||
coverage==4.3.4
|
coverage==4.3.4
|
||||||
django-coverage-plugin==1.4.1
|
django-coverage-plugin==1.5.0
|
||||||
|
|
||||||
Sphinx==1.5.2
|
Sphinx==1.5.3
|
||||||
django-extensions==1.7.6
|
django-extensions==1.7.8
|
||||||
Werkzeug==0.11.15
|
Werkzeug==0.12.1
|
||||||
django-test-plus==1.0.17
|
django-test-plus==1.0.17
|
||||||
factory-boy==2.8.1
|
factory-boy==2.8.1
|
||||||
|
|
||||||
django-debug-toolbar==1.6
|
django-debug-toolbar==1.7
|
||||||
|
|
||||||
# improved REPL
|
# improved REPL
|
||||||
ipdb==0.10.2
|
ipdb==0.10.2
|
||||||
|
|
|
@ -6,20 +6,20 @@
|
||||||
# Python-PostgreSQL Database Adapter
|
# Python-PostgreSQL Database Adapter
|
||||||
# If using Win for dev, this assumes Unix in prod
|
# If using Win for dev, this assumes Unix in prod
|
||||||
# ------------------------------------------------
|
# ------------------------------------------------
|
||||||
psycopg2==2.6.2
|
psycopg2==2.7.1
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
|
||||||
# WSGI Handler
|
# WSGI Handler
|
||||||
# ------------------------------------------------
|
# ------------------------------------------------
|
||||||
gevent==1.2.1
|
gevent==1.2.1
|
||||||
gunicorn==19.6.0
|
gunicorn==19.7.1
|
||||||
|
|
||||||
# Static and Media Storage
|
# Static and Media Storage
|
||||||
# ------------------------------------------------
|
# ------------------------------------------------
|
||||||
boto==2.45.0
|
boto==2.46.1
|
||||||
django-storages-redux==1.3.2
|
django-storages-redux==1.3.2
|
||||||
{% if cookiecutter.use_whitenoise != 'y' -%}
|
{% if cookiecutter.use_whitenoise != 'y' -%}
|
||||||
Collectfast==0.5.1
|
Collectfast==0.5.2
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
|
||||||
# Email backends for Mailgun, Postmark, SendGrid and more
|
# Email backends for Mailgun, Postmark, SendGrid and more
|
||||||
|
@ -29,7 +29,7 @@ django-anymail==0.8
|
||||||
{% if cookiecutter.use_sentry_for_error_reporting == "y" -%}
|
{% if cookiecutter.use_sentry_for_error_reporting == "y" -%}
|
||||||
# Raven is the Sentry client
|
# Raven is the Sentry client
|
||||||
# --------------------------
|
# --------------------------
|
||||||
raven==5.32.0
|
raven==6.0.0
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
|
||||||
{% if cookiecutter.use_opbeat == "y" -%}
|
{% if cookiecutter.use_opbeat == "y" -%}
|
||||||
|
|
|
@ -4,11 +4,11 @@
|
||||||
{% if cookiecutter.windows == 'y' -%}
|
{% if cookiecutter.windows == 'y' -%}
|
||||||
# Python-PostgreSQL Database Adapter
|
# Python-PostgreSQL Database Adapter
|
||||||
# If using Win for dev, this assumes Unix in test/prod
|
# If using Win for dev, this assumes Unix in test/prod
|
||||||
psycopg2==2.6.2
|
psycopg2==2.7.1
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
|
||||||
coverage==4.3.4
|
coverage==4.3.4
|
||||||
flake8==3.2.1 # pyup: != 2.6.0
|
flake8==3.3.0 # pyup: != 2.6.0
|
||||||
django-test-plus==1.0.17
|
django-test-plus==1.0.17
|
||||||
factory-boy==2.8.1
|
factory-boy==2.8.1
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
{% raw %}{% extends "base.html" %}
|
{% raw %}{% extends "base.html" %}
|
||||||
|
|
||||||
{% block title %}Page Not found{% endblock %}
|
{% block title %}Page not found{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<h1>Page Not found</h1>
|
<h1>Page not found</h1>
|
||||||
|
|
||||||
<p>This is not the page you were looking for.</p>
|
<p>This is not the page you were looking for.</p>
|
||||||
{% endblock content %}{% endraw %}
|
{% endblock content %}{% endraw %}
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
<form method="POST" action="{% url 'account_reset_password' %}" class="password_reset">
|
<form method="POST" action="{% url 'account_reset_password' %}" class="password_reset">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
{{ form|crispy }}
|
{{ form|crispy }}
|
||||||
<input type="submit" value="{% trans 'Reset My Password' %}" />
|
<input class="btn btn-primary" type="submit" value="{% trans 'Reset My Password' %}" />
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
<p>{% blocktrans %}Please contact us if you have any trouble resetting your password.{% endblocktrans %}</p>
|
<p>{% blocktrans %}Please contact us if you have any trouble resetting your password.{% endblocktrans %}</p>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user