调用OpenAI接口时遇TypeError: View.__init__参数不匹配问题求助
错误原因分析
- 类视图与函数视图装饰器冲突:
@api_view(['POST'])是专门用于装饰函数视图的,不能直接作用于View子类的类视图,这会导致视图初始化时参数传递异常,触发TypeError。 - URL配置错误:类视图在URL中注册时,必须调用
.as_view()方法将类转换为可调用的视图函数,直接传入类本身会导致实例化时参数不匹配。 get_help函数参数错误:代码中prompt="user_input"是把字符串"user_input"作为提示词传递给OpenAI,而非变量user_input的实际值,会导致模型无法处理用户真实输入。
解决方法
方法一:改为函数视图(适配@api_view,推荐)
将类视图改为函数视图,配合@api_view使用,更符合DRF的使用习惯:
from rest_framework.decorators import api_view from rest_framework.response import Response import openai def get_help(user_input): response = openai.Completion.create( engine="text-davinci-002", prompt=user_input, # 移除引号,使用变量实际值 temperature=0.5, max_tokens=1024, top_p=1, frequency_penalty=0, presence_penalty=0 ) return response["choices"][0]["text"] @api_view(['POST']) def receive_response(request): user_input = request.data.get("user_input") if not user_input: return Response({"error": "缺少user_input参数"}, status=400) response_text = get_help(user_input) return Response({"response": response_text})
修改urls.py:
urlpatterns = [ path("get", get_help, name="get_help"), path("post", receive_response, name="post"), ]
方法二:保留类视图,修正配置
如果坚持使用类视图,需移除@api_view装饰器,并在URL中调用.as_view():
from django.views import View from django.http import HttpResponse import openai def get_help(user_input): response = openai.Completion.create( engine="text-davinci-002", prompt=user_input, # 修复prompt参数 temperature=0.5, max_tokens=1024, top_p=1, frequency_penalty=0, presence_penalty=0 ) return response["choices"][0]["text"] class receive_response(View): def post(self, request): user_input = request.POST.get("user_input") if not user_input: return HttpResponse("缺少user_input参数", status=400) response_text = get_help(user_input) return HttpResponse(response_text)
修改urls.py:
urlpatterns = [ path("get", get_help, name="get_help"), path("post", receive_response.as_view(), name="post"), # 添加.as_view() ]
关键额外修复
无论采用哪种方法,都必须将get_help函数中的prompt="user_input"改为prompt=user_input,否则OpenAI无法接收用户的实际输入内容。
内容的提问来源于stack exchange,提问作者Emm
相关产品推荐
相关产品推荐

