GAE部署Flask应用时Blueprint子域名功能失效求助
检查GAE自定义域名绑定
确认admin.example.com已添加到GAE控制台的「自定义域名」列表,且完成DNS解析(CNAME指向ghs.googlehosted.com),并关联到默认服务。GAE不会自动将主域名的绑定覆盖所有子域名,必须单独添加每个需要使用的子域名。配置Flask的SERVER_NAME
生产环境必须显式设置Flask的SERVER_NAME为主域名,否则Flask无法正确识别子域名规则。本地测试可能依赖hosts文件正常工作,但生产环境没有这个配置的话,Blueprint的子域名逻辑会失效。示例代码:app = Flask(__name__) app.config['SERVER_NAME'] = 'example.com'验证Blueprint的子域名注册
确保注册Blueprint时明确指定subdomain参数,且路由规则正确:admin_bp = Blueprint('admin', __name__, subdomain='admin') @admin_bp.route('/') def admin_index(): return 'Admin Dashboard' app.register_blueprint(admin_bp)确认dispatch.yaml配置与部署
即使路由到默认服务,也要确保dispatch.yaml包含子域名规则,且单独部署该文件:dispatch: - url: "admin.example.com/*" service: default - url: "example.com/*" service: default执行部署命令:
gcloud app deploy dispatch.yaml,仅部署应用代码不会生效dispatch规则。检查请求Host头是否正确传递
Flask依赖请求的Host头识别子域名,可添加测试路由验证生产环境的Host值:from flask import request @app.route('/check-host') def check_host(): return request.host访问
admin.example.com/check-host,若返回example.com而非admin.example.com,说明Host头被修改,需排查GAE域名配置或第三方代理设置。清除GAE缓存并重新部署
GAE可能缓存旧路由规则,尝试停止现有实例后重新部署:gcloud app versions stop [你的版本ID] gcloud app deploy gcloud app deploy dispatch.yaml也可部署新版本并设为默认,规避旧版本缓存影响。
内容的提问来源于stack exchange,提问作者jcrv

