use*_*151 4 python flask python-requests
我有以下烧瓶代码:
from flask import Flask,request,jsonify
import requests
from werkzeug.exceptions import InternalServerError, NotFound
import sys
import json
app = Flask(__name__)
app.config['SECRET_KEY'] = "Secret!"
class InvalidUsage(Exception):
status_code = 400
def __init__(self, message, status_code=None, payload=None):
Exception.__init__(self)
self.message = message
if status_code is not None:
self.status_code = status_code
self.payload = payload
def to_dict(self):
rv = dict(self.payload or ())
rv['message'] = self.message
rv['status_code'] = self.status_code
return rv
@app.errorhandler(InvalidUsage)
def handle_invalid_usage(error):
response = jsonify(error.to_dict())
response.status_code = error.status_code
return response
@app.route('/test',methods=["GET","POST"])
def test():
url = "https://httpbin.org/status/404"
try:
response = requests.get(url)
if response.status_code != 200:
try:
response.raise_for_status()
except requests.exceptions.HTTPError:
status = response.status_code
print status
raise InvalidUsage("An HTTP exception has been raised",status_code=status)
except requests.exceptions.RequestException as e:
print e
if __name__ == "__main__":
app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)
我的问题是如何从 requests.exceptions.RequestException 对象 e 获取异常字符串(消息)和其他相关参数?
另外记录此类异常的最佳方法是什么。如果出现 HTTPError 异常,我有状态代码可供参考。
但是 requests.exceptions.RequestException 捕获所有请求异常。那么我如何区分它们以及除了使用打印语句之外记录它们的最佳方法是什么。
预先非常感谢您的任何答复。
RequestException
HTTPError
是、ConnectionError
、Timeout
、URLRequired
和其他类的基类TooManyRedirects
(整个列表可在requests 模块的GitHub 页面上找到)。似乎处理每个错误并打印相应信息的最佳方法是从更具体的错误开始处理,最后以最通用的错误(基类)结束。此StackOverflow 主题的评论对此进行了广泛的阐述。对于您的test()
方法,这可能是:
@app.route('/test',methods=["GET","POST"])
def test():
url = "https://httpbin.org/status/404"
try:
# some code...
except requests.exceptions.ConnectionError as ece:
print("Connection Error:", ece)
except requests.exceptions.Timeout as et:
print("Timeout Error:", et)
except requests.exceptions.RequestException as e:
print("Some Ambiguous Exception:", e)
Run Code Online (Sandbox Code Playgroud)
RequestException
这样,您可以首先捕获从该类继承的更具体的错误。
并考虑打印语句的替代方案 - 我不确定这是否正是您的意思,但您可以使用Flask 中的标准 Python 日志记录或日志记录模块本身(此处适用于 Python 3)登录到控制台或文件。