我有一个非常简单的烧瓶服务器,仅用于学习目的,但我不明白的是当我return abort(404)
它触发异常块并且实际上没有返回它实际返回的404时:
HI 2017-02-16 18:46:27,048 - __main__ - ERROR - Exception on /dddd [GET]
Traceback (most recent call last):
File "/usr/local/lib/python3.5/site-packages/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/usr/local/lib/python3.5/site-packages/flask/app.py", line 1478, in full_dispatch_request
response = self.make_response(rv)
File "/usr/local/lib/python3.5/site-packages/flask/app.py", line 1566, in make_response
raise ValueError('View function did not return a response')
ValueError: View function did not return a response
Flask服务器代码:
from flask import Flask, request, redirect, jsonify, abort, Response
@application.route("/<short_link>", methods=['GET'])
def get_short_link(short_link):
try:
if id_exists(short_link):
return redirect(find_full_link_by_id(short_link), code=302)
return abort(404)
except:
exc_type, exc_value, exc_traceback = sys.exc_info()
print("SOME PLACEHOLDER")
if __name__ == '__main__':
application.run()
其中id_exists
查询MySql数据库,这一切都是我在隔离中测试过的。
我的理解是拥有这个:
if id_exists(short_link):
return redirect(find_full_link_by_id(short_link), code=302)
return abort(404)
它应该总是返回。
如果您不使用application/json
作为内容类型,我的服务器还有一个后端点,它返回415。这按预期工作:
try:
if request.headers['Content-Type'] == 'application/json':
full_link = request.get_json(force=True).get('fullLink')
return jsonify(shortLink=generate(full_link, 5), fullLink=full_link)
return abort(Response('Unsupported Media Type', 415))
except:
# Some error handling omitted for this purpose
正确返回415响应。我已经尝试过返回200,415,403等,看看它是否有关于404的特别之处,但看起来没有。
我做错了什么?我是这个框架的新手。
编辑:只是为了澄清我是否使用调试工具并将我的代码更新为:
try:
if id_exists(short_link):
return redirect(find_full_link_by_id(short_link), code=302)
return abort(404)
except Exception as e:
#do something... removed for the sake of clarity
调试说异常(e
)实际上是404: Not Found
使用PyCharm IDE
答案 0 :(得分:2)
abort()
是一个非返回函数。它不会返回,因为它唯一能做的就是引发异常。所以你犯的第一个错误就是return abort(...)
。永远不会达到return
。
第二个错误是try except
声明。
这是一个很好的例子,为什么裸except
是坏的。除非你确定你需要它,否则不要这样做。
您明确提出异常并在except
块中捕获该异常。如果你直接抓到它,为什么要先加注呢?
要解决您的问题,请使用以下模式:
if object_not_found:
abort(404)
do_something
return your_response
注意:只有abort
没有return
。
始终确保您的视图确实返回了回复。
您的代码无效,因为您在except
块中捕获了中止例外,之后您没有返回响应。