Как сделать Python только на Heroku https? - PullRequest
55 голосов
/ 08 декабря 2011

У меня есть приложение python / django на Heroku (стек Cedar), и я хотел бы сделать его доступным только через https.Я включил опцию "ssl piggyback" и могу подключиться к ней через https.

Но как лучше всего отключить http-доступ или перенаправить на https?

Ответы [ 5 ]

64 голосов
/ 09 февраля 2012

Объединение ответа от @CraigKerstiens и @allanlei в то, что я проверил и подтвердил свою работу. Heroku устанавливает HTTP_X_FORWARDED_PROTO в https, когда запрос ssl, и мы можем использовать это для проверки:

from django.conf import settings
from django.http import HttpResponseRedirect


class SSLMiddleware(object):

    def process_request(self, request):
        if not any([settings.DEBUG, request.is_secure(), request.META.get("HTTP_X_FORWARDED_PROTO", "") == 'https']):
            url = request.build_absolute_uri(request.get_full_path())
            secure_url = url.replace("http://", "https://")
            return HttpResponseRedirect(secure_url)
47 голосов
/ 31 октября 2014

Django 1.8 будет иметь базовую поддержку перенаправления без HTTPS (интегрировано с django-secure ):

SECURE_SSL_REDIRECT = True # [1]
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

Для обработки SECURE_SSL_REDIRECT необходимо использовать SecurityMiddleware:

MIDDLEWARE = [
    ...
    'django.middleware.security.SecurityMiddleware',
]

[1] https://docs.djangoproject.com/en/1.8/ref/settings/#secure-ssl-redirect

13 голосов
/ 09 февраля 2012

Не уверен, если ответ @ CraigKerstiens учитывает, что request.is_secure() всегда возвращает False, если находится за обратным прокси-сервером Heroku, а не "исправлено". Если я правильно помню, это вызовет цикл перенаправления HTTP.

Если вы используете Django с gunicorn, другой способ сделать это - добавить следующее в конфигурацию gunicorn

secure_scheme_headers = {
    'X-FORWARDED-PROTO': 'https'
}

Запустите с таким в вашем Procfile

web: python manage.py run_gunicorn -b 0.0.0.0:$PORT -c config/gunicorn.conf

При настройке gunicorn's secure-scheme-header, request.is_secure() будет правильно возвращать True при запросах https. См. Конфиг Gunicorn .

Теперь промежуточное ПО @ CraigKerstiens будет работать правильно, включая любые вызовы request.is_secure() в вашем приложении.

Примечание: Django также имеет тот же вызов настройки конфигурации SECURE_PROXY_SSL_HEADER, но в версии dev.

6 голосов
/ 08 декабря 2011

Какие рамки вы используете для своего приложения? Если вы используете Django, вы можете просто использовать промежуточное программное обеспечение, подобное:

import re

from django.conf import settings
from django.core import urlresolvers
from django.http import HttpResponse, HttpResponseRedirect


class SSLMiddleware(object):

    def process_request(self, request):
        if not any([settings.DEBUG, request.is_secure()]):
            url = request.build_absolute_uri(request.get_full_path())
            secure_url = url.replace("http://", "https://")
            return HttpResponseRedirect(secure_url)
4 голосов
/ 03 марта 2014

Если вы используете Flask, это работает довольно хорошо:

1) Do "pip install flask-sslify"

(github здесь: https://github.com/kennethreitz/flask-sslify)

2) Включить следующие строки:

from flask_sslify import SSLify
if 'DYNO' in os.environ: # only trigger SSLify if the app is running on Heroku
    sslify = SSLify(app)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...