我的React/Flask应用程序以一种方式获取我的JSON,而不是另一种



我有这段代码工作得很好(前端没有弄清楚,但它的工作是注册用户和更新我的数据库)

export default class APIService {
static RegisterUser(username, email, password, base_city, about_me) {

return fetch(`/register`, {
'method':'POST',
mode: 'cors',
headers: {
'Content-Type':'application/json'
},
body: JSON.stringify(username, email, password)
})
.then(resp => window.location.href = "login")
.catch(error => console.log(error, "Not In the APIService"))
}

从app.py


@app.route("/register", methods=['POST'])
def register():
username = request.json['username']
email = request.json['email']
password = request.json['password']
base_city = request.json['base_city']
about_me = request.json['about_me']
hashed_password = bcrypt.generate_password_hash(password)
user = User(username=username, email=email, password=hashed_password, base_city=base_city, about_me=about_me)
db.session.add(user)
db.session.commit()

我理解它的方式是,我传递一堆信息到RegisterUser函数,它把它变成一个JSON,然后在后台它需要的信息,并将其上传到数据库。

在我遇到问题的下一个函数中,我想根据输入的usernamepassword登录用户:

const logitin = async ({ username, password }) => {
try {
await fetch(`/userlookup`, {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(username, password),
});
return console.log('logitin', username, password);
} catch (error) {
console.log("error time!", username, password);
return false;
}
};
logitin({username, password})

我认为这会获取用户名和密码,将其转换为JSON对象并将其发送到我的app.py中:

@app.route("/userlookup", methods=['GET','POST'])
def userlookup():
username = request.json['username']
password = request.json['password']
hashed_password = bcrypt.generate_password_hash(password)
user = User.query.filter_by(username=username).first()
print(username)
if user and bcrypt.check_password_hash(user.password, password):
print('youre in')
login_user(user)
return username
else:
print('tripped')

在这里,我希望它从JSON对象中获取usernamepassword项,并分别为它们分配usernamepassword变量,并最终检查它们是否都在数据库中。

当我运行这个,我得到这个错误:

File "/home/ionic_apps/pobblebonk/backend/app.py", line 136, in userlookup
username = request.json['username']
TypeError: string indices must be integers

我很困惑,因为当我在/register路由中使用完全相同的语法时,它似乎没有得到username = request.json['username']行,它似乎理解了这一点。知道为什么吗?

编辑:

包括完整的回溯

127.0.0.1 - - [16/Sep/2021 09:07:47] "POST /userlookup HTTP/1.1" 500 -
Traceback (most recent call last):
File "/home/ionic_apps/pobblebonk/venv/lib/python3.8/site-packages/flask/app.py", line 2464, in __call__
return self.wsgi_app(environ, start_response)
File "/home/ionic_apps/pobblebonk/venv/lib/python3.8/site-packages/flask/app.py", line 2450, in wsgi_app
response = self.handle_exception(e)
File "/home/ionic_apps/pobblebonk/venv/lib/python3.8/site-packages/flask_cors/extension.py", line 165, in wrapped_function
return cors_after_request(app.make_response(f(*args, **kwargs)))
File "/home/ionic_apps/pobblebonk/venv/lib/python3.8/site-packages/flask/app.py", line 1867, in handle_exception
reraise(exc_type, exc_value, tb)
File "/home/ionic_apps/pobblebonk/venv/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/home/ionic_apps/pobblebonk/venv/lib/python3.8/site-packages/flask/app.py", line 2447, in wsgi_app
response = self.full_dispatch_request()
File "/home/ionic_apps/pobblebonk/venv/lib/python3.8/site-packages/flask/app.py", line 1952, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/ionic_apps/pobblebonk/venv/lib/python3.8/site-packages/flask_cors/extension.py", line 165, in wrapped_function
return cors_after_request(app.make_response(f(*args, **kwargs)))
File "/home/ionic_apps/pobblebonk/venv/lib/python3.8/site-packages/flask/app.py", line 1821, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/home/ionic_apps/pobblebonk/venv/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
raise value
File "/home/ionic_apps/pobblebonk/venv/lib/python3.8/site-packages/flask/app.py", line 1950, in full_dispatch_request
rv = self.dispatch_request()
File "/home/ionic_apps/pobblebonk/venv/lib/python3.8/site-packages/flask/app.py", line 1936, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/ionic_apps/pobblebonk/backend/app.py", line 136, in userlookup
username = request.json['username']
TypeError: string indices must be integers

不知道为什么你的注册路由工作是诚实的,但你需要为你的JSON创建一个对象。像下面这样字符串化:

static RegisterUser(username, email, password, base_city, about_me) {

return fetch(`/register`, {
'method':'POST',
mode: 'cors',
headers: {
'Content-Type':'application/json'
},
body: JSON.stringify({ username, email, password })
})
.then(resp => window.location.href = "login")
.catch(error => console.log(error, "Not In the APIService"))
}

和登录

const logitin = async ({ username, password }) => {
try {
await fetch(`/userlookup`, {
method: "POST",
mode: "cors",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ username, password }),
});
return console.log('logitin', username, password);
} catch (error) {
console.log("error time!", username, password);
return false;
}
};
logitin({username, password})

否则JSON将是一个字符串。

最新更新