У меня очень простой сервер флэков только для учебных целей, но я не понимаю, когда 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
Ваш исключающий блок не имеет возврата.Поэтому, когда в блоке try есть исключение, вы не возвращаете ничего, что именно сообщает об этом сообщение об ошибке. – Wombatz
@Wombatz, но исключение, которое выбрасывается, составляет 404: Not Found, который исходит из 404, вот чего я не понимаю. Если он не просто вернет «размер» (404) ». Обновленный мой пост, чтобы показать это –
, вы не должны ни возвращать, ни извлекать прерывания в Flask. Просто позвоните в прервать. – Hamms