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

6
我需要在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'

我猜我需要在开放和关闭语句周围包装一些代码,但我真的不知道是什么,我正在阅读“Python in a Nutshell”书中的“线程和进程”章节,但它并没有给我关于如何实际使用这些方法的很多想法。
任何帮助都将不胜感激。
1个回答

9

使用logging模块。更一般地说,您需要使用锁(Lock)。

import threading

lock = threading.Lock()
...

with lock:
    #Open the file and write to it

基本上,logging 的作用就是如此。更准确地说,实际写入某个输出(例如文件)的 Handler 对象实现了锁定。

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


根据文档,日志记录模块已经是线程安全的。 - Karsten
1
好的,你的回答有点让我困惑。我想你是指日志记录会这样做。你能提到文档吗? - Karsten
1
是的,logging 在内部使用 Lock 对象。已添加文档链接。 - Thorsten Kranz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接