所以我的 Flask 应用程序中有 2 条路线
<host_name>/oauth/leg1
<host_name>/oauth/leg2
当/oauth/leg1
路由验证它的输入时,它调用 render_form() 来渲染一个表单,并form-action
重新路由到/oauth/leg2
路由。
表单 html 看起来像这样
<form action="{{ url_for('oauth.leg2') }}" method="POST">
blah blah blah
</form>
表单动作中的url_for
调用正确地呈现了oauth/leg2
这一切都很好。单击我的表单上的提交会将表单数据发送到oauth/leg2
路由,一切都会按需要进行。
现在,我也使用 KarkenD API 网关。网关的 URL 为api.dev.tech/connect/v1
. 所以主机名是api.dev.tech
,但另外,我希望我的 Flask API 只能通过connect/v1
我的网关路径访问。
所以我的 KrakenD 网关设置是这样的,
api.dev.tech/connect/v1/oauth/leg1
被转发到<flask_app>/oauth/leg1
api.dev.tech/connect/v1/oauth/leg2
被转发到<flask_app>/oauth/leg2
我的问题
当我访问api.dev.tech/connect/v1/oauth/leg1
时,它会正确验证我的请求并呈现表单。单击我的表单上的提交后,action
评估结果为oauth/leg2
,并且此路径附加到主机 ( api.dev.tech
) 因此表单输入数据被发送到api.dev.tech/oauth/leg2
-> 这不是有效的网关路径,因此失败。
表单输入数据应该发送到api.dev.tech/
/oauth/leg2`
我不知道如何有条件地将这个connect/v1
路径插入到表单操作 URL 中(connect/v1 应该只在请求通过 KrakenD 发送时插入,而不是在请求正常直接发送到 Flask 主机时插入)
我试过的
添加了呈现完整路径的_external
选项url_for
- 这反而开始呈现我的 Kubernetes 服务名称(我的烧瓶应用程序和 krakend 网关在 kubernetes 上运行)
可能的解决方案
- 始终
connect/v1
在我的表单操作中添加,然后我的 API 只能通过网关间接访问,但不能直接使用。 - 有一个忽略 connect/v1 的 KrakenD 设置,因此
api.dev.tech/oauth/leg2
被转发到<flask_app>/oauth/leg2
. 我不喜欢这样,因为现在我的 KrakenD 配置中必须有一个异常值规则,该规则缺少connect/v1
路径。 - 修改我的 Flask 路由,使其中也包含
connect/v1
前缀——现在 Flask API 可以直接访问,也可以通过 KrakenD 间接使用。