调用API时出现'WSGIRequest'无'get'属性错误的原因及解决
错误原因
你在CourseInfo视图里犯了基础用法错误:调用了Django请求对象request的get()方法,但Django的WSGIRequest类根本没有这个方法。你本意是发起GET请求调用自己的API,但混淆了Django请求对象与HTTP请求库的用法——request.get()并不是发起HTTP请求的正确方式。
解决方案
方案1:用requests库发起HTTP请求调用API
首先确保安装requests库:
pip install requests
修改views.py代码:
import requests from django.shortcuts import render from .models import Course from .serializers import CourseSerializer class CourseViewSet(ModelViewSet): queryset = Course.objects.all() serializer_class = CourseSerializer def CourseInfo(request): # 用requests库发起GET请求调用内部API api_response = requests.get('http://127.0.0.1:8000/api/courses/') callApi = api_response.json() context = { "queryset": callApi } return render(request, 'insert.html', context)
方案2:直接查询数据库(同项目内优先推荐)
因为是同一个Django项目,没必要通过HTTP请求绕圈,直接查询数据库并序列化效率更高:
from django.shortcuts import render from .models import Course from .serializers import CourseSerializer class CourseViewSet(ModelViewSet): queryset = Course.objects.all() serializer_class = CourseSerializer def CourseInfo(request): # 直接查询数据库并序列化数据 callApi = CourseSerializer(Course.objects.all(), many=True).data context = { "queryset": callApi } return render(request, 'insert.html', context)
额外补充:处理POST表单提交
从错误信息可知当前请求是POST方法,应该是提交课程表单。如果需要处理表单数据,补充POST逻辑:
from django.shortcuts import render from .models import Course from .serializers import CourseSerializer class CourseViewSet(ModelViewSet): queryset = Course.objects.all() serializer_class = CourseSerializer def CourseInfo(request): if request.method == 'POST': # 获取表单提交的课程名称 course_name = request.POST.get('coursename') # 将数据保存到数据库(若模型有其他字段,需对应调整) Course.objects.create(name=course_name) # 获取所有课程数据传递给模板 callApi = CourseSerializer(Course.objects.all(), many=True).data context = { "queryset": callApi } return render(request, 'insert.html', context)
内容的提问来源于stack exchange,提问作者Mossaddak
相关产品推荐
相关产品推荐

