【问题标题】:flask urlretrieve transaction isolationflask urlretrieve 事务隔离
【发布时间】:2018-10-08 12:25:44
【问题描述】:

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

我的问题是关于它们之间的时间很短的请求。当 User1 在他的请求中发送 url_1 时,会保存 url_1 处的文档。 User2 在打开来自 User1 的文档之前使用 url_2 发送请求。发送给 User1 的生成的 json 字符串是否基于 url_2 处的文档?这很有可能发生吗?

下图说明了这个场景:

Flask 应用如下所示:

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

【问题讨论】:

    标签: python flask urlretrieve


    【解决方案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
    

    使用临时目录或文件有助于避免您描述的并发问题。但它也可以防止您的函数抛出异常并保留文件的问题(它可能无法防止严重的崩溃)。这样您就不会意外地从以前的运行中拾取文件。

    【讨论】:

    • 为什么在使用本地文件系统时总是建议使用临时目录?
    • 我更新了我的答案以包含更多建议这样做的原因。
    猜你喜欢
    • 1970-01-01
    • 2011-09-30
    • 2015-06-14
    • 2023-03-25
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    相关资源
    最近更新 更多