2011-12-04 67 views
4

在我正在開發的應用程序中,我使用美國國家名稱作爲url結構的一部分。州名是從一個python詞典中提取的,該詞典將州名縮寫與它們各自的專有名稱鏈接起來,例如,處理Flask URL創建空間

state_dict = {"Alabama" : "AL", "Alaska" : "AK",... 

這很好,當州名沒有空格。例如http://example.com/Alabama/但是,當有問題的國家有一個空間,它形成了一個糟糕的網址。例如http://example.com/North%20Dakota/

我目前通過謹慎使用狀態名稱來使用類似state=state.replace(' ', '_')作爲url_for()中的參數來創建網址。但是,這很麻煩,看起來很粗糙。

如何更好地使用狀態名稱作爲URL的一部分,而無需每次都手動修改它們?如果解決方案也可用於將大寫字母更改爲小寫字母,則需要額外的點數。

我曾考慮過修改狀態字典, north_dakota而不是North Dakota但是,該字典也用於創建要顯示給用戶的文本和可讀性計數。

非常感謝您的時間!

回答

4

的蟒蛇最常見的模式是使用一對字典的正向/反向查找從和友好的貴字典去。在附註中,通常用於表示字符串值的「網址友好」表示的術語是「slug」。

# state_slugs lets you lookup either state name or code => its slug 
state_slugs = {} 
# states_from_slugs lets you lookup the slug => the state name 
states_from_slugs = {} 

for state_name, state_code in state_dict.items(): 
    slug = state_name.lower().replace(' ', '_') 
    state_slugs[state_name] = slug 
    state_slugs[state_code] = slug 
    states_from_slugs[slug] = state_name 

你會把這個地方它只運行一次,如可能在模塊級,或您state_dict已創建後不久。

然後訪問state_slugs['NC']state_slugs['North Carolina']都將返回「north_carolina」,訪問states_from_slugs['north_carolina']將返回「North Carolina」進行反向查找。

2

您是否考慮過生成第二個字典來表示您的URL友好的狀態名稱?而只是讓你不必擔心增加的第51個州(每當這種情況發生),以兩個字典,在運行時可以很容易地做到這一點:

state_dictionary = {'South Carolina': 'SC', 'North Carolina': 'NC'} 
url_friendly = {k.lower().replace(' ', '_'): v 
       for k, v in state_dictionary.iteritems()} 

,或者預2.7蟒蛇:

url_friendly = dict((k.lower().replace(' ', '_'), v) 
       for k, v in state_dictionary.iteritems()) 

產生這樣的:

{'south_carolina': 'SC', 'north_carolina': 'NC'}