Django中如何配置urls.py并修改get方法处理/words/{id}请求
问题说明
已定义Word模型,需要修改views.py文件中WordView类的get方法,使其能够处理GET /words/{id}格式的请求,接口期望返回的响应示例如下:
{ "id": 1, "name": "to ask out", "translation": "Пригласить на свидание", "transcription": "tuː ɑːsk aʊt", "example": "John has asked Mary out several times." }
当前编写的get方法代码如下:
from django.views import View from django.http import JsonResponse from models import Word class WordView(View): def get(self, request, id): # 此处是否不需要传入`id`参数 item = Word.objects.get(id=id) items_data = [{ 'id': item.id, 'word': item.word, 'transcription': item.transcription, 'translation': item.translation, 'example': item.example, }] return JsonResponse(items_data[0])
待解决两个问题:
- 如何修改
urls.py文件,以匹配/words/{id}格式的请求路径?当前urls.py路由配置如下:
urlpatterns = [ path('admin/', admin.site.urls), path('words/{id}', WordView.as_view()), ]
- 如何修改上述
get方法,使其能够正确返回符合要求的响应数据?
解答
1. urls.py路由修改
Django的path路由不支持{id}这种占位符写法,需要使用Django内置的路径转换器语法,同时get方法中的id参数必须保留,路由匹配到的路径参数会自动作为关键字参数传入视图方法。
修改后的完整路由配置:
from django.contrib import admin from django.urls import path # 导入对应视图 from .views import WordView urlpatterns = [ path('admin/', admin.site.urls), # 使用<int:id>匹配整数类型的id参数,末尾加斜杠符合Django默认路由约定 path('words/<int:id>/', WordView.as_view()), ]
如果不需要强制末尾斜杠,可以去掉路径末尾的/,但推荐保留以适配Django默认的APPEND_SLASH配置。
2. get方法修改
现有代码存在三个问题:一是返回字段名和接口要求不匹配,接口要求返回name字段,现有代码返回的是word字段;二是多余的列表包裹逻辑没有必要;三是没有处理单词不存在的异常场景,会触发500错误。
修改后的完整代码:
from django.views import View from django.http import JsonResponse from .models import Word # 同应用下模型推荐使用相对导入,避免导包错误 class WordView(View): def get(self, request, id): # 查询对应id的单词,不存在则返回404 try: item = Word.objects.get(id=id) except Word.DoesNotExist: return JsonResponse({"error": "resource not found"}, status=404) # 构造和接口要求对齐的返回数据 resp_data = { 'id': item.id, 'name': item.word, 'transcription': item.transcription, 'translation': item.translation, 'example': item.example, } return JsonResponse(resp_data)
修改点说明:
- 保留
get方法的id形参,用于接收路由传入的路径参数 - 修正返回字段映射,将模型的
word字段对应到接口要求的name键 - 移除多余的列表包裹逻辑,直接传入字典给
JsonResponse即可 - 增加资源不存在的异常捕获,返回404状态码
- 修正模型导入路径,避免跨路径导包错误
内容的提问来源于stack exchange,提问作者Sergey
相关产品推荐
相关产品推荐

