Python 烧瓶url#u表示不';t在docker/docker compose下编写正确的url
我有一个烧瓶应用程序运行在Docker容器中,运行在swarm下。当我使用的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运行 我试过玩服务器名,但没有骰子。有没有简单
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
,它不会工作,对吗?注意,它应该在创建上下文之前