当用户遇到错误时,Flask会发送电子邮件,其中包含所有请求值(POST/GET)



Flask框架中的标准代码允许用户在遇到导致错误的页面时向用户发送电子邮件,通常(以及我所实现的(在app.py脚本中是这样的:

from app import app
...
if not app.debug:
import logging
from logging.handlers import SMTPHandler
mail_handler = SMTPHandler(EMAIL_SERVER,
EMAIL_FROM,
EMAIL_ADMINS, 
EMAIL_SUBJECT,
credentials=(EMAIL_ EMAIL,'***'),
port=EMAIL_PORT)
mail_handler.setLevel(logging.ERROR)
app.logger.addHandler(mail_handler)

这很好,因为它发送了一封包含信息的电子邮件来启动调试过程,看起来像:

Exception on / [GET]
Traceback (most recent call last):
File "C:Python27libsite-packagesflaskapp.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "C:Python27libsite-packagesflaskapp.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "C:Python27libsite-packagesflaskapp.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "C:Python27libsite-packagesflaskapp.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "C:Python27libsite-packagesflaskapp.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "hello.py", line 6, in hello_world
raise Exception
Exception

其中不包含的是用户正在输入的GET/POST变量。这些可能是调试过程的关键,这是我的问题。如何在这封电子邮件中包含所有request.form变量(用于GET/POST(?

虽然我无法通过谷歌找到这个问题的直接答案,但我找到的最接近的资源是Flask文档(http://flask.pocoo.org/docs/1.0/logging/#logging)它有一个关于"Injecting Request Information">的部分,其中谈到了logging.Formatter的子类化,但它引用了额外的信息,如IP地址,并需要识别特定的值。

这就引出了我的问题:

如何修改日志电子邮件以包含来自用户的错误和所有请求(GET/POST(数据?

两周后,我的问题仍然没有明确的答案。我发现的一个解决方案是修改500错误处理程序:

@app.errorhandler(500)
def status_code_500(exc):
# do stuff in here

从这里开始,解决方案是使用json.dumps(request.args, indent=4, sort_keys=True)将所有request.argsrequest.form值转储到一个字符串中。这可以变成一封电子邮件,我们可以使用这个@app.errorhandler通过SMTPhandler发送电子邮件,最好是在一个新的线程上,这样用户就不会被阻止。

我们还可以在这封带有traceback.formatexc的电子邮件中包含堆栈回溯。

这需要一些工作,因为我们基本上正在重写已经内置的现有代码,但我还没有找到一个解决方案,允许我们在logging.handler的电子邮件中添加文本。

最新更新