我目前正在使用Django开发项目Web应用程序。我已经预先准备了可以正常工作的脚本(Python),但是在尝试使用Django实现脚本时遇到了问题。在重复请求期间,我使用了html-requests会话来使http连接保持活动状态。我应该使用Django Channels还是StreamHttpResponse来达到相同的效果或完全不同的效果?
主要是,使用AJAX的jQuery反复调用view.function直到满足要求,但是由于每次都使用session.get提取一个URL,因此它创建了一个新会话,因此在尝试浏览页面时我会得到不正确的数据。搜索与django相关的任何会话都会给我django会话结果。
我设法使用django会话或更新数据库来保留任意数据,因为我找不到在这些调用之间持久保存自定义类的方法,所以现在唯一的问题是持久保存http连接。
我应该研究StreamHttpResponse,Django Channels还是其他东西?
views.py
def search_for_product(request):
current_user = request.user
task_id = request.GET.get('task_id', None)
current_task = GetWebsite(current_user, task_id)
if current_task.configured_task.final_result:
current_task.configured_task.search_again()
elif current_task.configured_task.item_found:
if current_task.configured_task.item_details_found:
current_task.configured_task.finalize_result()
else:
current_task.configured_task.find_details()
else:
current_task.configured_task.find_item()
data = {
'status': current_task.configured_task.current_status
}
time.sleep(5)
return JsonResponse(data)
基本上,将连续调用search_for_product(result),直到保存最终结果。我返回一个状态(布尔值),以指示是否成功找到该项目,获取该项目的详细信息并准备显示结果,我的AJAX函数使用该状态重复此操作,直到final_result为True。除了我需要保持httpconnection处于打开状态,否则该站点将正常运行,否则该站点将无法显示正确的结果,并且在第二次致电中搜索项目详细信息将失败。
function getStatus(statusLabel, rowID, taskID) {
allTasks[rowID] = $.ajax({
url: 'http://localhost:8000/page/search-for-product/',
method: 'GET',
data: {
'task_id': taskID
},
dataType: 'json'
}).done(function(data) {
if (data.final) {
console.log(data.status);
} else {
statusLabel.style.color = 'green';
statusLabel.textContent = data.status;
console.log(data.status);
getStatus(statusLabel, rowID, taskID);
}
}).fail(function(data) {
console.log(data.task_id);
statusLabel.textContent = data.status;
});
}