Маршрут Flask Api работает с resquests.post (json = dict) - PullRequest
0 голосов
/ 05 марта 2019

У меня есть маршрут входа в систему фляги, который должен возвращать токен доступа

Мой маршрут выглядит так:

auth_api = Api(auth_bp)
parser = auth_api.parser()
auth = auth_api.model('Auth', {
    'email': fields.String(required=True, description='Email'),
    'password': fields.String(required=True, description='Password'),
})
parser.add_argument('email', type=str, required=True, help='Email', location='form')
parser.add_argument('password', type=str, required=True, help='Password', location='form')

class LoginApi(Resource):
    @auth_api.marshal_with(auth, code=201)
    def post(self):
        req = parser.parse_args()
        print(req)
        email = req.get('email', None)
        print(f"Email: {email}")
        password = req.get('password', None)
        print(f"Password: {password}")
        user = guard.authenticate(email, password)
        print(user)
        access_token = {'access_token': guard.encode_jwt_token(user)}
        print(access_token)
        return access_token, 201

В настоящее время в отдельном терминале при запуске requests.post()он просто возвращает {'email': None, 'password': None}, а не access_token.Я могу видеть access_token в своих журналах моего приложения фляги, поэтому оно создает эту переменную.

Мой запрос выглядит так:

creds = requests.post(
    login_url,
    data={'email': 'wally@starlabs.com', 'password': 'west'}
).json()
In [2]: creds
Out[2]: {'email': None, 'password': None}

Чего мне не хватает?

Обновление: Если я поменяю LoginApi на

class LoginApi(Resource):
    def post(self):
        req = request.get_json(force=True)
        email = req.get('email', None)
        password = req.get('password', None)
        user = guard.authenticate(email, password)
        access_token = {'access_token': guard.encode_jwt_token(user)}
        return access_token

Я могу бежать,

creds = requests.post(
    login_url,
    json={'email': 'wally@starlabs.com', 'password': 'west'}
).json()
In [4]: creds
Out[4]: {'access_token': 'a-jwt-string'}

Но если я бегу requests.post с data вместо этого

creds = requests.post(
    login_url,
    data={'email': 'wally@starlabs.com', 'password': 'west'}
).json()

Я получаю Out[6]: {'message': 'Failed to decode JSON object: Expecting value: line 1 column 1 (char 0)'}

Я получаю ту же ошибку при запуске, curl http://localhost:5000/api/login -X POST -d '{"email":"wally@starlabs.com","password":"west"}'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...