У меня есть запрос API к стороннему веб-сайту, который прекрасно работает в командной строке (от https://github.com/haochi/personalcapital):
pc = PersonalCapital()
try:
pc.login(email, password)
except RequireTwoFactorException:
pc.two_factor_challenge(TwoFactorVerificationModeEnum.SMS)
pc.two_factor_authenticate(TwoFactorVerificationModeEnum.SMS, input('code: '))
pc.authenticate_password(password)
accounts_response = pc.fetch('/newaccount/getAccounts')
accounts = accounts_response.json()['spData']
Когда я запускаю вышеизложенное в командной строке, я получаю обратно JSON
Тем не менее, я хотел бы использовать его в веб-приложении на сервере Flask. Поэтому мне нужно удалить командную строку input('code: ')
для подтверждения по SMS.Я буду использовать форму через 'POST' для получения пользовательского ввода.
Однако, если я redirect()
или render_template()
для отправки пользователя на форму, это прерывает мой сеанс API, и я получаю обратно«не аутентифицирован сеанс» ответ от API.
Логика сервера. Речь идет о /update
(сначала адрес электронной почты и пароль) и /authenticate
(форма подтверждения SMS):
@app.route("/update", methods=["GET", "POST"])
@login_required
def update():
# Via post:
if request.method == "POST":
# Ensure userentered email
if not request.form.get("pc_email"):
return apology("Please enter username", 400)
# Ensure user entered password
elif not request.form.get("pc_password"):
return apology("Please enter password", 400)
# Save email & password
email = request.form.get("pc_email")
password = request.form.get("pc_password")
# Try to log in
try:
pc.login(email, password)
# If 2-factor is required, send sms & redirect
except RequireTwoFactorException:
pc.two_factor_challenge(TwoFactorVerificationModeEnum.SMS)
return redirect("/authenticate")
# Get data:
else:
# Get accounts data
accounts_response = pc.fetch('/newaccount/getAccounts')
accounts = accounts_response.json()['spData']
# TODO - update database w/ data from accounts & transactions
return redirect("/")
@app.route("/authenticate", methods=["GET","POST"])
@login_required
def authenticate():
# Via POST:
if request.method == "POST":
# SMS authentication
pc.two_factor_authenticate(TwoFactorVerificationModeEnum.SMS, \
request.form.get(sms))
pc.authenticate_password(password)
# Get accounts data
accounts_response = pc.fetch('/newaccount/getAccounts')
accounts = accounts_response.json()
# TODO - update database w/ data from accounts & transactions
# Redirect to "/"
return render_template("test.html", accounts=accounts)
# Via GET:
else:
return render_template("authenticate.html")
Исходный код для проекта находится здесь: https://github.com/bennett39/budget/blob/stackoverflow/01/application.py
Как заблокировать выполнение кода в ожидании ответа пользователя с помощью своего кода SMS? Или я должен решить эту проблему по-другому?