2016-06-28 4 views
1

В устаревшем приложении мне нужно проверить, существует ли URL-адрес, а если нет, перенаправить его в другое место. Проблема в том, что мне нужно проверить, присутствует ли этот url в наборе значений, в файле urls, и я не понимаю, как это лучше всего сделать.Динамически проверять наличие пула

Например, оба проекта и города используют один и тот же шаблон URL. например /projects/london и /projects/my-project-name.

Я хочу, прежде всего, проверить, соответствует ли слизь городу, а затем не возвращает проект (города не могут соответствовать названиям проектов).

Мои URLs в настоящее время структурированы следующим образом:

url(r'^projects/(?P<project-name>[-\w]+)', get_project, name='project-view'), 
url(r'^projects/.*', get_city, name='city-view'), 

Я знаю, что это очень грязный, и плохая общая картина, но, к сожалению, это не то, что можно изменить в данный момент. Поэтому моя цель - выяснить, могу ли я сначала проверить, может ли project-name быть городом, и если это так, перенаправить на это представление, не попадая в цикл переадресации.

Интересно, если я мог бы сделать что-то вроде этого:

url(r'^projects/(?P<city>london|paris|new-york)/', get_city, name='city-view'), 

где london|paris|new-york генерируются динамически

ответ

2

Вы можете динамически генерировать URL со всеми названиями городов, но URL будет кэшировать один раз django обращается к нему в первый раз, поэтому, чтобы изменить регулярное выражение url, вам придется перезапустить процесс django. Если это хорошо для ваших целей, вы можете создать URL-адрес, как это:

url(r'^projects/(?P<city>{})/$'.format(city_slugs.join('|')), 
    get_city, name='city-view') 

Но, вероятно, было бы лучше, чтобы создать метод вида маршрутизации, который реализует логику для отправки запросов к их соответствующему виду:

# urls.py 
# ... 
url(r'^projects/(?P<slug>[-\w]+)/$', 
    project_city_router, name='project-city-router'), 
# ... 

# views.py 
def is_a_city(slug): 
    # If they're in the database, something like: 
    # return City.objects.filter(slug=slug).exists() 
    return slug in ['london', 'paris', 'new-york', '...'] 

def project_city_router(request, slug=None): 
    if not slug: 
     # /projects/ 
     return render(request, 'my/template.html', {'foo': 'bar'}) 
    elif is_a_city(slug): 
     # /projects/<city>/ 
     return get_city(request, city=slug) 
    else: 
     # /projects/<project-name/ 
     return get_project(request, project_name=slug) 

С помощью этого маршрутизатора, если аргумент slug является проектом или городом, он возвращает результат отображения get_project или get_city.

Это также позволяет динамически проверять список городов для базы данных или файла.

+0

спасибо - очень полезно. Я немного задержался в сорняках и пропустил, что я должен был передать всю логику на просмотр/роутер – djq

Смежные вопросы