Flask 框架中的標(biāo)準(zhǔn)代碼允許在用戶遇到導(dǎo)致錯(cuò)誤的頁面時(shí)向人們發(fā)送電子郵件,通常(以及我已實(shí)現(xiàn)的)在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)這很棒,因?yàn)樗鼤l(fā)送一封包含啟動調(diào)試過程信息的電子郵件,如下所示:Exception on / [GET]Traceback (most recent call last):File "C:\Python27\lib\site-packages\flask\app.py", line 1817, in wsgi_appresponse = self.full_dispatch_request()File "C:\Python27\lib\site-packages\flask\app.py", line 1477, in full_dispatch_requestrv = self.handle_user_exception(e)File "C:\Python27\lib\site-packages\flask\app.py", line 1381, in handle_user_exceptionreraise(exc_type, exc_value, tb)File "C:\Python27\lib\site-packages\flask\app.py", line 1475, in full_dispatch_requestrv = self.dispatch_request()File "C:\Python27\lib\site-packages\flask\app.py", line 1461, in dispatch_requestreturn self.view_functions[rule.endpoint](**req.view_args)File "hello.py", line 6, in hello_worldraise ExceptionException這不包含用戶輸入的 GET/POST 變量。這些可能是調(diào)試過程的關(guān)鍵,這就是我的問題。您如何request.form在這封電子郵件中包含所有變量(用于 GET/POST)?雖然我無法通過 Google 找到該問題的直接答案,但我找到的最接近的資源是 Flask 文檔(http://flask.pocoo.org/docs/1.0/logging/#logging),其中有一個(gè)部分“注入請求信息”討論了子類化,logging.Formatter但它指的是額外的信息,例如 IP 地址,并需要識別特定的值。這讓我想到了我的問題:如何修改日志電子郵件以包含來自用戶的錯(cuò)誤和所有請求(GET/POST)數(shù)據(jù)?
1 回答

汪汪一只貓
TA貢獻(xiàn)1898條經(jīng)驗(yàn) 獲得超8個(gè)贊
兩周后,仍然沒有明確回答我的問題。我發(fā)現(xiàn)的解決方法是修改 500 錯(cuò)誤處理程序:
@app.errorhandler(500)
def status_code_500(exc):
# do stuff in here
從這里的解決辦法是將所有轉(zhuǎn)儲request.args和request.form值到使用字符串json.dumps(request.args, indent=4, sort_keys=True)。這可以變成電子郵件,我們可以使用它@app.errorhandler通過 SMTPhandler 最好在新線程上發(fā)送電子郵件,這樣用戶就不會被阻止。
我們還可以在這封電子郵件中包含堆棧回溯traceback.formatexc。
這需要一些工作,因?yàn)槲覀兓旧鲜侵貙懸呀?jīng)內(nèi)置的現(xiàn)有代碼,但我還沒有找到允許我們將文本添加到 logging.handler 的電子郵件的解決方案。
添加回答
舉報(bào)
0/150
提交
取消