Ошибка ключа при передаче переменной с использованием сеанса во Flask - PullRequest
0 голосов
/ 07 июня 2018

Я хочу передать переменные из функции в класс в приложении Flask, используя session.Это мой код:

@app.route('/login', methods=['POST'])
def login():
    if not request.is_json:
        return jsonify({"msg": "Missing JSON in request"}), 400

    username = request.json.get('username', None)
    password = request.json.get('password', None)
    session['client_fname'] = request.json.get('Client First Name', None)
    session['client_lname'] = request.json.get('Client Last Name', None)

    ... ...

    access_token = create_access_token(identity=username)
    return jsonify(access_token=access_token), 200

class PrivateResource(Resource):
    @app.route('/protected', methods=['GET'])
    @jwt_required

    def sendData():
        return mysqldb.addUser("{}".format(session['client_fname']),"{}".format(session['client_lname']))

Переменные, которые я хочу передать: session['client_fname'] и session['client_lname'].Однако, когда я пытаюсь вызвать sendData(), используя curl -X GET http://localhost:5000/protected -H "Authorization: Bearer JWTGOESHERE", я получаю:

  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/flask/app.py", line 2309, in __call__
    return self.wsgi_app(environ, start_response)
  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/flask/app.py", line 2295, in wsgi_app
    response = self.handle_exception(e)
  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/flask_restful/__init__.py", line 273, in error_router
    return original_handler(e)
  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/flask/app.py", line 1741, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/flask_restful/__init__.py", line 273, in error_router
    return original_handler(e)
  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/flask_jwt_extended/view_decorators.py", line 101, in wrapper
    return fn(*args, **kwargs)
  File "/Users/open/PycharmProjects/FlaskMiddleware/Flask-API-Middleware-V1/authenticate.py", line 48, in sendData
    return mysqldb.addUser("{}".format(session['client_fname'],None),"{}".format(session['client_lname']))
  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/werkzeug/local.py", line 377, in <lambda>
    __getitem__ = lambda x, i: x._get_current_object()[i]
  File "/Users/open/venv/FlaskMiddleware/lib/python2.7/site-packages/flask/sessions.py", line 83, in __getitem__
    return super(SecureCookieSession, self).__getitem__(key)
KeyError: 'client_fname'

Что не так с тем, как я использую session для передачи переменных?Как я могу это исправить?

ОБНОВЛЕНИЕ

Если это проблема с cookie, связанная с сохранением сеанса, как я могу этого добиться?Сейчас я создаю файл cookie в curl -H "Content-Type: application/json" -X POST -d '{"username":"user1","password":"abc123","Client First Name":"SAUR","Client Last Name":"KRIS"}' http://localhost:5000/login -c cookies.txt, а затем пытаюсь curl -X GET http://localhost:5000/protected -H "Authorization: Bearer JWTGOESHERE" -b cookies.txt.Теперь я получаю TypeError: The view function did not return a valid response. The function either returned None or ended without a return statement., и я не уверен, что это прогресс или просто неправильно.

Ответы [ 3 ]

0 голосов
/ 14 июня 2018

Ваше обновление похоже на прогресс, но, возможно, функция mysqldb.addUser возвращает None.

Самый простой способ определить, выполняете ли вы прогресс, - это отладить с точкой останова в строке return mysqldb.addUser("{}".format(session['client_fname']),"{}".format(session['client_lname'])) (я обычно использую PyCharm для этого, но в большинстве сред IDE есть что-то для отладки, или вы можетеиспользуйте pdb).Более быстрый, но более сложный вариант: добавить оператор print перед вызовом mysqldb.addUser, а другой оператор print после печати возвращаемого значения.

0 голосов
/ 19 июня 2018

Похоже, вы используете flask_jwt_extended, чтобы вы могли обойти проблему, сохранив эти данные непосредственно в токене.

# ...
access_token = create_access_token({
  'first_name': request.json.get('Client First Name', None),
  'last_name': request.json.get('Client Last Name', None)
})

И затем извлекая их по маршруту protected:

# ...
user_adata = get_jwt_identity()
0 голосов
/ 08 июня 2018

Вы почти наверняка не сохраняете состояние между вашими запросами.Если вы используете почтальон или curl, не забудьте сохранить cookie с идентификатором сессии.Если вы используете requests, используйте requests.session().

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