使用 Flask 代理到另一个 Web 服务

2024-04-12

我想将对 Flask 应用程序发出的请求代理到计算机上本地运行的另一个 Web 服务。我宁愿使用 Flask 而不是更高级别的 nginx 实例,这样我们就可以重用应用程序中内置的现有身份验证系统。我们越能保持这种“单点登录”越好。

是否有现有的模块或其他代码可以执行此操作?尝试将 Flask 应用程序桥接到 httplib 或 urllib 之类的东西被证明是一件痛苦的事情。


我花了很多时间研究同一件事,最终找到了一个解决方案requests看起来运行良好的库。它甚至可以在一个响应中设置多个 cookie,这需要一些调查才能弄清楚。这是烧瓶视图函数:

from dotenv import load_dotenv  # pip package python-dotenv
import os
#
from flask import request, Response
import requests  # pip package requests


load_dotenv()
API_HOST = os.environ.get('API_HOST'); assert API_HOST, 'Envvar API_HOST is required'

@api.route('/', defaults={'path': ''}, methods=["GET", "POST"])  # ref. https://medium.com/@zwork101/making-a-flask-proxy-server-online-in-10-lines-of-code-44b8721bca6
@api.route('/<path>', methods=["GET", "POST"])  # NOTE: better to specify which methods to be accepted. Otherwise, only GET will be accepted. Ref: https://flask.palletsprojects.com/en/3.0.x/quickstart/#http-methods
def redirect_to_API_HOST(path):  #NOTE var :path will be unused as all path we need will be read from :request ie from flask import request
    res = requests.request(  # ref. https://stackoverflow.com/a/36601467/248616
        method          = request.method,
        url             = request.url.replace(request.host_url, f'{API_HOST}/'),
        headers         = {k:v for k,v in request.headers if k.lower() != 'host'}, # exclude 'host' header
        data            = request.get_data(),
        cookies         = request.cookies,
        allow_redirects = False,
    )

    #region exlcude some keys in :res response
    excluded_headers = ['content-encoding', 'content-length', 'transfer-encoding', 'connection']  #NOTE we here exclude all "hop-by-hop headers" defined by RFC 2616 section 13.5.1 ref. https://www.rfc-editor.org/rfc/rfc2616#section-13.5.1
    headers          = [
        (k,v) for k,v in res.raw.headers.items()
        if k.lower() not in excluded_headers
    ]
    #endregion exlcude some keys in :res response

    response = Response(res.content, res.status_code, headers)
    return response

2021 年 4 月更新:excluded_headers可能应该包括由定义的所有“逐跳标头”RFC 2616 第 13.5.1 节 https://www.rfc-editor.org/rfc/rfc2616#section-13.5.1.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Flask 代理到另一个 Web 服务 的相关文章

  • 是否可以将名为“None”的值添加到枚举类型?

    我可以将名为 None 的值添加到枚举中吗 例如 from enum import Enum class Color Enum None 0 represent no color at all red 1 green 2 blue 3 co
  • 使用 Flask 时在 Python 中实现持久数据库连接的最佳实践

    我的问题是关于在生产环境或其他关注性能的环境中使用 Flask 时处理数据库连接的推荐方法 在 Flask 中 g 对象可用于存储内容 并且可以将打开的数据库连接放置在那里 以允许应用程序在同一请求期间的后续数据库查询中重用它们 但是 g
  • 从 SQL Server 中调用 Python 文件

    我的文件名中有 Python 脚本 C Python HL py 在此 Python 脚本中 有预测模型以及对 SQL 数据库中某些表的更新 我想将此文件称为 SQL 作业 我怎样才能做到这一点 这个问题不一样 如何在 SQL Server
  • Django url 模式 - 带正斜杠的参数

    如何为两个参数创建 url 模式 其中第一个参数包含正斜杠作为其内容的一部分 da ta1 data2 最初我有以下模式 r view P
  • 使用python同时播放两个正弦音

    我正在使用 python 来播放正弦音 音调基于计算机的内部时间 以分钟为单位 但我想根据秒同时播放一个音调 以获得和谐或双重的声音 这就是我到目前为止所拥有的 有人能指出我正确的方向吗 from struct import pack fr
  • 将带有非字符串关键字的 dict 传递给 kwargs 中的函数

    我使用具有签名功能的库f args kwargs 我需要在 kwargs 参数中传递 python dict 但 dict 不包含关键字中的字符串 f 1 2 3 4 Traceback most recent call last File
  • 将图像转换为二进制流

    我的应用程序有两个方面 一方面我使用 C 来使用 Pleora 的 EBUS SDK 从相机读取帧 当第一次接收到该流时 在将缓冲区转换为图像之前 我能够一次读取 16 位流 以便对每个像素执行一些计算 即每个像素都存在一个 16 位数据块
  • 导入错误:无法导入名称 urandom

    我正在构建一个新的 Linux 环境 并在 Python 上看到以下错误 python c import random Traceback most recent call last File
  • Flask-httpauth: get_password 装饰器如何为 basic-auth 工作?

    我想知道有没有人用过这个烧瓶延伸 https github com miguelgrinberg flask httpauth简化 http basic auth 基本上我不明白这个example https github com migu
  • 从文件中读取单词并放入列表中

    本质上 我有一个巨大的文件 所有文件包含每行多个单词 每个单词用空格分隔 有点像这样 WORD WORD WORD WORD ANOTHER WORD SCRABBLE BLAH YES NO 我想要做的是将文件中的所有单词放入一个巨大的列
  • Python 中 Goto 标签的替代方案?

    我知道我不能使用 Goto 我也知道 Goto 不是答案 我读过类似的问题 但我只是想不出解决我的问题的方法 所以 我正在编写一个程序 你必须在其中猜测一个数字 这是我遇到问题的部分的摘录 x random randint 0 100 I
  • 遍历 globals() 字典

    我 尝试 使用globals 在我的程序中迭代所有全局变量 我就是这样做的 for k v in globals iteritems function k v 当然 这样做时 我只是创建了另外 2 个全局变量 k and v 所以我得到这个
  • 为 Keras 编写自定义数据生成器

    我将每个数据点存储在 npy 文件中 其中shape 1024 7 8 我想通过类似的方式将它们加载到 Keras 模型中ImageDataGenerator 所以我编写并尝试了不同的自定义生成器 但它们都不起作用 这是我改编的一个this
  • Python 对象属性 - 访问方法

    假设我有一个具有某些属性的类 在 Pythonic OOP 中 如何访问这些属性是最好的 就像obj attr 或者也许编写 get 访问器 此类事物可接受的命名风格是什么 Edit 您能否详细说明使用单下划线或双前导下划线命名属性的最佳实
  • 在 Python 中将 int 转换为 ASCII 并返回

    我正在为我的网站制作一个 URL 缩短器 我当前的计划 我愿意接受建议 是使用节点 ID 来生成缩短的 URL 因此 理论上 节点 26 可能是short com z 节点 1 可能是short com a 节点 52 可能是short c
  • 包装 C++ Qt 小部件以便在 Python 中与 PySide 一起使用

    在 Python 中使用自定义 Qt 显示小部件包装自定义 C 库以便在基于 PySide 的 QApplication 中使用的最佳方法是什么 C 库是否需要特殊处理才能使用 SWIG 进行包装 封装的 Qt 小部件能否与 PySide
  • 在 python 中计时时,我应该如何考虑 subprocess.Popen() 开销?

    编码社区的成员比我更聪明 我有一个 python 问题要问你们 我正在尝试优化一个 python 脚本 该脚本 除其他外 返回子进程执行和终止的挂钟时间 我想我已经接近这样的事情了 startTime time time process s
  • Tensorflow:提要字典错误:您必须为占位符张量提供值

    我有一个错误 我无法找出原因 这是代码 with tf Graph as default global step tf Variable 0 trainable False images tf placeholder tf float32
  • 矩阵求逆 (3,3) python - 硬编码与 numpy.linalg.inv

    对于大量矩阵 我需要计算定义为的距离度量 尽管我确实知道强烈建议不要使用矩阵求逆 但我没有找到解决方法 因此 我尝试通过对矩阵求逆进行硬编码来提高性能 因为所有矩阵的大小均为 3 3 我预计这至少会是一个微小的改进 但事实并非如此 为什么
  • 应用程序的外观 - Py2exe / wxPython

    所以我的问题是我的应用程序的外观和感觉 因为它看起来像一个旧的外观应用程序 它是一个 wxPython 应用程序 在 python 上它运行良好并且看起来不错 但是当我使用 py2exe 将其转换为 exe 时 外观很糟糕 现在我知道如果你

