Flask 返回 404 触发异常块并且不返回 Not Found

Chr*_*rds 3 python flask

我有一个非常简单的烧瓶服务器,仅用于学习目的,但我不明白的是当我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
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

whereid_exists查询一个 MySql 数据库,这一切都有效我已经在隔离中测试过了。

我的理解是有这个:

if id_exists(short_link):
            return redirect(find_full_link_by_id(short_link), code=302)
return abort(404)
Run Code Online (Sandbox Code Playgroud)

它应该总是返回。

此外,我的服务器有一个 post 端点,如果您不用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
Run Code Online (Sandbox Code Playgroud)

这确实正确返回了 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
Run Code Online (Sandbox Code Playgroud)

调试说异常 ( e) 实际上是404: Not Found使用 PyCharm IDE

Wom*_*atz 5

abort()是一个非返回函数。它不会返回,因为它所做的唯一一件事就是引发异常。所以你犯的第一个错误是return abort(...)。在return从未达到。

第二个错误是try except语句。

  1. 这是一个很好的例子,为什么裸except是不好的。除非您确定需要它,否则不要这样做。

  2. 您显式地引发异常并在except块中捕获该异常。如果你直接抓住它,为什么首先要加注?

要解决您的问题,请使用此模式:

if object_not_found:
    abort(404)
do_something
return your_response
Run Code Online (Sandbox Code Playgroud)

注意:它只是abort没有return.

始终确保您的视图确实返回响应。

您的代码不起作用,因为您在except块中捕获了 abort 异常,之后您没有返回响应。