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

时间:2013-01-10 12:23:55

标签: 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'

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

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:8)

使用logging module。更一般地说,您需要使用锁

import threading

lock = threading.Lock()
...

with lock:
    #Open the file and write to it

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

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