我正在Flask中编写微服务,通过API互相交流.
在发出POST请求时,我可以通过Response对象返回状态代码.有没有办法可以将此函数的数据作为JSON返回?
from flask import Flask, Response
@app.route('/login', methods=['POST'])
def login():
# Set the status code
response = Response(status=200)
# How can I return a JSON in my response object as {'username': 'febin'} ?
return response
Run Code Online (Sandbox Code Playgroud) 我已经从我的烧瓶式API模块中单独测试了所有方法.现在我想通过实际进行API调用来测试get方法.我期待这个测试的错误400.
我的资源类
class Response(Resource):
@marshal_with(response_params_get_responses_on_job)
def get(self, filter_name=None):
try:
response = self.process_get_request(filter_name)
if not response['users']:
raise MyValidationError("No data found")
return response
except MyValidationError as err:
abort(404, message=err)
except ValueError as mistake:
abort(400, message=mistake)
Run Code Online (Sandbox Code Playgroud)
我的单位测试
# TODO - Failing!
@mock.patch('application.resources.response.Response.process_get_request', autospec=True)
def test_get_400(self, process_get_request_mock):
process_get_request_mock.side_effect = ValueError("some error")
app = Flask(__name__)
app.debug = True
api = Api(app, prefix='/api/v2')
api.add_resource(Response, '/user/responses', endpoint='job_responses')
api.init_app(app)
with app.test_client() as client:
resp = client.get('/api/v2/user/responses',
environ_base={'HTTP_USER_AGENT': 'Chrome'},
headers={'Content-type': 'application/json'})
self.assertEqual(resp.status_code, 400)
Run Code Online (Sandbox Code Playgroud)
我的测试失败,因为我得到的响应是错误500
AssertionError: 500 != 400
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪 …
我希望能够使用 Flask 中的 abort() 显示自定义错误消息。我遇到了一个不寻常的情况,我遇到了麻烦。我的代码如下。
from flask import Flask, abort, jsonify, make_response, request
app = Flask(__name__)
@app.errorhandler(400)
def custom400(error):
return make_response(jsonify({'message': error.description}), 400)
@app.route('/test', methods=['POST'])
def test():
abort(400, 'custom error message')
if __name__ == '__main__':
app.run()
Run Code Online (Sandbox Code Playgroud)
上面的代码可以工作,但如果我尝试访问任何表单数据,其行为会有所不同,因为我无法访问自定义错误消息。
def test():
a = request.form['some_value']
abort(400, 'custom error message')
Run Code Online (Sandbox Code Playgroud)
我怎样才能避免这种情况呢?这是 Flask 的错误吗?
注意:上面的代码取自如何在使用自定义错误处理程序时从中止命令访问错误消息