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

在Django 2中使用URLPathVersioning处理版本控制遇问题

解决REST API路径版本配置的常见问题

看起来你在配置URL路径版本控制的时候遇到了几个小问题,我来帮你梳理并修复它们:

1. 修复urls.py里的语法与逻辑问题

你的代码里存在两处明显问题:一是最后一行url()多了一个闭合括号,二是API_PREFIX本身已经包含^,拼接后会导致正则表达式重复匹配开头符号。修复后的代码如下:

from django.contrib import admin
from django.conf.urls import url
# 假设这是你定义的JSON转换函数
def get_json(view_func):
    def wrapper(request, *args, **kwargs):
        from django.http import JsonResponse
        return JsonResponse({"message": view_func()})
    return wrapper

def ping():
    return "pong"

# 去掉多余的^,后续在url正则里统一添加
API_PREFIX = r'(?P<version>(v1))'
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^' + API_PREFIX + r'/ping/$', get_json(ping)),
]

2. 补全settings.py里的REST框架配置

你的REST_FRAMEWORK配置不完整,缺少逗号分隔符,也没配置版本控制的关键参数。完整的URL路径版本控制配置应该包含这些项:

REST_FRAMEWORK = {
    'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.URLPathVersioning',
    'DEFAULT_VERSION': 'v1',  # 设置默认使用的版本
    'ALLOWED_VERSIONS': ['v1'],  # 允许访问的版本列表
    'VERSION_PARAM': 'version'  # 要与urls里的命名组(?P<version>...)保持一致
}

3. 额外优化建议

  • 如果你使用Django 2.0及以上版本,推荐用re_path()(url()的别名)或path(),写法更规范:
from django.urls import re_path

urlpatterns = [
    re_path(r'^admin/', admin.site.urls),
    re_path(r'^(?P<version>v1)/ping/$', get_json(ping)),
]
  • 若后续需要支持多版本(比如v1、v2),可以修改正则为r'(?P<version>(v1|v2))',同时更新ALLOWED_VERSIONS列表
  • 注意Django视图函数默认需要接收request参数,可把ping函数调整为:
def ping(request):
    return "pong"

配置完成后,访问http://你的域名/v1/ping/就能正确触发版本控制逻辑,返回预期的JSON响应了。

内容的提问来源于stack exchange,提问作者John Difool

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:33:02