You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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只需改动转换器即可:

  1. 首先在你的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
  1. 在路由文件中注册转换器并使用:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 22:30:03