Короткая версия: проверьте, что часовой пояс 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)'
Это более консервативно, чем if tz=='UTC\n'
: если вы сомневаетесь, предположим, что мы находимся в производстве,Обратите внимание, что мы сохраняем часовой пояс в переменную окружения, потому что settings.py
может выполняться более одного раза.Фактически сервер разработки выполняет его дважды, и во второй раз системный часовой пояс уже имеет значение «UTC» (или что-то еще в settings.TIMEZONE
).
Длинная версия:
, обеспечивающая полную уверенность в том, что мы никогда не будем работать на Heroku с DEBUG=True
, и что мы никогда не запускаем сервер разработки на Heroku даже с DEBUG=False
,От 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()
Если вы действительно хотите запустить сервер разработки на Heroku, я предлагаю вам добавить переменную среды, указывающую дату, когда вы можете это сделать.Тогда продолжайте, только если эта дата сегодня.Таким образом, вам придется изменить эту переменную перед началом разработки, но если вы забудете сбросить ее, на следующий день вы все равно будете защищены от случайного запуска в производстве.Конечно, если вы хотите быть сверхконсервативным, вы также можете указать, скажем, 1-часовой интервал, когда применяются исключения.
Наконец, если вы решили принять предложенный выше подход, пока вы находитесь вэто, также установите django-security, добавьте djangosecurity
к INSTALLED_APPS
и добавьте в конец вашего 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