versión corta: verificación de que la zona horaria es UTC/GMT:
if not 'ORIGINAL_TIMEZONE' in os.environ:
f = os.popen('date +%Z')
tz = f.read().upper()
os.environ['ORIGINAL_TIMEZONE']=tz
tz = os.environ['ORIGINAL_TIMEZONE']
if tz != '' and (not 'utc' in tz.lower()) and (not 'gmt' in tz.lower()):
print 'Definitely not running on Heroku (or in production in general)'
else:
print 'Assume that we are running on Heroku (or in production in general)'
Esto es más conservador que if tz=='UTC\n'
: si tiene dudas, suponga que estamos en producción. Tenga en cuenta que estamos guardando la zona horaria en una variable de entorno porque settings.py
se puede ejecutar más de una vez. De hecho, el servidor de desarrollo lo ejecuta dos veces, y la segunda vez que la zona horaria del sistema ya es 'UTC' (o lo que sea que esté en settings.TIMEZONE
).
Versión larga:
hacer absolutamente seguro de que nunca nos falte en Heroku con DEBUG=True
, y que nunca ejecutar el servidor de desarrollo en Heroku incluso con DEBUG=False
. De settings.py
:
RUNNING_DEV_SERVER = (len(sys.argv) > 1) and (sys.argv[1] == 'runserver')
DEBUG = RUNNING_DEV_SERVER
TEMPLATE_DEBUG = DEBUG
# Detect the timezone
if not 'ORIGINAL_TIMEZONE' in os.environ:
f = os.popen('date +%Z')
tz = f.read().upper()
os.environ['ORIGINAL_TIMEZONE']=tz
print ('DEBUG: %d, RUNNING_DEV_SERVER: %d, system timezone: %s ' % (DEBUG, RUNNING_DEV_SERVER, tz))
if not (DEBUG or RUNNING_DEV_SERVER):
SECRET_KEY = os.environ['SECRET_KEY']
else:
print 'Running in DEBUG MODE! Hope this is not in production!'
SECRET_KEY = 'DEBUG_INSECURE_SECRET_KEY_ae$kh(7b%$+a fcw_bdnzl#)$t88x7h2-p%eg_ei5m=w&2p-)1+'
# But what if we are idiots and are still somehow running with DEBUG=True in production?!
# 1. Make sure SECRET_KEY is not set
assert not SECRET_KEY in os.environ
# 2. Make sure the timezone is not UTC or GMT (indicating production)
tz = os.environ['ORIGINAL_TIMEZONE']
assert tz != '' and (not 'UTC' in tz) and (not 'GMT' in tz)
# 3. Look for environment variables suggesting we are in PROD
for key in os.environ:
for red_flag in ['heroku', 'amazon', 'aws', 'prod', 'gondor']:
assert not red_flag in key.lower()
assert not red_flag in os.environ[key].lower()
Si realmente desea ejecutar el servidor de desarrollo en Heroku, sugiero agregar una variable de entorno que especifica la fecha en la que se puede hacer eso. Entonces solo proceda si esta fecha es hoy. De esta manera tendrá que cambiar esta variable antes de comenzar el trabajo de desarrollo, pero si olvida desarmarlo, al día siguiente todavía estará protegido contra la ejecución accidental de la producción. Por supuesto, si quiere ser superconservador, también puede especificar, por ejemplo, una ventana de 1 hora cuando se aplican excepciones.
Por último, si usted decidió adoptar el enfoque sugerido más arriba, mientras que usted está en él, también instalar Django-seguridad, añadir djangosecurity
a INSTALLED_APPS
, y añadir al final de su settings.py
:
if not (DEBUG or RUNNING_DEV_SERVER):
### Security
SECURE_SSL_REDIRECT = True
SECURE_CONTENT_TYPE_NOSNIFF = True
SECURE_HSTS_SECONDS = 86400000
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_BROWSER_XSS_FILTER = True
SESSION_COOKIE_SECURE = True
SESSION_COOKIE_HTTPONLY = True
CSRF_COOKIE_HTTPONLY = True # May have problems with Ajax
CSRF_COOKIE_SECURE = True
Gracias, no me había dado cuenta de que todavía se podían establecer variables de entorno. Esta parece ser la forma correcta de hacerlo. – aviraldg
atajo: on_heroku = 'DYNO' en os.environ –
NO use on_heroku = 'DYNO' en os.environ como sugiere tinchou. Esa variable de entorno no se establece durante ciertas acciones de buildpack, como cuando se ejecuta automáticamente collectstatic para una compilación django. Esto es casi imposible de depurar: es mucho mejor que uses la solución anterior. – patr1ck