Работа с пробелами в создании URL-адреса Flask - PullRequest
4 голосов
/ 04 декабря 2011

В приложении для работы с флягами, над которым я работаю, я использую имена штатов США как часть структуры url. Имена состояний извлекаются из словаря Python, который связывает сокращения состояний с соответствующими именами, например,

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

Это нормально, когда в имени штата нет пробелов. например http://example.com/Alabama/ Однако, когда у рассматриваемого государства есть пробел, оно образует плохой URL. например http://example.com/North%20Dakota/

В настоящее время я обхожу это, проявляя осторожность, когда создаю URL, используя имена состояний, чтобы использовать что-то вроде state=state.replace(' ', '_') в качестве аргумента в url_for(). Тем не менее, это громоздко и кажется грубым.

Как лучше использовать имена состояний в качестве части URL-адреса без необходимости каждый раз изменять их вручную? Дополнительные баллы, если решение также можно использовать для изменения букв верхнего регистра в строчные.

Я рассмотрел изменение состояния dict, чтобы сделать его дружественным, например, north_dakota вместо North Dakota тем не менее, dict также используется при создании текста для отображения пользователям и учитывает читаемость.

Большое спасибо за ваше время!

Ответы [ 2 ]

5 голосов
/ 04 декабря 2011

Самым распространенным шаблоном для 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'] вернет "North Carolina" для обратного поиска.

2 голосов
/ 04 декабря 2011

Рассматривали ли вы создание второго словаря для представления имен состояний, удобных для 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'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...