Короткая версия: проверьте, что часовой пояс 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-часовое окно, когда применяются исключения.
Наконец, если вы решили принять подход, предложенный выше, в то время как вы на него, а также установить Джанго-безопасности, добавьте 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
Спасибо, я не заметил, что вы еще не могли установить переменные среды. Это похоже на правильный способ сделать это. – aviraldg
ярлык: on_heroku = 'DYNO' в os.environ –
НЕ используйте on_heroku = 'DYNO' в os.environ, как было предложено tinchou. Эта переменная среды не задана во время определенных действий buildpack, например, когда collectstatic автоматически запускается для сборки django. Это невозможно сделать для отладки - вам гораздо лучше использовать вышеупомянутое решение. – patr1ck