2017-02-16 1 views
1

У меня очень простой сервер флэков только для учебных целей, но я не понимаю, когда i 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) 

он всегда должен возвращаться.

Также мой сервер имеет конечную точку сообщения, которая возвращает 415, если вы не используете application/json в качестве типа содержимого. Это работает как ожидалось:

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, но не выглядит.

Что я делаю неправильно? Я новичок в этой структуре.

EDIT: Просто чтобы уточнить, если я использую инструмент отладки и обновить свой код, чтобы быть:

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, вот чего я не понимаю. Если он не просто вернет «размер» (404) ». Обновленный мой пост, чтобы показать это –

+0

, вы не должны ни возвращать, ни извлекать прерывания в Flask. Просто позвоните в прервать. – Hamms

ответ

2

abort() является не возвращающая функция. Он не возвращается, потому что единственное, что он делает, - это сделать исключение. Итак, первая ошибка, которую вы делаете, - return abort(...). return так и не дошел.

Вторая ошибка - заявление try except.

  1. Это хороший пример, почему голый except является плохим. Не делайте этого, если вы точно не знаете, что вам это нужно.

  2. Вы явно поднимите исключение и поймаете это в блоке except. Зачем поднимать в первую очередь, если вы поймаете это прямо?

Чтобы решить вашу проблему использовать этот шаблон:

if object_not_found: 
    abort(404) 
do_something 
return your_response 

Примечание: это просто abort без return.

Всегда убедитесь, что ваш вид действительно возвращает ответ.

Ваш код не работает, потому что вы поймали исключение прерывания в своем блоке except, и после этого вы не ответили.

Смежные вопросы