【问题标题】:Bypass Flask's SERVER_NAME for a single route为单个路由绕过 Flask 的 SERVER_NAME
【发布时间】:2016-05-27 01:06:47
【问题描述】:

我正在开发一个 Flask 应用程序,该应用程序在不同的子域下有许多路由。它使用SERVER_NAME设置,在不同的蓝图上设置子域,根据子域进行初始路由。

我正在尝试配置一个绕过要求主机匹配SERVER_NAME 现在的路由,但无法弄清楚。是否可以在保持SERVER_NAME 设置的同时做到这一点?

即即使SERVER_NAME="mydomain.com" 并且请求是针对http://localhost:80/my/special/route/ 的,我也希望可以访问特定路线

【问题讨论】:

  • 为什么要这样做?将127.0.0.1 mydomain.com 放入/etc/hosts 怎么样?
  • @AlexHall 我有一个本地运行的守护进程,它不知道主机名,需要向 Flask 应用程序发出请求。 /etc/hosts 在这种情况下不起作用,因为守护进程会专门向 127.0.0.1:80 发出请求。
  • @AlexHall 在这一点上我有一个解决我面临的具体问题的方法,但我想知道这个问题的解决方案,以防它再次出现。

标签: python flask


【解决方案1】:

任何路由都只是Werkzeug's Rule 的扩展/实现。因此,只需为文档设置 subdomain=None,请参阅:FLASK Route

在您的代码库之外和在 nginx 等基础设施中进行所有主机名匹配是一件非常好的事情。让您可以灵活地使用不同的环境进行开发和测试等,然后您可以将主机名作为标题转发,您可以以自定义方式提取该标题。 Digital Ocean 做了一个很好的介绍,还有一个很好的问题说明了如何做到这一点:nginx subdomain and domain rewrite w proxy pass

此策略的一大优势是您无需将应用程序绑定到端口 80(以 root 身份),这会带来巨大的安全优势,并且无需担心 SERVER_NAME 的实现,这还有很多事情要做想要的。见:Why flask can suck.

【讨论】:

  • 我认为设置 subdomain=None 不足以避免 SERVER_NAME 必须与基域匹配的要求。但我会再次确认。
  • 您有一个很好的观点,NGINX 是一种更好的方式来处理子域的主机匹配和路由等。这可能是我最终将在这里使用的解决方法。
  • 我假设 default_subdomain 继承自您正在加载的蓝图。在 Werkzueg 文档中,它说:“此规则的子域规则字符串。如果未指定,则规则仅匹配地图的 default_subdomain。如果地图未绑定到子域,则禁用此功能。”所以我希望它应该足够了,但是是的,我确实更喜欢 nginx/apache 来做这类事情。
猜你喜欢
  • 1970-01-01
  • 2017-10-01
  • 2014-04-14
  • 1970-01-01
  • 1970-01-01
  • 2014-06-08
  • 2014-08-25
  • 2012-03-05
  • 1970-01-01
相关资源
最近更新 更多