flask urlretrieve 事务隔离
flask urlretrieve transaction isolation
我正在使用 Flask 处理包含指向文档的 URL 的请求。当请求到达时,URL 指向的文档将保存到文件中。该文件被打开、处理并生成一个 json 字符串,具体取决于文档中的数据。 json 字符串在响应中发送。
我的问题是关于在很短的时间内到达的请求。当 User1 在他的请求中发送 url_1 时,url_1 处的文档被保存。在打开来自用户 1 的文档之前,用户 2 发送带有 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
如果启用线程(默认情况下禁用),则可能会发生这种情况。如果您必须使用本地文件系统,那么最好将其隔离,例如使用临时目录。例如,您可以使用 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
使用临时目录或文件有助于避免您描述的并发问题。但它也可以防止你的函数抛出异常并保留文件的问题(它可能无法防止严重的崩溃)。这样您就不会不小心从以前的 运行.
中获取文件
我正在使用 Flask 处理包含指向文档的 URL 的请求。当请求到达时,URL 指向的文档将保存到文件中。该文件被打开、处理并生成一个 json 字符串,具体取决于文档中的数据。 json 字符串在响应中发送。
我的问题是关于在很短的时间内到达的请求。当 User1 在他的请求中发送 url_1 时,url_1 处的文档被保存。在打开来自用户 1 的文档之前,用户 2 发送带有 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
如果启用线程(默认情况下禁用),则可能会发生这种情况。如果您必须使用本地文件系统,那么最好将其隔离,例如使用临时目录。例如,您可以使用 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
使用临时目录或文件有助于避免您描述的并发问题。但它也可以防止你的函数抛出异常并保留文件的问题(它可能无法防止严重的崩溃)。这样您就不会不小心从以前的 运行.
中获取文件