使用Flask时如何安全地写入文件?

bad*_*eas 4 python thread-safety flask

我需要在Flask服务器上编写一个方法,它将部分请求写入日志文件.但是,如果我理解正确,Flask是多线程的,并且很有可能写入文件是不安全的.

不可否认,我或多或少都是python和多线程编程的新手一般,所以我需要有人稍微握住我的手一点点:)

到目前为止我的代码(略有修改,没有任何部分会让我在网上发布麻烦)

@app.route('/store_test')
def store_test():
    now = str(time.time())
    ip_address = request.remote_addr
    agent = request.user_agent.string

    log_data = [now,ip_address,agent]
    log_data_string = "\t".join(log_data)

    filename = "log.dat"

    f = open(filename,'a')
    f.write(log_data_string + "\n")
    f.close()

    return 'OK'
Run Code Online (Sandbox Code Playgroud)

我猜我需要围绕open和close语句包含一些代码,但我不知道是什么,我正在阅读"果壳中的Python"一书中的Threads and Processes章节,它并没有真正给我很多关于如何实际使用这些方法的想法.

任何帮助,将不胜感激.

Tho*_*anz 8

使用日志记录模块.更一般地说,你需要使用一个锁

import threading

lock = threading.Lock()
...

with lock:
    #Open the file and write to it
Run Code Online (Sandbox Code Playgroud)

基本上,这也是这样logging做的.更确切地说,Handler对象(实际写入某些输出,例如文件)实现锁定.

重要的是所有进程都使用相同的Lock对象,而不是创建自己的对象.因此,您可以将其置于模块级或类似级别.