Python 烧瓶url#u表示不';t在docker/docker compose下编写正确的url

Python 烧瓶url#u表示不';t在docker/docker compose下编写正确的url,python,docker,flask,docker-compose,docker-swarm,Python,Docker,Flask,Docker Compose,Docker Swarm,我有一个烧瓶应用程序运行在Docker容器中,运行在swarm下。当我使用的url\u为API创建外部url时,它返回docker服务名称,而不是绝对路径 前 endpoint=url\u for('api\u v1.获取我的数据',sn=123, _外部=真,_scheme=“https”) 返回类似于https://app-primary:8000/api/v1/devices/123 其他详情: 在Nginx反向代理后使用Gunicorn运行 我试过玩服务器名,但没有骰子。有没有简单

我有一个烧瓶应用程序运行在Docker容器中,运行在swarm下。当我使用的
url\u为API创建外部url时,它返回docker服务名称,而不是绝对路径

endpoint=url\u for('api\u v1.获取我的数据',sn=123,
_外部=真,_scheme=“https”)
返回类似于
https://app-primary:8000/api/v1/devices/123

其他详情:

  • 在Nginx反向代理后使用Gunicorn运行

我试过玩
服务器名
,但没有骰子。有没有简单的方法来解决这个问题?或者我应该为
url\u编写一个包装函数吗?

由于python应用程序在一个容器中,也在Nginx后面,那么您可能需要使用它,它将做两件事:

  • 通过读取
    REMOTE\u ADDR
  • 通过读取
    HTTP\u主机设置主机名
接下来,您需要确保nginx发送以下标头:

proxy_set_header Host            $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

我也有类似的问题。我正在为uwsgi提供flask应用程序,在另一个容器中与nginx交谈。我的密码重置func正在发送容器名而不是域名的链接。 尝试使用test\u request\u contest和'SERVER\u NAME'配置变量,但失败惨重。该链接仍在本地主机上。 最终对我起作用的是一种快速(非常)肮脏的方法:

def create_external_link(link):
    # splits after 'http(s)'
    linkParts = link.split("//")
    linkLeft = linkParts[0]
    linkRight = linkParts[1]
    # from the right part (after 'http://') take whats after 'containerName/' doing only one split
    linkRight = linkRight.split("/",1)[1]
    fullLink = linkLeft + '//example.com/' + linkRight
    return fullLink
然后,在创建链接并将其进一步传递给(例如)邮件模板之前:

link = create_external_link(url_for('blueprint.endpoint', **kwargs, _external=True))

请尽快使用更好的解决方案,这是一个难看的黑客行为。

您尝试使用
服务器名称时效果如何?它是否等于实际的域名?是在flask配置中吗?在flask配置中,作为“localhost:5000”运行locallyI时,只要您在nginx之后,我就看不出url中包含docker服务名称有什么问题,除非您的意思是nginx是远程的,而不是在同一网络中的容器中。是的,它非常适合内部路由,但是,将其作为url返回给客户作为API的响应并不是非常有用。基本上,对于分页结果,我返回下一个和上一个url,但他们不会对这个结果感到太高兴,他们需要将
app primary
转换为实际域。我可以编写一个包装器函数,但我想知道这是否是人们经常遇到的问题……我明白了,所以如果您将其设置为像这样的
current\u app.config['SERVER\u NAME']='example.com'
,并保持
external true
,它不会工作,对吗?注意,它应该在创建上下文之前