Переход на другой веб-сервис с Flask - PullRequest
34 голосов
/ 12 июля 2011

Я хочу передать запросы прокси, сделанные в мое приложение Flask, на другой веб-сервис, работающий локально на компьютере. Я бы лучше использовал Flask для этого, чем наш высокоуровневый экземпляр nginx, чтобы мы могли повторно использовать нашу существующую систему аутентификации, встроенную в наше приложение. Чем больше мы можем сохранить этот «единый знак», тем лучше.

Существует ли существующий модуль или другой код для этого? Попытка связать приложение Flask с чем-то вроде httplib или urllib - это боль.

Ответы [ 3 ]

49 голосов
/ 13 апреля 2016

Я потратил много времени, работая над тем же, и в итоге нашел решение, использующее библиотеку запросы , которая, кажется, работает хорошо.Он даже обрабатывает установку нескольких файлов cookie в одном ответе, что потребовало небольшого расследования, чтобы выяснить это.Вот функция просмотра колбы:

from flask import request, Response
import requests

def _proxy(*args, **kwargs):
    resp = requests.request(
        method=request.method,
        url=request.url.replace(request.host_url, 'new-domain.com'),
        headers={key: value for (key, value) in request.headers if key != 'Host'},
        data=request.get_data(),
        cookies=request.cookies,
        allow_redirects=False)

    excluded_headers = ['content-encoding', 'content-length', 'transfer-encoding', 'connection']
    headers = [(name, value) for (name, value) in resp.raw.headers.items()
               if name.lower() not in excluded_headers]

    response = Response(resp.content, resp.status_code, headers)
    return response
8 голосов
/ 12 июля 2011

У меня есть реализация прокси с использованием httplib в приложении на основе Werkzeug (как и в вашем случае, мне нужно было использовать аутентификацию и авторизацию веб-приложения).

Хотя в документации Flask не указано, какдля доступа к заголовкам HTTP вы можете использовать request.headers (см. документация Werkzeug ).Если вам не нужно изменять ответ, а заголовки, используемые прокси-приложением, предсказуемы, проксирование не вызывает затруднений.

Обратите внимание, что если вам не нужно изменять ответ, вам следует использовать werkzeug.wsgi.wrap_file, чтобы обернуть поток ответов httplib.Это позволяет передавать открытый дескриптор файла на уровне ОС на HTTP-сервер для оптимальной производительности.

7 голосов
/ 20 сентября 2011

Мой первоначальный план состоял в том, чтобы общедоступный URL-адрес был что-то вроде http://www.example.com/admin/myapp с проксированием http://myapp.internal.example.com/.Вниз по этому пути ведет безумие.

Большинство веб-приложений, в особенности самодостаточных, предполагают, что они будут работать в корне HTTP-сервера и что-то вроде ссылок на другие файлы по абсолютному пути.Чтобы обойти это, вы должны переписать URL-адреса повсеместно: заголовки местоположений и файлы HTML, JavaScript и CSS.

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

В конце я настроил новый виртуальный хост в nginx и использовал его собственный прокси.Так как оба были в корне хоста, переписывание URL было в основном ненужным.(И что было нужно, прокси-модуль nginx был обработан.) Веб-приложение, на которое идет прокси, выполняет свою собственную аутентификацию, которая на данный момент достаточно хороша.

...