#python #flask #flask-restplus
#python #flask #flask-restplus
Вопрос:
У меня есть маршрут входа в flask, который должен возвращать токен доступа
Мой маршрут выглядит следующим образом,
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
в своих журналах моего приложения flask, поэтому оно создает эту переменную.
Мой запрос выглядит следующим образом,
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"}'
Комментарии:
1. Его сложно воспроизвести, но, возможно, вы могли бы попробовать return json.dumps(access_token)
2. Я мог бы связать репозиторий?
3. Используйте jsonify(ответ)
4. github.com/spitfiredd/flask-vue-login все материалы, связанные с flask, находятся в
backend
папке.