在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
相关产品推荐
相关产品推荐

