PythonAnywhere如何处理多个“Web worker”或进程

时间:2017-01-23 22:09:05

标签: javascript jquery ajax django pythonanywhere

我的网站摘要:用户填写一些信息,在点击“提交”后,信息通过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吗?

1 个答案:

答案 0 :(得分:1)

每个Web工作者都是一个单独的过程。他们无权访问另一个worker中设置的变量。每个请求都可以发送给任何工作人员,因此无法保证您将使用为特定用户设置的文件名。如果您需要在请求之间传输信息,则需要将其存储在工作者的内存之外 - 您可以在cookie中,数据库或文件中执行此操作。