X-Forwarded-Proto 和 Flask

2023-12-19

我有完全相同的问题描述这个问题和答案 https://stackoverflow.com/questions/19840051/mutating-request-base-url-in-flask。这个问题的答案是一个很好的解决方法,但我不明白根本问题。在负载均衡器处终止 SSL 并在负载均衡器和 Web/应用服务器之间使用 HTTP 非常常见。堆栈的哪一部分不尊重 X-Forwarded-Proto?是 Werkzeug 吗?烧瓶? uwsgi?

就我而言,我使用的是 AWS ELB(设置 X-Forwarded-Proto)=> Nginx(沿着 X-Forwarded-Proto 转发到 uwsgi)。但在 python 应用程序中,我必须按照我上面引用的问题中的描述对 Flask Request 进行子类化。

既然这是如此常见的部署场景,似乎应该有更好的解决方案。我缺少什么?


你错过了ProxyFix()中间件组件 https://werkzeug.palletsprojects.com/middleware/proxy_fix/#module-werkzeug.middleware.proxy_fix。查看烧瓶代理设置文档 https://flask.palletsprojects.com/deploying/proxy_fix/.

不需要子类化任何东西;只需将此中间件组件添加到您的 WSGI 堆栈中即可:

# Werkzeug 0.15 and newer
from werkzeug.middleware.proxy_fix import ProxyFix
from flask import Flask


app = Flask(__name__)
app.wsgi_app = ProxyFix(app.wsgi_app, x_proto=1)

如果您安装了 Flask,那么您也有 Werkzeug,但请将版本固定为 >=0.15 以获得更新版本ProxyFix(Flask 1.1.0 及更高版本已经使用该版本)。

该组件从 X-Forwarded-Proto 标头设置 WSGI 方案 https://github.com/pallets/werkzeug/blob/129b3fa0041b874951ce89cbc0a7a6d6e8944414/src/werkzeug/middleware/proxy_fix.py#L165-L228。请阅读我上面链接到的 Flask 文档,了解如何信任标头以及根据您的具体情况自定义中间件。上面,我将其配置为仅查看X-Forwarded-Proto,但该组件可以处理其他X-Forwarded-*配置也一样。

默认是信任一个级别X-Forwarded-For, add x_for=0如果您想禁用此功能,请添加到关键字参数。

另请注意,ProxyFix中间件在 Werkzeug 0.15 中得到了相当大的扩展;此外X-Forwarded-Proto, -For, and -Host, the X-Forwarded-Port and -Prefix还参考标头,所有标头都支持多个值。

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

X-Forwarded-Proto 和 Flask 的相关文章

