使用open时不会创建/打开文件

时间:2016-12-25 14:31:10

标签: python flask

我正在使用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)

这是我的HTML视图: enter image description here

执行!后,' vsearch.log'应该包含我印刷的内容,但事实并非如此。此外,当文件不存在时,它不会被创建。

我尝试将开放模式更改为'a+',但我得到了相同的结果。我也进行了调试,这些行只是在没有错误的情况下执行。

有人可以解释一下发生了什么,我该如何解决这个问题?

2 个答案:

答案 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,因为他给了我解决这个问题的所有技巧。