mirror of
https://github.com/cookiecutter/cookiecutter-django.git
synced 2024-11-27 03:54:02 +03:00
Merge pull request #292 from burhan/feature/sentry-support
Feature/sentry support
This commit is contained in:
commit
d65f2bde6d
|
@ -24,11 +24,12 @@ Features
|
||||||
* Registration via django-allauth_
|
* Registration via django-allauth_
|
||||||
* Procfile_ for deploying to Heroku
|
* Procfile_ for deploying to Heroku
|
||||||
* Grunt build for compass and livereload
|
* Grunt build for compass and livereload
|
||||||
* Basic e-mail configurations for send emails via Mailgun_
|
* Basic e-mail configurations for sending emails via Mailgun_
|
||||||
* Media storage using Amazon S3
|
* Media storage using Amazon S3
|
||||||
* Serve static files from Amazon S3 or Whitenoise_ (optional)
|
* Serve static files from Amazon S3 or Whitenoise_ (optional)
|
||||||
* Pre configured Celery_ (optional)
|
* Pre configured Celery_ (optional)
|
||||||
* Integration with Maildump_ for local email testing (optional)
|
* Integration with Maildump_ for local email testing (optional)
|
||||||
|
* Integration with Sentry_ for error logging (optional)
|
||||||
|
|
||||||
.. _Bootstrap: https://github.com/twbs/bootstrap
|
.. _Bootstrap: https://github.com/twbs/bootstrap
|
||||||
.. _AngularJS: https://github.com/angular/angular.js
|
.. _AngularJS: https://github.com/angular/angular.js
|
||||||
|
@ -41,6 +42,7 @@ Features
|
||||||
.. _Whitenoise: https://whitenoise.readthedocs.org/
|
.. _Whitenoise: https://whitenoise.readthedocs.org/
|
||||||
.. _Celery: http://www.celeryproject.org/
|
.. _Celery: http://www.celeryproject.org/
|
||||||
.. _Maildump: https://github.com/ThiefMaster/maildump
|
.. _Maildump: https://github.com/ThiefMaster/maildump
|
||||||
|
.. _Sentry: https://getsentry.com
|
||||||
|
|
||||||
|
|
||||||
Constraints
|
Constraints
|
||||||
|
|
|
@ -12,5 +12,6 @@
|
||||||
"use_whitenoise": "y",
|
"use_whitenoise": "y",
|
||||||
"use_celery": "n",
|
"use_celery": "n",
|
||||||
"use_maildump": "n",
|
"use_maildump": "n",
|
||||||
|
"use_sentry": "n",
|
||||||
"windows": "n"
|
"windows": "n"
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,6 +40,9 @@ Environment Variable Django Setting Development
|
||||||
DJANGO_AWS_ACCESS_KEY_ID AWS_ACCESS_KEY_ID n/a raises error
|
DJANGO_AWS_ACCESS_KEY_ID AWS_ACCESS_KEY_ID n/a raises error
|
||||||
DJANGO_AWS_SECRET_ACCESS_KEY AWS_SECRET_ACCESS_KEY n/a raises error
|
DJANGO_AWS_SECRET_ACCESS_KEY AWS_SECRET_ACCESS_KEY n/a raises error
|
||||||
DJANGO_AWS_STORAGE_BUCKET_NAME AWS_STORAGE_BUCKET_NAME n/a raises error
|
DJANGO_AWS_STORAGE_BUCKET_NAME AWS_STORAGE_BUCKET_NAME n/a raises error
|
||||||
|
{% if cookiecutter.use_sentry == "y" -%}DJANGO_SENTRY_DSN SENTRY_DSN n/a raises error
|
||||||
|
DJANGO_SENTRY_CLIENT SENTRY_CLIENT n/a raven.contrib.django.raven_compat.DjangoClient
|
||||||
|
DJANGO_SENTRY_LOG_LEVEL SENTRY_LOG_LEVEL n/a logging.INFO{%- endif %}
|
||||||
DJANGO_MAILGUN_API_KEY MAILGUN_ACCESS_KEY n/a raises error
|
DJANGO_MAILGUN_API_KEY MAILGUN_ACCESS_KEY n/a raises error
|
||||||
DJANGO_MAILGUN_SERVER_NAME MAILGUN_SERVER_NAME n/a raises error
|
DJANGO_MAILGUN_SERVER_NAME MAILGUN_SERVER_NAME n/a raises error
|
||||||
======================================= =========================== ============================================== ======================================================================
|
======================================= =========================== ============================================== ======================================================================
|
||||||
|
@ -157,6 +160,15 @@ To stop the email server::
|
||||||
|
|
||||||
The email server listens on 127.0.0.1:1025
|
The email server listens on 127.0.0.1:1025
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% if cookiecutter.use_sentry == "y" %}
|
||||||
|
Sentry
|
||||||
|
^^^^^^
|
||||||
|
|
||||||
|
Sentry is an error logging aggregator service. You can sign up for a free account at http://getsentry.com or download and host it yourself.
|
||||||
|
The system is setup with reasonable defaults, including 404 logging and integration with the WSGI application.
|
||||||
|
|
||||||
|
You must set the DSN url in production.
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
It's time to write the code!!!
|
It's time to write the code!!!
|
||||||
|
|
||||||
|
|
|
@ -5,20 +5,25 @@ Production Configurations
|
||||||
- Use djangosecure
|
- Use djangosecure
|
||||||
- Use Amazon's S3 for storing static files and uploaded media
|
- Use Amazon's S3 for storing static files and uploaded media
|
||||||
- Use mailgun to send emails
|
- Use mailgun to send emails
|
||||||
- Use MEMCACHIER on Heroku
|
- Use Redis on Heroku
|
||||||
|
{% if cookiecutter.use_sentry == "y" %}
|
||||||
|
- Use sentry for error logging
|
||||||
|
{% endif %}
|
||||||
'''
|
'''
|
||||||
from __future__ import absolute_import, unicode_literals
|
from __future__ import absolute_import, unicode_literals
|
||||||
|
|
||||||
|
|
||||||
from boto.s3.connection import OrdinaryCallingFormat
|
from boto.s3.connection import OrdinaryCallingFormat
|
||||||
from django.utils import six
|
from django.utils import six
|
||||||
|
{% if cookiecutter.use_sentry == "y" %}
|
||||||
|
import logging
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
from .common import * # noqa
|
from .common import * # noqa
|
||||||
|
|
||||||
# SECRET CONFIGURATION
|
# SECRET CONFIGURATION
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
# See: https://docs.djangoproject.com/en/dev/ref/settings/#secret-key
|
# See: https://docs.djangoproject.com/en/dev/ref/settings/#secret-key
|
||||||
# Raises ImproperlyConfigured exception if DJANO_SECRET_KEY not in os.environ
|
# Raises ImproperlyConfigured exception if DJANGO_SECRET_KEY not in os.environ
|
||||||
SECRET_KEY = env("DJANGO_SECRET_KEY")
|
SECRET_KEY = env("DJANGO_SECRET_KEY")
|
||||||
|
|
||||||
# This ensures that Django will be able to detect a secure connection
|
# This ensures that Django will be able to detect a secure connection
|
||||||
|
@ -28,17 +33,33 @@ SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
|
||||||
# django-secure
|
# django-secure
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
INSTALLED_APPS += ("djangosecure", )
|
INSTALLED_APPS += ("djangosecure", )
|
||||||
|
{% if cookiecutter.use_sentry == "y" -%}
|
||||||
MIDDLEWARE_CLASSES = (
|
# raven sentry client
|
||||||
# Make sure djangosecure.middleware.SecurityMiddleware is listed first
|
# See https://docs.getsentry.com/hosted/clients/python/integrations/django/
|
||||||
|
INSTALLED_APPS += ('raven.contrib.django.raven_compat', )
|
||||||
|
{%- endif %}
|
||||||
|
SECURITY_MIDDLEWARE = (
|
||||||
'djangosecure.middleware.SecurityMiddleware',
|
'djangosecure.middleware.SecurityMiddleware',
|
||||||
) + MIDDLEWARE_CLASSES
|
)
|
||||||
|
{% if cookiecutter.use_sentry == "y" -%}
|
||||||
|
RAVEN_MIDDLEWARE = ('raven.contrib.django.raven_compat.middleware.Sentry404CatchMiddleware',
|
||||||
|
'raven.contrib.django.raven_compat.middleware.SentryResponseErrorIdMiddleware',)
|
||||||
|
MIDDLEWARE_CLASSES = SECURITY_MIDDLEWARE + \
|
||||||
|
RAVEN_MIDDLEWARE + MIDDLEWARE_CLASSES
|
||||||
|
{% else %}
|
||||||
|
|
||||||
|
# Make sure djangosecure.middleware.SecurityMiddleware is listed first
|
||||||
|
MIDDLEWARE_CLASSES = SECURITY_MIDDLEWARE + MIDDLEWARE_CLASSES
|
||||||
|
|
||||||
|
{%- endif %}
|
||||||
|
|
||||||
# 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
|
||||||
SECURE_HSTS_INCLUDE_SUBDOMAINS = env.bool("DJANGO_SECURE_HSTS_INCLUDE_SUBDOMAINS", default=True)
|
SECURE_HSTS_INCLUDE_SUBDOMAINS = env.bool(
|
||||||
|
"DJANGO_SECURE_HSTS_INCLUDE_SUBDOMAINS", default=True)
|
||||||
SECURE_FRAME_DENY = env.bool("DJANGO_SECURE_FRAME_DENY", default=True)
|
SECURE_FRAME_DENY = env.bool("DJANGO_SECURE_FRAME_DENY", default=True)
|
||||||
SECURE_CONTENT_TYPE_NOSNIFF = env.bool("DJANGO_SECURE_CONTENT_TYPE_NOSNIFF", default=True)
|
SECURE_CONTENT_TYPE_NOSNIFF = env.bool(
|
||||||
|
"DJANGO_SECURE_CONTENT_TYPE_NOSNIFF", default=True)
|
||||||
SECURE_BROWSER_XSS_FILTER = True
|
SECURE_BROWSER_XSS_FILTER = True
|
||||||
SESSION_COOKIE_SECURE = False
|
SESSION_COOKIE_SECURE = False
|
||||||
SESSION_COOKIE_HTTPONLY = True
|
SESSION_COOKIE_HTTPONLY = True
|
||||||
|
@ -81,7 +102,8 @@ AWS_HEADERS = {
|
||||||
AWS_EXPIRY, AWS_EXPIRY))
|
AWS_EXPIRY, AWS_EXPIRY))
|
||||||
}
|
}
|
||||||
|
|
||||||
# URL that handles the media served from MEDIA_ROOT, used for managing stored files.
|
# URL that handles the media served from MEDIA_ROOT, used for managing
|
||||||
|
# stored files.
|
||||||
MEDIA_URL = 'https://s3.amazonaws.com/%s/' % AWS_STORAGE_BUCKET_NAME
|
MEDIA_URL = 'https://s3.amazonaws.com/%s/' % AWS_STORAGE_BUCKET_NAME
|
||||||
|
|
||||||
# Static Assests
|
# Static Assests
|
||||||
|
@ -93,7 +115,8 @@ STATICFILES_STORAGE = DEFAULT_FILE_STORAGE
|
||||||
STATIC_URL = MEDIA_URL
|
STATIC_URL = MEDIA_URL
|
||||||
|
|
||||||
# See: https://github.com/antonagestam/collectfast
|
# See: https://github.com/antonagestam/collectfast
|
||||||
# For Django 1.7+, 'collectfast' should come before 'django.contrib.staticfiles'
|
# For Django 1.7+, 'collectfast' should come before
|
||||||
|
# 'django.contrib.staticfiles'
|
||||||
AWS_PRELOAD_METADATA = True
|
AWS_PRELOAD_METADATA = True
|
||||||
INSTALLED_APPS = ('collectfast', ) + INSTALLED_APPS
|
INSTALLED_APPS = ('collectfast', ) + INSTALLED_APPS
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
@ -110,12 +133,11 @@ SERVER_EMAIL = env('DJANGO_SERVER_EMAIL', default=DEFAULT_FROM_EMAIL)
|
||||||
|
|
||||||
# TEMPLATE CONFIGURATION
|
# TEMPLATE CONFIGURATION
|
||||||
# ------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------
|
||||||
# See: https://docs.djangoproject.com/en/dev/ref/templates/api/#django.template.loaders.cached.Loader
|
# See:
|
||||||
|
# https://docs.djangoproject.com/en/dev/ref/templates/api/#django.template.loaders.cached.Loader
|
||||||
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',
|
|
||||||
]),
|
|
||||||
]
|
]
|
||||||
|
|
||||||
# DATABASE CONFIGURATION
|
# DATABASE CONFIGURATION
|
||||||
|
@ -138,4 +160,54 @@ CACHES = {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{% if cookiecutter.use_sentry == "y" %}
|
||||||
|
# Sentry Configuration
|
||||||
|
SENTRY_CLIENT = env('DJANGO_SENTRY_CLIENT')
|
||||||
|
LOGGING = {
|
||||||
|
'version': 1,
|
||||||
|
'disable_existing_loggers': True,
|
||||||
|
'root': {
|
||||||
|
'level': 'WARNING',
|
||||||
|
'handlers': ['sentry'],
|
||||||
|
},
|
||||||
|
'formatters': {
|
||||||
|
'verbose': {
|
||||||
|
'format': '%(levelname)s %(asctime)s %(module)s '
|
||||||
|
'%(process)d %(thread)d %(message)s'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
'handlers': {
|
||||||
|
'sentry': {
|
||||||
|
'level': 'ERROR',
|
||||||
|
'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler',
|
||||||
|
},
|
||||||
|
'console': {
|
||||||
|
'level': 'DEBUG',
|
||||||
|
'class': 'logging.StreamHandler',
|
||||||
|
'formatter': 'verbose'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'loggers': {
|
||||||
|
'django.db.backends': {
|
||||||
|
'level': 'ERROR',
|
||||||
|
'handlers': ['console'],
|
||||||
|
'propagate': False,
|
||||||
|
},
|
||||||
|
'raven': {
|
||||||
|
'level': 'DEBUG',
|
||||||
|
'handlers': ['console'],
|
||||||
|
'propagate': False,
|
||||||
|
},
|
||||||
|
'sentry.errors': {
|
||||||
|
'level': 'DEBUG',
|
||||||
|
'handlers': ['console'],
|
||||||
|
'propagate': False,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
SENTRY_CELERY_LOGLEVEL = env('DJANGO_SENTRY_LOG_LEVEL', logging.INFO)
|
||||||
|
RAVEN_CONFIG = {
|
||||||
|
'CELERY_LOGLEVEL': env('DJANGO_SENTRY_LOG_LEVEL', logging.INFO)
|
||||||
|
}
|
||||||
|
{% endif %}
|
||||||
# Your production stuff: Below this line define 3rd party library settings
|
# Your production stuff: Below this line define 3rd party library settings
|
||||||
|
|
|
@ -19,6 +19,9 @@ from django.core.wsgi import get_wsgi_application
|
||||||
{% if cookiecutter.use_whitenoise == 'y' -%}
|
{% if cookiecutter.use_whitenoise == 'y' -%}
|
||||||
from whitenoise.django import DjangoWhiteNoise
|
from whitenoise.django import DjangoWhiteNoise
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
{% if cookiecutter.use_sentry == "y" -%}
|
||||||
|
from raven.contrib.django.raven_compat.middleware.wsgi import Sentry
|
||||||
|
{%- endif %}
|
||||||
|
|
||||||
# We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks
|
# We defer to a DJANGO_SETTINGS_MODULE already in the environment. This breaks
|
||||||
# if running multiple sites in the same mod_wsgi process. To fix this, use
|
# if running multiple sites in the same mod_wsgi process. To fix this, use
|
||||||
|
@ -36,6 +39,9 @@ application = get_wsgi_application()
|
||||||
# See: https://whitenoise.readthedocs.org/
|
# See: https://whitenoise.readthedocs.org/
|
||||||
application = DjangoWhiteNoise(application)
|
application = DjangoWhiteNoise(application)
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
|
{% if cookiecutter.use_sentry == "y" -%}
|
||||||
|
application = Sentry(application)
|
||||||
|
{%- endif %}
|
||||||
|
|
||||||
# Apply WSGI middleware here.
|
# Apply WSGI middleware here.
|
||||||
# from helloworld.wsgi import HelloWorldApplication
|
# from helloworld.wsgi import HelloWorldApplication
|
||||||
|
|
|
@ -18,3 +18,9 @@ Collectfast==0.2.3
|
||||||
# Mailgun Support
|
# Mailgun Support
|
||||||
# ---------------
|
# ---------------
|
||||||
django-mailgun==0.2.2
|
django-mailgun==0.2.2
|
||||||
|
|
||||||
|
{% if cookiecutter.use_sentry == "y" -%}
|
||||||
|
# Raven is the Sentry client
|
||||||
|
# --------------------------
|
||||||
|
raven
|
||||||
|
{%- endif %}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user