2010-09-12 86 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