在Django框架中工作时,将长时间运行的进程发送到Python后台的最佳方法是什么?
摘要:我使用Django Web应用程序和chatGPT为我的用户创建特定的资源。问题是等待openAI的响应会带来糟糕的用户体验。因此,我想把这项工作放下。理想情况下,我想发送另一个http请求到我的服务器,并在后台运行它,然后在完成时提醒用户。
下面是同步代码
@login_required
def createx(request):
if request.method == "GET":
return render(request, 'x/x_create.html', {})
else:
request_body = json.loads(request.body)
#get user profile
my_user = request.user
#make sure the user is premium
if not my_user.is_premium_user():
#redirect to home page
#set error message
messages.error(request, 'You must be a premium user to create a x')
return redirect('home')
#get user profile
my_user_profile = UserProfile.objects.get(user=my_user)
user_prompt = createPrompt(my_user_profile, request_body.get('position'), request_body.get('company'), request_body.get('description'))
system_prompt = "You are a helpful assistant."
#create x using chatgpt
url = "https://api.openai.com/v1/chat/completions"
headers = {
"Authorization": f"Bearer {settings.OPEN_AI_API_KEY}",
"Content-Type": "application/json"
}
# Craft the request payload
payload = {
"model": "gpt-3.5-turbo",
"messages": [
{"role": "system", "content": system_prompt},
{"role": "user", "content": user_prompt}
],
"temperature": 0.7,
}
# Send the request - would like to offload this request
response = requests.post(url, headers=headers, json=payload)
# Handle the response
data = json.loads(response.text)
reply = data["choices"][0]["message"]["content"]
return JsonResponse({'success':True, 'x':reply, 'prompt':user_prompt, 'system_prompt':system_prompt})
有人对如何做到这一点有任何建议吗?
我尝试过使用asyncio来卸载这个网络请求,但是我对这个模块不是很有经验,没有得到我想要的结果。
1条答案
按热度按时间4bbkushb1#
一般来说,当我们处理与http请求相关的长期进程时,我们需要将工作分开。
在实际的http请求中,唯一应该做的处理是返回响应代码。
然后,您可以卸载长期存在的部分to a task queue like Celery或其他可以处理并行处理的系统。这与简单地使用异步视图不同,因为工作已经移交给一个完全不同的分布式系统,该系统仍然可以在公共数据集上工作。
为了根据这些长期存在的进程更新用户,您需要集成Web套接字。Django Channels是一个很好的设置起点,但您也可以执行类似directly integrate with socket.io的操作。Web套接字允许长期存在的进程完成并将结果从服务器推送到客户端-双向通信。