【问题标题】:GAE self.request.environ and server hostGAE self.request.environ 和服务器主机
【发布时间】:2010-08-20 19:36:24
【问题描述】:

我正在尝试获取运行我的 appengine 应用程序的服务器的基本 URL(主机名)。

类似的东西

wsgiref.util.application_uri(self.request.environ)

但是它返回了我不想要的 PATH_INFO。也许我遗漏了一些东西,但即使这篇文章也指出应该省略路径信息。 http://docs.python.org/library/wsgiref.html

http://9.latest.my-app.appspot.com

基本上与我要检索的内容一致。相反,它正在返回

http://9.latest.my-app.appspot.com/my/requested/path

【问题讨论】:

    标签: python google-app-engine wsgi


    【解决方案1】:

    请求对象是Webob 请求对象。因此,您可以从self.request.host 获取主机名,从self.request.host_url 获取带有协议的主机名,等等。

    【讨论】:

      【解决方案2】:

      您可以在os.environ['HTTP_HOST'] 中找到主机名。

      这不包括协议,但它应该很容易从你得到的值中解析出来:

      base = '/'.join(url.split('/')[:3])
      

      或者...

      import urlparse
      url = urlparse.urlparse(url)
      base = "%s://%s" % (url.scheme, url.hostname)
      

      【讨论】:

      • 谢谢。我希望有一个内置于 wsgiref 的解决方案,而不是解析请求的 URL。不过这样就够了
      • 这对于 wsgi 以外的情况非常有用。例如使用 python-requestsBeautifulSoup 并遵循相对 URL。不过,我会建议您使用 url.netloc 而不是 url.hostname。当 http 和 https 分别不同于默认值 80 和 443 时,Netloc 会包含端口号。
      • 如果你略读docs for urlparse,你会发现“返回值实际上是元组子类的一个实例”。这使您可以对 6 个关键属性进行索引访问。 (这些包括 netloc,但不包括主机名,作为我上面声明的进一步证据。)如果您 from urlparse import urlparse,这允许您使用此单线器 base = '://'.join(urlparse(url)[0:2]) 获得您的基地。如果您使用的是python-requests,请像这样获取网址:response.request.url
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      • 2014-10-08
      • 1970-01-01
      • 2017-01-29
      • 1970-01-01
      • 1970-01-01
      • 2020-04-14
      相关资源
      最近更新 更多