随机推荐

  • 将每个进程的 Node.js 内存使用量限制在 300MB 以下

    我们在单独的进程中运行测试 并且一些测试套件包含 20 多个文件 我们如何将 Node js 进程使用的内存量限制 而不是增加 到 300MB 以下 如果我们不限制内存 我们最多可以使用 20x500MB 大约 10GB 这太多了 我可以在
  • 如何用rvest过滤掉节点?

    我正在使用 R rvest 库来读取包含表格的 html 页面 不幸的是 这些表的列数不一致 这是我读过的表格的示例 table tr class alt td 1 td td 2 td td class hidden 3 td tr tr
  • 在 Linux 上使用 PowerShell 保存 CSV 数据的方法?

    在 Linux 中 Powershell 本身是否有 本机 或内置的方便的 数据库 设施 虽然这适用于输入 data nicholas mordor csv nicholas mordor csv ll BCCDC COVID19 Dash
  • 在 R 中 split() 之后保持数据的原始顺序[重复]

    这个问题在这里已经有答案了 在下面的 R 代码中 我split a data frame通过一列 一个名为的字符串变量study name But split 按字母顺序重新订购原来的data frame In BASE R 分割后数据可以
  • iTextSharp 如何读取PDF文件中的表格

    我正在努力将 PDF 转换为文本 我可以正确地从 PDF 中获取文本 但表结构很复杂 我知道 PDF 不支持表格结构 但我认为有一种方法可以正确获取单元格 嗯 例如 我想转换成这样的文本 gt This is first example g
  • Azure ML PipelineData 与 DataTransferStep 会生成 0 字节文件

    我正在使用 azureml Python SDK 构建 Azure ML 管道 该管道调用PythonScriptStep 该PythonScriptStep将数据存储在AML工作区的workspaceblobstore上 我想扩展管道以将
  • 将 ruby​​ 数组值传递到 C 数组

    我正在尝试为 C 中的 ruby 制作一个独立的 FFT 扩展 基于这个食谱 http www rubyinside com how to create a ruby extension in c in under 5 minutes 10
  • 如何以编程方式设置 ga_trackingId 属性?

    我有一个应用程序 但根据用户的选择 它将在谷歌分析中完全独立地进行监控 所以我需要以编程方式为 EasyTracker 设置 ga trackingId 我试过了EasyTracker getTracker setAppId id 没有运气
  • mysqlimport - 在 MS Windows XAMPP 环境中导入 CSV 文件

    我正在尝试从命令行将 CSV 文件导入 mysql 数据库 这稍后将合并到 Windows 批处理文件中 mysqlimport u user puserpw columns ID CID Alerted fields terminated
  • 我需要在 Swift 中 memset 一个 C 结构体吗?

    AFAIK 在 swift 中 调用类 结构的默认初始化程序会将所有内容初始化为0 nil 在 C 中 例如套接字编程 有时会使用 memset 在使用结构之前将所有内容设置为 0 我是否也需要在 swift 中使用 memset 还是我写
  • 为什么使用erts_debug:size/1时atom的内存为零?

    I use erts debug size 1计算erlang VM中atom的内存 但我发现输出为零 谁能解释一下原因 7 gt erts debug size true 0 原因是原子与原子的数据一起保存在原子表中 因此整个节点中只有一
  • 如何从Python中的给定文本创建一组类及其变量和方法

    我想从给定的文本配置创建一组类 其变量和方法 特别是使用 django 模型 例如 我有一个要在 models py 中创建的模型列表 classes users posts commnets vars a b bb vv aa metho
  • Spring MVC 静态资源位于单独的 jar 中

    最近 我的同事问我是否可以将静态资源 css 图像 js 放在单独的 jar 文件中 并从 spring mvc 应用程序访问这些静态资源 我在谷歌上搜索 但没有发现任何有趣的东西 所以我的问题是 可能吗 如果是的话 您能解释一下该由谁来做
  • 复杂的 php mysqli 查询插入数据(如果不存在):获取重复列名“?”

    所以 伙计们 请查看我的示例代码 并帮助我 我找不到解决方案 在我传递 等参数的行上不断出现重复的列名称 我在查询中一起传递了 7 个变量 知道可能是什么问题吗 SQL INSERT INTO wifi ssid password name
  • 键入时更新文本框

    在 Access 中 我有一个包含三个文本框的表单 我正在尝试更新一个名为的文本框tbx组合名称两者的组合 textbox tbx姓氏 人的姓氏 textbox tbx名字 人的名字 我的问题是 我使用什么文本框属性 以便在输入文本时tbx
  • 检查开关参数的正确方法是什么

    检查开关值的正确方法是什么 function testSwitch Param switch swth Write Host Value of swth is swth if swth IsPresent Write host Switch
  • 从证书 x509 中提取公钥

    我正在寻找一种从 JavaScript 中的证书 x509 PEM 格式 中提取公钥的方法 如下所示 openssl x509 in cert cer pubkey noout gt pub txt 您需要能够解析 ASN 1 结构的东西
  • decltype中的成员函数调用

    以下代码 struct A int f int auto g int x gt decltype f x 无法编译并出现错误 error cannot call member function int B f int without obj
  • 如何在手机SD卡或其他位置搜索文件

    我想搜索用户移动设备上具有特定扩展名的文件 我尝试搜索但找不到任何直接的 API 是否有特定的 API 或者是否有实现相同目的的繁琐方法 或者是否有一种机制可以调用 linux 调用 find 或类似的东西 Thanks boolean i
  • 使用 Flask 代理到另一个 Web 服务

    我想将对 Flask 应用程序发出的请求代理到计算机上本地运行的另一个 Web 服务 我宁愿使用 Flask 而不是更高级别的 nginx 实例 这样我们就可以重用应用程序中内置的现有身份验证系统 我们越能保持这种 单点登录 越好 是否有现