Django使用阿拉伯语Slug访问URL出现404错误排查
Django阿拉伯语Slug访问404问题排查与解决
问题根源
你使用的URL正则表达式[\w_-]+存在限制:Python正则里的\w仅匹配ASCII范围内的字母、数字和下划线,阿拉伯语字符不在这个范围内,导致URL中的阿拉伯语slug无法被正确捕获。视图接收到的slug参数不完整或为空,自然查不到对应数据库记录,返回404错误。
修复方案
有两种简单有效的解决方式:
1. 改用Django的path语法(推荐)
Django的path内置支持Unicode字符,无需复杂正则。修改course应用的urls.py:
from django.urls import path from django.contrib.sitemaps import GenericSitemap from .models import Course from django.contrib.sitemaps.views import sitemap from .views import * app_name = 'course' info_dict = { 'queryset': Course.objects.all(), } urlpatterns = [ # 替换re_path为path,使用内置的Unicode兼容slug转换器 path('detail/<slug:slug>/', detail_course, name='detail_courses'), path('sitemap.xml', sitemap, {'sitemaps': {'blog': GenericSitemap(info_dict, priority=0.6)}}, name='django.contrib.sitemaps.views.sitemap'), ]
<slug:slug>是Django内置的转换器,默认支持Unicode字符,能完美匹配阿拉伯语slug。
2. 修改正则表达式支持Unicode
如果坚持用re_path,可以调整正则规则来覆盖阿拉伯语字符:
# 方式一:指定阿拉伯语Unicode范围(精准匹配) re_path(r'detail/(?P<slug>[\w\u0600-\u06FF_-]+)/$', detail_course, name='detail_courses'), # 方式二:通用匹配(适合多语言场景,匹配除空格和斜杠外的所有字符) re_path(r'detail/(?P<slug>[^\s/]+)/$', detail_course, name='detail_courses'),
额外验证点
确认你的Course模型中,slug字段开启了Unicode支持:
class Course(models.Model): # 其他字段... slug = models.SlugField(max_length=255, allow_unicode=True)
只有设置allow_unicode=True,SlugField才能正确存储阿拉伯语等非ASCII字符。
内容的提问来源于stack exchange,提问作者Alireza javanpour
相关产品推荐
相关产品推荐

