Flask HTTP 405 错误--Method not allowed

#!flask/bin/python
from flask import Flask, jsonify
from flask import abort
from flask import make_response
from flask import request
from flask import redirect
 

app = Flask(__name__)

tasks = [
    {
        'id': 1,
        'title': u'Buy groceries',
        'description': u'Milk, Cheese, Pizza, Fruit, Tylenol', 
        'done': False
    },
    {
        'id': 2,
        'title': u'Learn Python',
        'description': u'Need to find a good Python tutorial on the web', 
        'done': False
    }
]


@app.route('/todo/api/v1.0/tasks', methods=['POST'])
def create_task():
      if not request.json or not 'title' in request.json:
          abort(400)
      task = {
        'id': tasks[-1]['id'] + 1,
        'title': request.json['title'],
        'description': request.json.get('description', ""),
        'done': False
      }
      tasks.append(task)
      return jsonify({'task': task}), 201



@app.errorhandler(404)

def not_found(error):
    return make_response(jsonify({'error': 'Not found'}), 404)



if __name__ == '__main__':

    app.run(debug=True)
这是因为在路由时,仅仅允许POST请求。
当你访问/todo/api/v1.0/tasks时,首先做了一个GET请求。
仅仅你从浏览器进行提交时,才会做一个POST请求。
因此,上述代码
@app.route('/todo/api/v1.0/tasks', methods=['POST'])
需要修改为:
@app.route('/todo/api/v1.0/tasks', methods=['GET','POST'])
然而,修改后的代码依旧存在问题如下:

HTTP/1.0 400 BAD REQUEST
Content-Type: text/html
Content-Length: 192
Server: Werkzeug/0.14.1 Python/2.7.12
Date: Thu, 10 May 2018 08:12:11 GMT

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>400 Bad Request</title>
<h1>Bad Request</h1>
<p>The browser (or proxy) sent a request that this server could not understand.</p>

这是因为代码没有对GET请求作出响应,代码继续修改为:

@app.route('/todo/api/v1.0/tasks', methods=['GET','POST'])
def create_task():
    if request.method == 'POST':
      if not request.json or not 'title' in request.json:
          abort(400)
      task = {
        'id': tasks[-1]['id'] + 1,
        'title': request.json['title'],
        'description': request.json.get('description', ""),
        'done': False
      }
      tasks.append(task)
      return jsonify({'task': task}), 201

    return jsonify({'tasks': tasks})



测试结果:
测试一:不插入新任务
curl -i http://localhost:5000/todo/api/v1.0/tasks
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 317
Server: Werkzeug/0.14.1 Python/2.7.12
Date: Thu, 10 May 2018 08:50:13 GMT

{
  "tasks": [
    {
      "description": "Milk, Cheese, Pizza, Fruit, Tylenol",
      "done": false,
      "id": 1,
      "title": "Buy groceries"
    },
    {
      "description": "Need to find a good Python tutorial on the web",
      "done": false,
      "id": 2,
      "title": "Learn Python"
    }
  ]
}


测试二:插入一个新任务
$ curl -i -H "Content-Type: application/json" -X POST -d '{"title":"Read a book"}' http://localhost:5000/todo/api/v1.0/tasks
HTTP/1.0 201 CREATED
Content-Type: application/json
Content-Length: 105
Server: Werkzeug/0.14.1 Python/2.7.12
Date: Thu, 10 May 2018 08:51:11 GMT

{
  "task": {
    "description": "",
    "done": false,
    "id": 3,
    "title": "Read a book"
  }
}


测试三:插入一个新任务,再GET
$ curl -i http://localhost:5000/todo/api/v1.0/tasks
HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 424
Server: Werkzeug/0.14.1 Python/2.7.12
Date: Thu, 10 May 2018 08:51:15 GMT

{
  "tasks": [
    {
      "description": "Milk, Cheese, Pizza, Fruit, Tylenol",
      "done": false,
      "id": 1,
      "title": "Buy groceries"
    },
    {
      "description": "Need to find a good Python tutorial on the web",
      "done": false,
      "id": 2,
      "title": "Learn Python"
    },
    {
      "description": "",
      "done": false,
      "id": 3,
      "title": "Read a book"
    }
  ]
}




猜你喜欢

转载自blog.csdn.net/miao0967020148/article/details/80278094