【发布时间】:2011-09-16 10:32:31
【问题描述】:
如何让 App Engine 生成当前运行的服务器的 URL?
如果应用程序在开发服务器上运行,它应该返回
http://localhost:8080/
如果应用程序在 Google 的服务器上运行,它应该返回
http://application-name.appspot.com
【问题讨论】:
标签: python google-app-engine url web-applications
如何让 App Engine 生成当前运行的服务器的 URL?
如果应用程序在开发服务器上运行,它应该返回
http://localhost:8080/
如果应用程序在 Google 的服务器上运行,它应该返回
http://application-name.appspot.com
【问题讨论】:
标签: python google-app-engine url web-applications
您可以通过 self.request.url 从您的 webapp 处理程序中获取用于发出当前请求的 URL,或者您可以使用 self.request.environ dict 将其拼凑在一起(您可以在 WebOb docs 上阅读 - 请求继承自 webob)
您不能“获取服务器的 url”本身,因为可以使用许多 url 来指向同一个实例。
如果您的目标真的只是发现您是处于开发阶段还是生产阶段,请使用:
'Development' in os.environ['SERVER_SOFTWARE']
【讨论】:
self.request.host 是获取当前主机名的更好方法,如果您需要协议前缀,则为 self.request.host_url。
这是另一个答案。
from google.appengine.api import app_identity
server_url = app_identity.get_default_version_hostname()
在开发应用服务器上会显示:
本地主机:8080
在应用引擎上
your_app_id.appspot.com
【讨论】:
如果您使用 webapp2 作为框架,那么您可能已经在 Web 应用程序中使用了 URI 路由。
http://webapp2.readthedocs.io/en/latest/guide/routing.html
app = webapp2.WSGIApplication([
webapp2.Route('/', handler=HomeHandler, name='home'),
])
在使用webapp2.uri_for() 构建URI 时,只需传递_full=True 属性即可根据当前运行环境生成包含当前域、端口和协议的绝对URI。
uri = uri_for('home')
# /
uri = uri_for('home', _full=True)
# http://localhost:8080/
# http://application-name.appspot.com/
# https://application-name.appspot.com/
# http://your-custom-domain.com/
这个函数可以在你的 Python 代码中使用,也可以直接从模板引擎中使用(如果你注册的话)——非常方便。
查看 API 参考中的webapp2.Router.build(),了解用于构建 URI 的参数的完整说明。
【讨论】: