烧瓶返回404触发异常块并不返回未找到

问题描述:

我有一个非常非常简单的烧瓶服务器只是为了学习的目的,但我不明白的是当我return abort(404)它触发异常块,并不实际返回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 

瓶服务器代码:

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) 

应该总是返回。

另外我的服务器有一个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 

它正确返回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

你除了块没有回报。所以当try块中有一个异常时,你不会返回任何错误信息告诉你的东西。 – Wombatz

+0

@Wombatz但是抛出的异常是404:Not Found来自404,这就是我不明白的地方。它不应该只是返回'abort(404)'。更新我的帖子,以显示这个 –

+0

你不应该返回,也不应该在Flask中捕获异常。只需调用abort即可。 – Hamms

abort()是不返回功能。它不会返回,因为它唯一会引发异常。所以你犯的第一个错误是return abort(...)return永远不会到达。

第二个错误是try except声明。

  1. 这是一个很好的例子,为什么一个光秃的except是坏的。除非你确定知道你需要它,否则不要这样做。

  2. 您明确引发异常并在except块中捕获该异常。如果你直接抓住它,为什么首先要提高呢?

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

if object_not_found: 
    abort(404) 
do_something 
return your_response 

注:这只是abort没有return

务必确保您的视图确实会返回响应。

您的代码无法正常工作,因为您在except区块中发现了中止异常,并且此后没有返回响应。