Веб-API с методом отправки запроса 405 на Python Flask не разрешен

#python-3.x #api #web #request

#python-3.x #API #веб #запрос

Вопрос:

Я создаю веб-API для программы на Python, которую я написал, я копирую учебник

Это код API

 #!flask/bin/python
from flask import Flask
from flask import make_response
from flask import request
import requests
import json

app = Flask(__name__)

@app.route('/')
def index():
    return "Hello, World!"

if __name__ == '__main__':
    app.run(debug=True)
    
@app.errorhandler(404)
def not_found(error):
    return make_response(jsonify({'error': 'Not found'}), 404)
  
@app.route('/5492946838458/index.html', methods=['POST'])
def create_task():
    if not request.json or not 'key' in request.json or not 'name' in request.json or not 'text' in request.json or not 'pack' in request.json:
        abort(400)
    if 'title' in request.json and type(request.json['title']) != unicode:
        abort(400)
    if 'description' in request.json and type(request.json['description']) is not unicode:
        abort(400)
    task = {
      'key': request.json['key'],
      'name': request.json['name'],
      'text': request.json['text'],
      'pack': request.json['pack']
    }
    return (200)
  

Это URL-адрес, на который я его отправляю

 https://my.websites.url.here/5492946838458/
  

и данные json, которые я отправляю

 {
"key": "key",
"name": "name",
"text": "text",
"pack": "pack"
}
  

и заголовки, которые я получаю обратно, я получаю

 date: Fri, 04 Sep 2020 17:48:30 GMT
content-length: 0
vary: Origin
accept-ranges: bytes
allow: GET, HEAD, OPTIONS
  

Почему это происходит и как я могу это исправить

Ответ №1:

Я вижу две проблемы…

Эта строка не должна находиться в середине вашего кода. Это должно быть в самом конце:

 if __name__ == '__main__':
    app.run(debug=True)
  

При его текущем размещении, если вы выполняете приложение с python app.py , приложение будет запущено на этом этапе. Маршруты перед ним ( index ) будут доступны, однако маршруты, объявленные после него ( create_task ), не будут (пока вы не отключите сервер — когда будет добавлен последний маршрут, прямо перед python остановкой процесса).

Эта проблема не была бы замечена, если бы выполнение с flask run как if предложение равно False.


@app.route('/5492946838458/index.html', methods=['POST'])

для этого вы, вероятно, хотите:

@app.route('/5492946838458/', methods=['POST'])

При этом объявляется URL-адрес этого маршрута.

Теперь запрос на https://my.websites.url.here/5492946838458/ должен вернуть успешный ответ. Запрос на /5492946838458 вернет перенаправление 308 на тот, который имеет косую черту в конце.

Я не уверен, почему ты получал 405 раньше. Возможно, где-то в вашем коде есть другой маршрут, принимающий запрос, но не метод.