2010-09-12 85 views

回答

5

解析self.request.url正确的方法是不使用正则表达式,但与Python标准库的urlparse模块:

import urlparse 

... 

o = urlparse.urlparse(self.request.url) 

对象o将是ParseResult类与字符串值字段实例如o.scheme(可能为http ;-)和o.netloc(您的情况为'example.appspot.com')。您可以将某些字符串再次与同一模块的urlparse.urlunparse函数重新组合在一起,例如,

s = urlparse.urlunparse((o.scheme, o.netloc, '', '', '', '')) 

这将使你在s在这种情况下,字符串'http://example.appspot.com'

+3

或者你可以只使用,例如,self.request.host_url,self.request.host等,已经有这些部分分开给你! – 2010-09-13 10:01:33

2

如果你只是想找到你的应用程序ID,你可以从environment得到它,而无需解析当前的URL。环境变量是APPLICATION_ID

也可以用它来找到最新的版本(CURRENT_VERSION_ID),AUTH域(这将让你知道你在appspot.com运行,AUTH_DOMAIN)以及是否正在运行的本地开发服务器或生产中(SERVER_SOFTWARE)。

因此,要获得完整的基础URL,尝试这样的:

import os 

def get_base_url(): 
    if os.environ[AUTH_DOMAIN] == "gmail.com": 
     app_id = os.environ[APPLICATION_ID] 
     return "http://" + app_id + ".appspot.com" 
    else: 
     return "http://" + os.environ[AUTH_DOMAIN] 

编辑:AUTH_DOMAIN包含自定义域,无需包括应用程序ID。

这将返回即使你没有访问当前的版本或当前版本的基础URL,如果你访问使用URL当前版本一样http://current-version.latest.app_id.appspot.com(不像URL的解析方法)

+0

这假设应用程序正在appspot上访问,并且如果您的基本URL位于Google Apps域上,则会失败。 – geoffspear 2010-09-13 03:48:56

+0

@Wooble这就是'AUTH_DOMAIN'位 - 如果它没有托管在appspot.com上,则'AUTH_DOMAIN'是它托管的自定义域。 – 2010-09-13 04:35:07

+1

应用可以使用Google身份验证,但仍可以使用其他域名提供服务; AUTH_DOMAIN envvar仍然会被设置为“gmail.com” – geoffspear 2010-09-14 00:28:13