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