Django re_path подбирает отрицательный lookahead как группу захвата и аргумент для представления
Я использую urlpattern так
urlpatterns += [
re_path(r'^(?!(?:api/|backend/))', include('an_app.urls')),
]
Это сделано для того, чтобы не маршрутизировать пути, начинающиеся с api/ или backend/. У меня есть конкретное требование, которому нужен этот шаблон, и я не могу полагаться только на упорядочивание путей для достижения этой цели (этот путь захватывает URL на / и отправляет их в представление, которое рендерит SPA).
К сожалению, преобразователь URL Django воспринимает отрицательный lookahead (^(?!...) как группу захвата и вставляет переменную пути в представление. Если я запускаю python manage.py show_urls (из django-extensions):
/<var>app/ an_app.views.SomeView an_app:home
"Группа" за ^app/ в regex не является группой захвата, и парантеза здесь для обозначения отрицательной группы захвата (т.е. путь не начинается с backend/ или api/). Но похоже, что Django воспринимает это как группу захвата и вставляет переменную в URL. Не знаете ли вы, как настроить это, чтобы не перехватывалось?
Я подтвердил, что при использовании обычного python regex (re.match) отрицательный lookahead не воспринимается как группа.
Настоящая проблема заключалась в том, что я пытался обратить URL к пути в an_app. Функция реверса не могла понять, как построить URL из сложного регекса, как указано выше, поэтому она выдавала бесполезное сообщение об ошибке:
Reverse for 'home' with no arguments not found. 1 pattern(s) tried: ['(?!api/|backend/)\\Z']
Я решил эту проблему, перенаправляя на URL, а не на имя шаблона (и полагаясь на то, что Django восстановит URL).