微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带有 url_for _external=True 的电子邮件,从 docker 容器发送,在返回链接中发送 localhost需要主机子域

如何解决带有 url_for _external=True 的电子邮件,从 docker 容器发送,在返回链接中发送 localhost需要主机子域

我在带有 Nginx 反向代理的 docker 容器中有一个 Flask web 应用程序。每个容器都是一个子域,所以 123.someurl.com 和 abc.someurl.com。用户注册使用该应用程序,当他们提交姓名和电子邮件时,我会向他们发送一封电子邮件,其中包含使用令牌设置密码的链接。一切正常,除了发送的链接是 localhost:5000/reset_password/token。

我需要将链接设为 123.someurl.com/reset_password/token 或 abc.someurl.com/reset_password/token,具体取决于它们所属的容器。

这是我的函数,它提取返回地址的 url。

def send_welcome_email(user):
    token = user.get_reset_token(expires_sec=86400)
    msg = Message('Welcome to someurl.com',recipients=[user.email])
    msg.body = f'''You have been registered with someurl.com,you must reset your password before you can login. To do so visit the following link:

    {url_for('users.reset_token',token=token,_external=True)}

    mail.send(msg)

首先,我将 msg.body 移到模板中,看看这是否有帮助。然后我尝试添加 SERVER_NAME 和 .test_request_context,这解决了 _external url_for 但它也搞砸了非外部 url_for。我更新的功能

def send_welcome_email(user):
    token = user.get_reset_token(expires_sec=86400)
    msg = Message(
        'Welcome to someurl.com',recipients=[user.email]
    )
    current_app.config['SERVER_NAME'] = 'development.someurl.com'
    with current_app.test_request_context():
        url = url_for(
            'users.reset_token',_external=True,token=token
        )
    msg.html = render_template(
        'users/register_email.html',url=url,username=user.username
    )
    mail.send(msg)

该网站在启动时工作正常,但一旦我注册用户,该网站就找不到任何网址。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。