flask urlretrieve事务隔离

时间:2018-10-08 12:25:45

标签: python flask urlretrieve

我正在使用flask处理包含指向文档的URL的请求。请求到达时,URL指向的文档将保存到文件中。打开,处理该文件,并根据文档中的数据生成一个json字符串。 json字符串在响应中发送。

我的问题是关于请求之间的间隔很短的请求。当User1在其请求中发送url_1时,将保存url_1处的文档。在打开来自User1的文档之前,User2发送带有url_2的请求。发送到User1的生成的json字符串是否将基于url_2上的文档?这很有可能发生吗?

下图说明了这种情况:

transaction isolation

长颈瓶应用程序的外观如下:

app = Flask(__name__)

@app.route("/process_document", methods=['GET'])
def process_document():
    download_location = "document.txt"
    urllib.request.urlretrieve(request.args.get('document_location'),download_location)
    json = some_module.construct_json(download_location)
    return json

1 个答案:

答案 0 :(得分:1)

如果启用了线程(默认情况下禁用),则可能会发生这种情况。如果必须使用本地文件系统,则建议始终将其隔离,例如使用临时目录。例如,您可以使用tempfile.TemporaryDirectory

import os
from tempfile import TemporaryDirectory

# ...

@app.route("/process_document", methods=['GET'])
def process_document():
    with TemporaryDirectory() as path:
        download_location = os.path.join(path, "document.txt")
        urllib.request.urlretrieve(
            request.args.get('document_location'),
            download_location
        )
        json = some_module.construct_json(download_location)
        return json

使用临时目录或文件有助于避免出现您所描述的并发问题。但是它也可以防止某些问题,例如您的函数抛出异常并保留文件(它可能无法防止再次发生严重崩溃)。这样,您就不会意外地从上一次运行中提取文件。