Django路由中如何限制路径slug仅匹配预设列表内的取值
Django 路由限制slug匹配范围的实现方法
有三种常用的实现方式,你可以根据自己的需求选择:
方法1:使用re_path正则匹配(适合固定小范围slug,修改成本最低)
直接把允许的slug值拼成正则表达式,只有匹配到列表内的值才会命中该路由,不符合的会自动向后匹配其他路由:
from django.urls import re_path # 正则内直接填入允许的slug,用|分隔 re_path(r'^(?P<slug>page1|page2|page3)/$', ToSlugPage.as_view()),
方法2:自定义路径转换器(适合slug列表需频繁修改、或多路由复用规则的场景)
你可以单独封装slug的校验规则,后续修改允许的slug只需改动转换器即可:
- 首先在你的app目录下新建
converters.py,写入如下内容:
class AllowedSlugConverter: # 直接用你的预设slugs列表拼接正则 regex = '|'.join(['page1', 'page2', 'page3']) def to_python(self, value): return value def to_url(self, value): return value
- 在路由文件中注册转换器并使用:
from django.urls import path, register_converter from .converters import AllowedSlugConverter from .views import ToSlugPage # 注册自定义转换器 register_converter(AllowedSlugConverter, 'allowed_slug') urlpatterns = [ # 替换原有的slug转换器为自定义转换器 path('<allowed_slug:slug>/', ToSlugPage.as_view()), # 其他路由... ]
方法3:视图内直接校验(适合不符合要求直接返回404,不需要继续匹配其他路由的场景)
不需要修改原有路由配置,直接在视图中加校验逻辑即可:
from django.http import Http404 from django.views.generic import View class ToSlugPage(View): allowed_slugs = ['page1', 'page2', 'page3'] def get(self, request, slug, *args, **kwargs): if slug not in self.allowed_slugs: raise Http404 # 原有业务逻辑...
选型参考
- 需要未匹配到的slug继续向后匹配其他路由:选择方法1或方法2
- 需要未匹配到的slug直接返回404:三种方法均可,方法3改造成本最低
内容的提问来源于stack exchange,提问作者nadermx
相关产品推荐
相关产品推荐

