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).

Вернуться на верх