curl 如何使用Flask访问表单数据?[副本]

dhxwm5r4  于 2023-06-30  发布在  其他
关注(0)|答案(2)|浏览(123)

此问题已在此处有答案

How do I POST JSON data with cURL?(31答案)
How to get POSTed JSON in Flask?(13个回答)
4个月前关闭。
我的login端点看起来像

@app.route('/login/', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        print request.form # debug line, see data printed below
        user = User.get(request.form['uuid'])
        if user and hash_password(request.form['password']) == user._password:
            login_user(user, remember=True)  # change remember as preference
            return redirect('/home/')
    else:
        return 'GET on login not supported'

当我使用curl对此进行测试时,GET调用如下所示

⮀ ~PYTHONPATH ⮀ ⭠ 43± ⮀ curl http://127.0.0.1:5000/login/
GET on login not supported

但是在POST上,我无法访问表单数据并获取HTTP 400

⮀ ~PYTHONPATH ⮀ ⭠ 43± ⮀ curl -d "{'uuid': 'admin', 'password': 'admin'}" http://127.0.0.1:5000/login/
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>400 Bad Request</title>
<h1>Bad Request</h1>
<p>The browser (or proxy) sent a request that this server could not understand.</p>

但是在服务器上,我的调试信息将打印以下内容

ImmutableMultiDict([("{'uuid': 'admin', 'password': 'admin'}", u'')])

在这里我做print request.form。我不明白我哪里做错了

cgvd09ve

cgvd09ve1#

您没有正确使用curl。试试这样:

curl -d 'uuid=admin&password=admin'

400 Bad Request错误是当您尝试从request.form获取不存在的键时的常见行为。
或者,使用request.json代替request.form,并像这样调用curl

curl -d '{"uuid":"admin","password":"admin"}' -H "Content-Type: application/json"
xj3cbfub

xj3cbfub2#

你仍然需要返回一个响应:

from flask import abort

@app.route('/login/', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        user = User.get(request.form['uuid'])

        if user and hash_password(request.form['password']) == user._password:
            login_user(user, remember=True)
            return redirect('/home/')
        else:
            return abort(401)  # 401 Unauthorized
    else:
        return abort(405)  # 405 Method Not Allowed

以下是自定义Flask错误页面的文档。
另外,看看Flask-Bcrypt的密码哈希。
您的CURL命令行无效。JSON对象需要在键和值周围使用双引号:

$ curl -d '{"uuid": "admin", "password": "admin"}' http://127.0.0.1:5000/login/

现在,您可以使用request.json访问密钥。

相关问题