【问题标题】:Flask test_client returns 405 error using flask_restfulFlask test_client 使用 flask_restful 返回 405 错误
【发布时间】:2020-01-15 17:52:22
【问题描述】:

我的 Flask 应用代码如下所示

#!flask/bin/python
import os, sys; sys.path.append(os.path.dirname(os.path.realpath(__file__)))
from flask_restful import Api
from flask_cors import CORS
from flask_jwt_extended import JWTManager
from werkzeug.serving import WSGIRequestHandler
import logging
from flask import Flask, request
from waitress import serve

app = Flask(__name__, static_folder='ui', static_url_path='')


def create_app():
    handler = logging.StreamHandler(sys.stdout)
    logger = logging.getLogger('webapp')
    logger.setLevel(logging.INFO)
    logger.addHandler(handler)

    WSGIRequestHandler.protocol_version = "HTTP/1.1"
    app.config['CORS_HEADERS'] = 'Content-Type'

    CORS(app, origins=['http://127.0.0.1', 'http://localhost:3000', 'http://localhost:3000/api'],
     allow_headers=["Content-Type", "Authorization",
                    "Access-Control-Allow-Credentials",
                    "Access-Control-Allow-Headers",
                    "Access-Control-Allow-Origin"], supports_credentials=True)

    logging.basicConfig(level=logging.DEBUG)

    app.config['SECRET_KEY'] = '...'
    app.config['JWT_ACCESS_LIFESPAN'] = {'hours': 24}
    app.config['JWT_REFRESH_LIFESPAN'] = {'days': 30}

    jwt = JWTManager(app)

    api = Api(app)

    api.add_resource(resources.Login, '/api/login', methods=['POST'])

if __name__ == '__main__':
    app = create_app()
    serve(app, host='0.0.0.0', port=5000)
    # app.run(host='0.0.0.0', port=5000, use_reloader=False)

我的测试用例是这样的

def setUp(self):
    self.client = app.test_client()
    self.client.testing = True
    result = self.client.post('/api/login/', content_type='application/json',
                              json={'email': 'tester@fairxchange.co.uk', 'password': 'Tyle82654isMid!'})

    json_data = json.loads(result.get_data(as_text=True))
    self.token = json_data['access_token']

结果有:

<Response streamed [405 METHOD NOT ALLOWED]>

我在这里简化了代码。在 TestCase 设置中,我使用 api/login 来收集 jwt 令牌,然后在我的每个测试用例中使用它。但是我没有通过登录。

我哪里错了? Flask 应用在测试之外运行良好。

【问题讨论】:

  • 凹凸,因此仍然无法测试

标签: python-3.x flask flask-restful


【解决方案1】:

我遇到了同样的问题,并看到了您打开的问题。我被困了好几天,然后一时兴起,我用完整的 URL 替换了端点,它起作用了。我的所有端点都可以在测试客户端上正常工作,但不能在 POST 端点上工作。

例如,我最初有这个并且无论如何都收到 [405 METHOD NOT ALLOWED]:

res = test_client.post('/api/v1/some-endpoint', json={'some': 'json'}, headers=some_header, follow_redirects=True, content_type='application/json')

这是为我解决的问题:

res = test_client.post('https://<my server>.com/api/v1/some-endpoint', json={'some': 'json'}, headers=some_header, follow_redirects=True, content_type='application/json')

我不知道为什么我的所有其他端点都可以单独使用端点。 POST 测试似乎需要整个 URL。

【讨论】:

    猜你喜欢
    • 2023-01-11
    • 2018-06-16
    • 2018-03-03
    • 2021-08-07
    • 2018-06-29
    • 1970-01-01
    • 2021-04-27
    • 2015-06-12
    • 2012-08-24
    相关资源
    最近更新 更多