我的网站摘要:用户填写一些信息,在点击“提交”后,信息通过AJAX提交给后端。在后端接收信息时,它使用该信息生成DOCX并将该DOCX文件提供给用户。
这是我的HTML文件中的AJAX代码
$.ajax({
type:'POST',
url:'/submit/',
data:{
data that I submit
},
dateType: 'json',
success:function() {
document.location = "/submit";
}
})
我的视图函数/ submit /使用send_file返回文件
def submit(request):
#Receive Data
#Create a File with the Data and save it to the server
return send_file(request)
def send_file(request):
lastName = get_last_name() +'.docx'
filename = get_full_path() # Select your file here.
wrapper = FileWrapper(open(filename , 'rb'))
response = HttpResponse(wrapper, content_type='application/vnd.openxmlformats-officedocument.wordprocessingml.document')
response['Content-Disposition'] = 'attachment; filename=' + lastName
response['Content-Length'] = os.path.getsize(filename)
return response
现在已经完美无缺。但是,当我在托管帐户中将“网络工作者”/流程的数量从1增加到4时,我开始出现问题。发生的事情是一个不同的Web工作者正在用来发送文件,这是创建一个新的网站实例来做到这一点。问题是新实例不包含使用创建文件的Web worker创建的文件路径。
就像我说的,当我的webApp只有一个“网络工作者”或一个进程时,这完美无缺。现在我只有大约50%的成功率。
它几乎就像一个进程试图在创建文件之前发送它。或者该进程无权访问创建它的进程所执行的文件名。
非常感谢任何帮助。谢谢!
代码尝试通过请求发送path_name,然后返回服务器。
提交视图将文件信息返回给ajax。
def submit(request):
# Receive DATA
# Generate file with data
lastName = get_last_name() +'.docx'
filename = get_full_path() # Select your file here.
return HttpResponse(json.dumps({'lastname': lastName,'filename':filename}), content_type="application/json")
AJAX的成功功能
success:function(fileInfo) {
name_last = fileInfo['lastname']
filepath= fileInfo['filepath']
document.location = "/send";
}
那么我可以使用“/ send”发送fileINfo吗?
答案 0 :(得分:1)
每个Web工作者都是一个单独的过程。他们无权访问另一个worker中设置的变量。每个请求都可以发送给任何工作人员,因此无法保证您将使用为特定用户设置的文件名。如果您需要在请求之间传输信息,则需要将其存储在工作者的内存之外 - 您可以在cookie中,数据库或文件中执行此操作。