Django url 不是找不到一些 UTF-8 用户名
Django url not cannot find some UTF-8 usernames
我正在为 Django 应用程序中的用户名试验 UTF-8。
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 中 shell 我可以查询这个用户:
>>> User.objects.get(username='ɂáⱳ1⁄4|ĭğę')
<User: ɂáⱳ1⁄4|ĭğę>
我觉得 URI 解码没问题。
我希望有人能解释为什么一个 UTF-8 字符串会发生这种情况,而另一个不会。或者甚至可能知道如何修复它? :-D
我知道允许所有 UTF-8 用于用户名可能不是明智之举,但这对我来说更像是一个实验。
谢谢
发生这种情况的原因与UTF-8无关,而是用户名包含非单词字符(\w
不匹配的字符):不允许使用的字符对于 <str:…>
路径转换器。您可以使用 <path:…>
:
path('u/<strong><path:</strong>username<strong>></strong>/', some_view, name='some_name')
我正在为 Django 应用程序中的用户名试验 UTF-8。
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 中 shell 我可以查询这个用户:
>>> User.objects.get(username='ɂáⱳ1⁄4|ĭğę')
<User: ɂáⱳ1⁄4|ĭğę>
我觉得 URI 解码没问题。
我希望有人能解释为什么一个 UTF-8 字符串会发生这种情况,而另一个不会。或者甚至可能知道如何修复它? :-D
我知道允许所有 UTF-8 用于用户名可能不是明智之举,但这对我来说更像是一个实验。
谢谢
发生这种情况的原因与UTF-8无关,而是用户名包含非单词字符(\w
不匹配的字符):不允许使用的字符对于 <str:…>
路径转换器。您可以使用 <path:…>
:
path('u/<strong><path:</strong>username<strong>></strong>/', some_view, name='some_name')