处理Flask网址创建中的空格

时间:2011-12-04 00:23:20

标签: python flask

在我正在处理的烧瓶应用中,我使用美国州名作为网址结构的一部分。状态名称是从python字典中提取的,该字典将状态缩写与其各自的专有名称相链接,例如,

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

当状态名称没有空格时,这很好。例如http://example.com/Alabama/但是,当有问题的州有空格时,它会形成一个糟糕的网址。例如http://example.com/North%20Dakota/

我目前通过小心使用状态名称创建URL来使用state=state.replace(' ', '_')作为url_for()中的参数来解决这个问题。然而,它很麻烦,看起来很粗糙。

如何更好地使用状态名称作为网址的一部分而不必每次都手动修改它们?如果解决方案也可用于将大写字母更改为小写,则可以使用额外的点数。

我考虑过将状态字典修改为url友好的,例如north_dakota而不是North Dakota但是,在创建要向用户显示的文本时,也会使用dict,并且可读性也很重要。

非常感谢您的时间!

2 个答案:

答案 0 :(得分:5)

python最常见的模式是使用一对字典进行正向/反向查找,以便进入友好字典。另一方面,通常用于字符串值的这种“url友好”表示的术语是“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']将返回“北卡罗来纳州”进行反向查找。

答案 1 :(得分:2)

您是否考虑过生成第二个字典来表示您的网址友好状态名称?这样你就不必担心将第51个状态(无论何时发生)添加到两个字典中,你可以在运行时轻松完成:

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

或者,对于2.7之前的python:

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

产生这样的东西:

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