首页 > 解决方案 > 当预期 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 错误处理程序处理)。?

我很确定答案与这篇文章有关,但在这里我要问的是为什么会发生这种情况,而不是如何修复或者应该是这个问题的最佳状态代码。

标签: httpflaskcurlhttp-status-code-404http-status-codes

解决方案


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

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

这个函数应该返回你想要的状态码。

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

请参阅先前回答的问题


推荐阅读