http - 当预期 405 时,服务器以状态代码 200 响应
问题描述
我想了解为什么我会在这里收到 200 状态码。我正在运行一个烧瓶应用程序并在请求处理的端点而不是处理的方法时获得 200 状态代码作为响应。
这是最小的、可重现的代码。
app.py
文件:
from flask import Flask, request, abort, jsonify
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import Column, String, Integer
def create_app():
db = SQLAlchemy()
app = Flask(__name__)
app.config["SQLALCHEMY_DATABASE_URI"] = "postgresql://postgres:postgres@localhost:5432/so_question"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
db = SQLAlchemy()
db.app = app
db.init_app(app)
db.create_all()
class Book(db.Model):
__tablename__ = 'books'
id = Column(Integer, primary_key=True)
def __init__(self, id):
self.id = id
def format(self):
return {
'id': self.id,
}
@app.route('/books')
def get_books():
books = Book.query.order_by(Book.id).all()
return jsonify({
'books': [book.format() for book in books],
})
@app.route('/books/<int:book_id>', methods=["PATCH"])
def update_title(book_id):
return jsonify({
'success': True
})
@app.errorhandler(405)
def not_allowed(error):
return jsonify({
"success": False,
})
return app
然后我跑了FLASK_APP=app.py flask run
。我提出了以下要求:curl -X GET http://127.0.0.1:5000/books
结果如下:
{
"books": [
{
"id": 1
},
{
"id": 2
}
]
}
但这是我不明白的:我没有处理对/books/<int:book_id
端点的 POST 请求,实际上如果我发出该请求:curl -X POST http://127.0.0.1:5000/books/2
404 错误处理程序管理响应。我不明白为什么服务器会以"POST /books/2 HTTP/1.1" 200 -
. 为什么这个错误的 200 状态码实际上被检测为错误(因为响应正在由 405 错误处理程序处理)。?
我很确定答案与这篇文章有关,但在这里我要问的是为什么会发生这种情况,而不是如何修复或者应该是这个问题的最佳状态代码。
解决方案
不带状态码返回将默认为代码200
def not_allowed(error):
return jsonify({
"success": False,
})
这个函数应该返回你想要的状态码。
return jsonify({"success": False}), 405
请参阅先前回答的问题。
推荐阅读
- python - Python:更改源自 seaborn 和 matplotlib 的 ptitprince 存储库的视觉参数
- javascript - 单击按钮时选择框出现/消失
- excel - 如何提取日期并从今天的日期中减去它?
- java - 无法从 Maven 项目中的 Kotlin 文件中引用 Java 类
- javascript - 通过 $ref / 自引用获取值
- javascript - 如何访问对象中的值?
- python - 在元素中找不到标签值
- excel - 擦除存储在内存中的数据还是进一步简化这个子?
- sql - oracle替换中间的一个单词
- c# - ASP.net 核心,什么更好更快,jquery 或 razor