Джанго как обратный прокси - PullRequest
3 голосов
/ 08 марта 2011

Мое клиент-серверное приложение в основном основано на http-сервере специального назначения, который взаимодействует с клиентом по принципу Ajax, т.е.GUI клиента обновляется после асинхронных циклов HTTP-запросов / ответов.

Расширяемость http-сервера специального назначения ограничена, и по мере роста приложения требуются все новые и новые стандартные функции, которые, например, предоставляет Django.

Следовательно, я хотел бы добавить приложение Django в качестве фасадного / обратного прокси-сервера, чтобы скрыть нестандартный сервер специального назначения и получить возможность использовать Django.Я хотел бы использовать приложение Django в качестве шлюза и не использовать http-перенаправление по соображениям безопасности и для сокрытия сложности.

Однако меня беспокоит то, что туннелирование трафика через Django на сервере может снизить производительность.Это действительная проблема?

Будет ли альтернативное решение проблемы?

Ответы [ 2 ]

3 голосов
/ 07 апреля 2011

Я пошел дальше и построил простой прототип.Это было относительно просто, мне просто нужно было настроить представление, которое отображает все URL, которые я хочу перенаправить.Функция представления выглядит примерно так:

def redirect(request):
    url = "http://%s%s" % (server, request.path)
    # add get parameters
    if request.GET:
        url += '?' + urlencode(request.GET)

    # add headers of the incoming request
    # see https://docs.djangoproject.com/en/1.7/ref/request-response/#django.http.HttpRequest.META for details about the request.META dict
    def convert(s):
        s = s.replace('HTTP_','',1)
        s = s.replace('_','-')
        return s

    request_headers = dict((convert(k),v) for k,v in request.META.iteritems() if k.startswith('HTTP_'))
    # add content-type and and content-length
    request_headers['CONTENT-TYPE'] = request.META.get('CONTENT_TYPE', '')
    request_headers['CONTENT-LENGTH'] = request.META.get('CONTENT_LENGTH', '')

    # get original request payload
    if request.method == "GET":
        data = None
    else:
        data = request.raw_post_data

    downstream_request = urllib2.Request(url, data, headers=request_headers)
    page = urllib2.urlopen(downstream_request)
    response = django.http.HttpResponse(page)
    return response

Так что на самом деле все довольно просто и производительность достаточно хорошая, особенно если перенаправление идет на интерфейс обратной связи на том же хосте.

2 голосов
/ 05 июня 2013

Обычно в производстве вы размещаете Django за веб-контейнером, таким как Apache httpd или nginx. У них есть модули, предназначенные для прокси-запросов (например, proxy_pass для location в nginx). Они дают вам некоторые дополнительные возможности, такие как кэширование, если вам это нужно. По сравнению с прокси через конвейер запросов приложения Django, это может сэкономить время разработки и повысить производительность. Однако вы жертвуете возможностью полностью манипулировать запросом или ответом прокси, когда используете такое решение.

Для локального тестирования с ./manage.py runserver я добавляю шаблон URL через urls.py в разделе if settings.DEBUG: .... Вот код функции представления, который я использую, который поддерживает GET, PUT и POST с использованием запросов библиотеки Python: https://gist.github.com/JustinTArthur/5710254

...