Оставляя в стороне тот факт, что вы храните все учетные данные в памяти, и если сервер выходит из строя, вы потеряли все.
Вы не можете использовать словарь, чтобы делать, как вы хотите, как вы уже знаете словарь может содержать только одно представление одного и того же ключа (в нашем случае, «имя пользователя»). поэтому, когда второй пользователь вызывает конечную точку /login
, вы перезаписываете предыдущую и наоборот.
Как упоминалось ранее, большинство приложений сгенерируют токен при успешном входе в систему и отправят его обратно вызывающий пользователь. Пользователь добавит его в качестве заголовка к своим предстоящим запросам, это позволит службе идентифицировать вызывающего пользователя и делать все, что ему нужно.
Вы можете искать существующие реализации или делать что-то самостоятельно. но в конечном итоге вам необходимо сопоставить токен с пользователем, например:
@app.route('/login', methods=['POST'])
def getCredentials():
if request.method == 'POST':
username = request.get_json(force=True).get('username')
password = request.get_json(force=True).get('password')
token = generate_token_for_user(username, password)
credentials[token] = {'username': username, 'password': password}
return jsonify({'token': token})
и в вызове API:
@app.route('/api', methods=['GET'])
def api():
token = request.headers['Authorization'] # assuming you're using this for your token
creds = credentials.get(token)
d = {}
if request.method == 'GET':
query = str(request.args['query'])
if query == 'marks':
m = b.getFullMarks(b.login(creds['username'], creds['password']))
for i in range(len(subjectNames)):
d[subjectNames[i]] = m[i]
return jsonify(d)
elif query == 'names':
m = b.getNames(b.login(creds['username'], creds['password']))
for i in range(len(subjectNames)):
d[subjectNames[i]] = m[i]
return jsonify(d)
elif query == 'calendar':
m = b.calendar(b.login(creds['username'], creds['password']))
d['Calendar'] = m
return jsonify(d)
elif query == 'badge':
m = b.badge(b.login(creds['username'], creds['password']))
d['Badge'] = m
return jsonify(d)
Offcourse, что поддержание жизненного цикла токена является немного сложнее, нужно через некоторое время аннулировать токен, и вам нужно будет проверять его при каждом запросе (обычно с промежуточным программным обеспечением), но это концепция.