服务器在预期为405时以状态码200响应

问题描述

我想了解为什么我在这里得到200状态代码。我正在运行flask应用程序,并在请求处理端点而不是处理方法时得到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错误处理程序处理的?)。

我很确定答案与this post有关,但是我在这里问为什么会这样,而不是怎么解决,或者什么应该是解决此问题的最佳状态代码

解决方法

不带状态代码返回将默认为代码200

    def not_allowed(error):
        return jsonify({
            "success": False,})

此函数应返回所需的状态码。

return jsonify({"success": False}),405

请参见previously answered question