i need to write a method on a Flask server which will write part of the request to a log file. however, if i understand correctly, Flask is multi-threaded, and there's a good chance that writing to a file is not safe.
admittedly, i am more or less new to python and multi-threaded programming in general, so i need someone to somewhat hold my hand through this a little bit :)
my code so far (slightly modified, without the parts of that would get me in trouble for posting online)
@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'
i'm guessing i need to wrap some code around the open and close statements, but i have no real idea what and i'm reading the Threads and Processes chapter in "Python in a Nutshell" book, and its not really giving me much of an idea about how to actually use these methods.
any help would be appreciated.
Use the logging module. More in general, you need to use a Lock
import threading lock = threading.Lock() ... with lock: #Open the file and write to it
Basically, this is what
logging does as well. More precisely, the
Handler-objects (that actually write to some output, e.g., a file) implement locking.
It is important that all processes use the same Lock object, instead of creating their own. Thus, you could put it on module-level or similar.