我正在使用Flask并在Python中测试一些代码。我试图在每次帖子完成时在日志文件中存储Flask请求和字符串。
这是我的代码:
from flask import Flask, render_template, request
from vsearch import search4letters
app = Flask(__name__)
def log_request(request, results: str) -> None:
print(request)
with open('vsearch.log', 'a') as log:
print(request, results, file=log)
@app.route('/search4', methods=['POST'])
def do_search() -> 'html':
phrase = request.form['phrase']
letters = request.form['letters']
title = 'Here are your results:'
results = str(search4letters(phrase, letters))
log_request(request, results)
return render_template('results.html',
the_phrase=phrase,
the_letters=letters,
the_title=title,
the_results=results,
)
@app.route('/')
@app.route('/entry')
def entry_page() -> 'html':
return render_template('entry.html',
the_title='Welcome to search4letters on the web!')
if __name__ == '__main__':
app.run(debug=True)
按执行!后,' vsearch.log'应该包含我印刷的内容,但事实并非如此。此外,当文件不存在时,它不会被创建。
我尝试将开放模式更改为'a+'
,但我得到了相同的结果。我也进行了调试,这些行只是在没有错误的情况下执行。
有人可以解释一下发生了什么,我该如何解决这个问题?
答案 0 :(得分:1)
由于您使用的是Flask,因此使用内置日志记录功能要好得多。请参阅:http://flask.pocoo.org/docs/0.12/errorhandling/#logging-to-a-file
因此,例如,在app启动时,您将拥有:
import logging
file_handler = logging.FileHandler('/path/to/your/flask.log')
file_handler.setLevel(logging.WARNING)
app.logger.addHandler(file_handler)
然后,无论您想在应用程序中记录某些内容,都要记录到警告或以上,或者将文件处理程序日志级别设置为:
@app.route('/whatever')
def whatever():
app.logger.warning('Whatever!')
return render_template('whatever.html')
答案 1 :(得分:1)
感谢@AlexHall,我已经能够解决这个问题了。解决方案是指定文件的完整绝对路径。
def log_request(request, results: str) -> None:
with open('/absolute/path/to/the/file/vsearch.log', 'a') as log:
print(request, results, file=log)
此外,遵循@AlexHall建议了解当前的工作目录。我看到这是:
/Applications/PyCharm.app/Contents/bin
所以当没有指定完整的绝对路径时,文件' vsearch.log'在这里创建。
修改强>
所以,问题似乎是我从PyCharm运行我的代码。但是,当我使用终端时,我只是运行:
$ python webapp.py
我不需要指定完整的绝对路径。
修改强>
我能够解决这个问题,我可能在某些时候搞砸了设置,但在删除PyCharm中的所有运行配置,并从webapp.py
运行程序后,一切都已解决。
我真的要感谢@AlexHall,因为他给了我解决这个问题的所有技巧。