Django url not cannot find some UTF-8 usernames

я экспериментирую с UTF-8 для имен пользователей в приложении django.

Django - версия 3.2.11

Используемый Python - 3.9.4

Некоторые пользователи могут иметь профиль, видимый другим, и имя пользователя в url:

re_path("^u/(?P<username>\w+)/$", views.author_profile_view, name="author_profile_view"),

Нормальный пример работает нормально:

  • Браузер показывает -> /u/brainyChowder3/
  • Django показывает -> GET /u/brainyChowder3/ HTTP/1.1" 200 10593

UTF-8 пример 1 работает также нормально:

  • Браузер показывает -> /u/ɊȁⱲÒđΈⱦİĬd/
  • Django показывает -> GET /u/%C9%8A%C8%81%E2%B1%B2%C3%92%C4%91%CE%88%E2%B1%A6%C4%B0%C4%ACd/ HTTP/1.1" 200 12508

Но этот UTF-8 не работает:

  • Браузер показывает -> /u/ɂáⱳ1⁄4%7Cĭğę
  • Django показывает -> "GET /u/%C9%82%C3%A1%E2%B1%B31%E2%81%844%7C%C4%AD%C4%9F%C4%99 HTTP/1.1" 404 5585

Браузер действительно показывает это странно, так как он не "переводит" %7C в |, но это должно быть просто оптически?

Ошибка показана просто

Page not found (404)
Request Method: GET
Request URL:    http://127.0.0.1:8000/u/%C9%82%C3%A1%E2%B1%B31%E2%81%844%7C%C4%AD%C4%9F%C4%99
The current path, u/ɂáⱳ1⁄4|ĭğę, didn’t match any of these.

В оболочке Django я могу запросить этого пользователя:

>>> User.objects.get(username='ɂáⱳ1⁄4|ĭğę')
<User: ɂáⱳ1⁄4|ĭğę>

Декодирование URI выглядит нормально.

Надеюсь, кто-нибудь сможет объяснить, почему это происходит с одной строкой UTF-8, но не с другой. Или, может быть, даже знает, как это исправить? :-D

Я знаю, что разрешить все UTF-8 для имен пользователей может быть не самым разумным решением, но это скорее эксперимент для меня.

Спасибо

Причина, по которой это происходит, не связана с UTF-8, а с тем, что имя пользователя содержит символ, не являющийся словом (символ, не сопоставленный с \w): символ, который не разрешен для конвертера путей <str:…>. Вы можете работать с <path:…>:

path('u/<path:username>/', some_view, name='some_name')
Вернуться на верх