带有 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 (将#修改为@)