【问题标题】:POST HTML form results to api and get response in flask将 HTML 表单结果发布到 api 并在烧瓶中获得响应
【发布时间】:2021-03-23 12:23:14
【问题描述】:

我对@9​​87654321@ 和一般的网络应用程序开发比较陌生。 所以,我已经建立了一个基本的登录页面,并且我有一个带有 ldap 身份验证的 web API 来对我组织中的用户进行身份验证。 我正在尝试将登录表单结果发送到网络API url,它接受 2 个参数:用户名和密码。

这是我的 login.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。我现在正在尝试从 login.html 使用 JS 发送表单数据。但是,我仍然不确定如何才能得到响应,而且这段代码在控制台中没有输出,所以我不确定我做错了什么

<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.log(data)
        flash(data)
    });


</script>

</body>

&#123;% endblock %&#125;

【问题讨论】:

    标签: python html json api flask


    【解决方案1】:

    摆脱您的第二次更新。在您的代码的第一个版本中:

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

    在这些行中,您使用名为 requests 的 Python 库向您的身份验证 API 发送请求,它将响应返回给 response 变量。请注意,response 变量包含您的身份验证 API 返回的信息(您对其调用 json() 方法以获取 JSON 正文)。但是,然后您在 Flask 的 request 对象上使用 request.get_json() 调用 get_json(),而不是调用 response.json()。这就是为什么你总是得到None

    因此,您应该使用以下代码:

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

    【讨论】:

    • 成功了,非常感谢。您还可以帮助我如何使用实际的表单数据而不是传递我的变量来测试它吗?
    • 我想通了,再次感谢您!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多