Python Django -在后台处理长时间运行的视图

kknvjkwl  于 2023-05-30  发布在  Go
关注(0)|答案(1)|浏览(170)

在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来卸载这个网络请求,但是我对这个模块不是很有经验,没有得到我想要的结果。

4bbkushb

4bbkushb1#

一般来说,当我们处理与http请求相关的长期进程时,我们需要将工作分开。
在实际的http请求中,唯一应该做的处理是返回响应代码。
然后,您可以卸载长期存在的部分to a task queue like Celery或其他可以处理并行处理的系统。这与简单地使用异步视图不同,因为工作已经移交给一个完全不同的分布式系统,该系统仍然可以在公共数据集上工作。
为了根据这些长期存在的进程更新用户,您需要集成Web套接字。Django Channels是一个很好的设置起点,但您也可以执行类似directly integrate with socket.io的操作。Web套接字允许长期存在的进程完成并将结果从服务器推送到客户端-双向通信。

相关问题