随机推荐

  • Google Apps 脚本 - 迭代文件夹和子文件夹

    我想使用 google apps 脚本迭代 Google Drive 中文件夹的树结构 下面的代码列出了一些文件夹 但不是全部 您能建议什么是深入文件夹结构的最佳技术吗 我首先尝试记录所有文件夹名称 谢谢 function test lis
  • 在Windows中使用dos批处理程序的原因是什么?

    Question 在现代 Windows 系统上使用 dos 批处理语言编写一些重要任务而不是下载 PowerShell 或 ActiveState Perl 的一个好的 理想情况下 技术上的 理由是什么 更具体地说 我在这个问题期间做出以
  • 如何使用selenium同时打开多个实例Firefox而不清除缓存和cookie

    我有一个从 Facebook UID 中抓取好友列表的代码 它有效 但需要很长时间才能抓取整个列表 因此 我想通过使用多处理和 Selenium Grid 来加快速度 以下是我使用的方法 使用帐户登录 Facebook 打开 5 个具有相同
  • WPF DataGrid如何根据绑定数据将ColumnType设置为不同类型?

    我有 首选项 数据结构 其中有字符串 值 字段和 类型 字段的枚举 类型可以是 0 布尔值 1 整数 2 字符串 根据此类型字段中的值 我想以不同方式显示 值 单元格 例如复选框 文本框 下拉列表等 因此 为了清楚起见 同一列应根据该行中的
  • 如何使用js向td添加按钮?

    我有一个动态生成的表 因为它正在生成 TD 我想将第一个 TD 设置为按钮 下面是我的代码 显然不起作用 我记得我遇到的另一个问题是我们可以使用 html 更改 div 的内容 但这在这里也不起作用 Code var table docum
  • Django modeltranslation - 无法获取和查看原始字段

    我正在尝试使用django modeltranslation在我的项目中 目前 只是为了Tag具有一个字段的模型 name 我已经创建并注册了TranslationOptions then makemigrations and migrat
  • 如何使用 gradle 使用平台密钥签署 Android 应用程序?

    我看到了几个类似的问题 例如 Android 构建平台源代码后 如何使用平台密钥签署任意APK https stackoverflow com questions 4247818 android after building platfor
  • Redis作为数据库

    我想使用Redis作为数据库 而不是缓存 根据我 有限 的理解 Redis 是一个内存数据存储 使用 Redis 有哪些风险 如何减轻这些风险 您可以通过多种不同方式将 Redis 用作权威存储 Turn on AOF 仅追加文件存储 请参
  • 使用 Amazon SES 的 Codeigniter SMTP 电子邮件

    我想昨天亚马逊宣布了对 SES 简单电子邮件服务 的 SMTP 支持 我尝试使用 Codeigniter 发送 SMTP 电子邮件 但没有成功 我有一个经过验证的发件人 一切看起来都很好 this gt load gt library em
  • 查找从开始日期到年底的每个星期五

    所以我又带着另一个令人困惑的日期时间问题回来了 在 C 中 我如何返回从开始日期 DateTime Now 到今年年底 例如 今天是 19 号星期五 它将返回 26 2 9 16 23 30 7 等 这有效吗 static IEnumera
  • 如何用 Dotrine 保存图像

    我想在我的文章实体中保留图像 Doctrine2 可以做到这一点吗 我该怎么做呢 此致 博多 使用带有 File 类型的 ODM 设置非常简单 对于 ORM 实体 我会考虑创建一个像这样的列 注意 使用此链接将 blob 类型添加到 Doc
  • 使用 multipart/form-data 和 JSON 进行 Curl 发布

    有没有办法使用curl来做multipart form data发布并指定数据是application json 它不一定是卷曲的 这就是我使用的 效果很好 curl v H Content Type multipart form data
  • 使用纱线工作区在 npm 上创建可用的库...

    我正在寻找有关我编码的模式的反馈一边修修补补 Context 我正在为我的公司创建一个包 该包将公开发布 DX 开发人员体验 对我们来说是最重要的 为此我选择了开发中的最新趋势 Typescript esm 等 我想提出多个模块并使导入易于
  • 无向图中,最简单的环必须有3个节点?

    我正在尝试写一个关于循环和无向图的证明 但我对某些事情感到困惑 如果我的图只有 2 个顶点和一条连接它们的边 那不是循环 不是吗 因此 我需要至少 3 个顶点 其中 2 个顶点与其中一个节点之间有 2 个连接 另外两个顶点之间有一个连接 以
  • Java程序使用javascript读取html页面并保存其内容

    我想使用javascript提取html内容 从网站中提取用户的评论 在chrome中另存为 Inspect Element 我试试这个 Java 程序读取 html 页面并将其 HTML 代码保存在文本文件中 https stackove
  • 这是 C# 中将分隔字符串转换为 int 数组的最佳方法吗?

    给出以下字符串 string str 1 2 3 这是否是将其转换为最佳扩展int array static class StringExtensions public static int ToIntArray this string s
  • 使用python查找CSV文件每列的最小值

    我创建了一个程序 可以查找 CSV 文件每一行的最小值 现在我想对每一列执行相同的操作 但我无法这样做 任何建议将不胜感激 谢谢 Import and convert csv import csv data with open file r
  • Java HashMap 中的冲突解决

    Java HashMap uses put插入K V对的方法HashMap 可以说我用过put方法和现在HashMap
  • 在cloudfoundry上发布项目时出现错误java.io.FileNotFoundException(log4j日志文件)

    我计划将 Web 应用程序与 mysql 服务一起迁移到 Cloud Foundry 但我遇到了以下错误 它与当地环境配合良好 日志文件也会生成 下面是错误日志 Jan 5 2013 7 35 59 AM org cloudfoundry
  • X-Forwarded-Proto 和 Flask

    我有完全相同的问题描述这个问题和答案 https stackoverflow com questions 19840051 mutating request base url in flask 这个问题的答案是一个很好的解决方法 但我不明白