Результаты HTML-формы POST в API и получение ответа в колбе

Я относительно новичок в Flask и разработке веб-приложений в целом. Итак, я создал базовую страницу входа в систему, и у меня есть сеть API с аутентификацией ldap для аутентификации пользователей в моей организации. Я пытаюсь отправить результаты формы входа в веб-адрес API, он принимает 2 параметра: имя пользователя и пароль.

Это мой логин.html:

<link rel = "stylesheet" href = "/static/style.css" type = "text/css">
&#123;% block body %&#125;

<form action = "/login2" method = "POST">
<div class = "login">
<div class = "login-screen">
<div class = "app-title">
<h1>Login</h1>
</div>
<div class = "login-form">
<div class = "control-group">
                <input type = "text" class = "login-field" value = "" placeholder = "username" name = "username">
<label class = "login-field-icon fui-user" for = "login-name"></label></div>
<div class = "control-group">
                <input type = "password" class = "login-field" value = "" placeholder = "password" name = "password">
<label class = "login-field-icon fui-lock" for = "login-pass"></label></div>
<input type = "submit" value = "Log in" class = "btn btn-primary btn-large btn-block">

</div>
</div>
</div>
</form>
&#123;% endblock %&#125;

И это соответствующий код Flask:

@app.route('/', methods=['GET', 'POST'])
def home():
    
    return render_template('login.html')
    
@app.route('/login2', methods=['POST'])
def logger():
    if request.method == 'POST':
        url = "my url to authenticate"
        response = requests.post(url, json = {"username": "myusername","password": "mypassword"}, verify=False)
        data = request.get_json()
        print(data)
        return "Done"

Прямо сейчас я просто пытался протестировать API, отправив свои действительные учетные данные в API, но он всегда возвращает None вместо фактического результата, который он должен был вернуть.

Проблема не в API, потому что он работает на терминале с CURL.

В идеале я хотел бы отправить данные для входа в API.

Затем:

  • если код ответа API равен 200, аутентификация прошла успешно
  • если код ответа API равен 401, аутентификация должна завершиться неудачей, и я могу добавить сообщение для этого и перенаправить их обратно

Пожалуйста помоги ОБНОВЛЯТЬ: Итак, теперь это мой login.html. Я пытаюсь отправить данные формы с помощью JS из login.html. Но я все еще не уверен, как я могу вернуть ответ, а также этот код не дает вывода в консоль, поэтому я не уверен, что я делаю неправильно

<link rel = "stylesheet" href = "/static/style.css" type = "text/css">
&#123;% block body %&#125;

<body>
<form method = "POST" id = "myForm">
<div class = "login">
<div class = "login-screen">
<div class = "app-title">
<h1>Login</h1>
</div>
<div class = "login-form">
<div class = "control-group">
                <input type = "text" class = "login-field" value = "" placeholder = "username" name = "username">
<label class = "login-field-icon fui-user" for = "login-name"></label></div>
<div class = "control-group">
                <input type = "password" class = "login-field" value = "" placeholder = "password" name = "password">
<label class = "login-field-icon fui-lock" for = "login-pass"></label></div>
<input type = "submit" value = "Log in" class = "btn btn-primary btn-large btn-block">

</div>
</div>
</div>
</form>

<script>
    const myForm = document.getElementById('myForm');

    myForm.addEventListener('submit', function(e) {

        e.preventDefault;
        
        const formData = new FormData(this);
        url = "url to authenticate"
        response = requests.post(url, json = {"username": "myusername","password": "mypassword"}, verify=False)
        data = request.get_json()
        console.info(data)
        flash(data)
    });


</script>

</body>

&#123;% endblock %&#125;
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
827
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Избавьтесь от второго обновления. В первой версии вашего кода:

response = requests.post(url, json = {"username": "myusername","password": "mypassword"}, verify=False)
data = request.get_json()
print(data)

В этих строках вы отправляете запрос к вашему API авторизации с библиотекой Python под названием requests, он возвращает ответ в переменную response. Обратите внимание, что переменная response содержит информацию, возвращаемую вашим API авторизации (вы вызываете для нее метод call json(), чтобы получить тело JSON). Однако тогда вы вызываете get_json() на объекте request Flask с помощью request.get_json() вместо вызова response.json(). Вот почему у тебя всегда есть None.

Следовательно, вы должны использовать код ниже:

response = requests.post(url, json = {"username": "myusername","password": "mypassword"}, verify=False)
data = response.json()
print(data)

Это сработало, большое спасибо. Можете ли вы также помочь мне с тем, как я могу использовать фактические данные формы вместо передачи моих переменных для их проверки?

Raghav Chamadiya 12.12.2020 12:57

Я разобрался, еще раз большое спасибо!

Raghav Chamadiya 12.12.2020 13:37

Другие вопросы по теме