为什么 flask session 在向它发出不同的帖子时不存储用户信息?
Why flask session didn't store the user info when making different posts to it from react?
我使用 Flask-RESTful 和几个反应模块写了几个 API 用于测试目的。理想情况下,如果我通过请求在会话中存储了一些信息,python 应该能够检测到即使在其他 API 带有代码的条目中是否存在这样的会话,例如
if session:
return jsonify({'user': session['username'], 'status': 2000})
return jsonify({'user': None, 'status': 3000})
但是,我遇到的问题是在一个请求中,比如说登录请求,session确实被正确使用了,username
也存储在了session中——例如,
from flask import session
...
# login API
class UserLoginResource(Resource):
@staticmethod
def post():
...
... # a user object (model) is defined
session['username'] = user.username
return jsonify({'status': 2000, 'user': session['username']})
使用此代码,它返回会话中的确切用户名,这意味着信息已存储。但是,当我从反应端向索引 API 发出另一个获取请求时,比如
from flask import session
...
# index API (without any practical use)
class IndexResource(Resource):
@staticmethod
def get():
if session:
return jsonify({'username': session['username']})
在这种情况下,响应是 None,因为 API 没有检测到任何会话。
// makePostRequest Function
makePostRequest = (e: any) => {
e.preventDefault()
const payload = {
'email': this.state.email,
'password': this.state.password
}
fetch('http://127.0.0.1:5000/api/login', {
method: 'POST',
headers: {
'Access-Control-Allow-Origin': '*',
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
}).then(res => res.json())
.then(res => {this.setState({
status: res['status'],
username: res['user']
})})
.catch(err => console.log(err))
}
这是我发出登录 post 请求的方式。如果登录成功,则returns状态码2000;如果状态码为2000,则表示程序已经执行完代码session['username']=_the_username_
。我应该能够在访问索引页面时从会话存储中提取用户名数据。
componentDidMount = () => {
fetch('http://127.0.0.1:5000/api')
.then(res => res.json())
.then(res => this.setState({
user: res['user'],
status: res['status']
}))
}
这就是我在主页模块上发出获取请求的方式。但是,user
总是 None 而 status
总是 3000
这可能只是session的使用不当,但我不知道如何在flask中真正正确的使用session。那么,这里的错误是什么?
更新:
所以,我在 class UserLoginResource(Resource)
中添加了一个 GET 请求,就像这样
class UserLoginResource(Resource):
@staticmethod
def post():
... # identical to the previous code
@staticmethod():
def get(): # url: http://127.0.0.1:5000/api/login
session['username'] = 'user_a'
return jsonify({'message': 'session set'})
然后我在 http://127.0.0.1:5000/api/login
的反应端发出了一个获取请求并得到了 message: session set
。然而,当 react 然后访问 http://127.0.0.1:5000/api
时,结果仍然是 status
3000 和 None 用户名。
然后,我直接访问 url http://127.0.0.1:5000/api/login
然后访问 http://127.0.0.1:5000/api
然后我们就得到了用户名 user_a
和状态 2000
。
所以,我认为这里的问题可能是后端没有识别出访问它的浏览器是同一个人,也可能是其他人。
另外,我检查了 componentDidMount
是否有问题,但不幸的是 componentDidMount
不是错误的来源——在我将它变成由 onClick
触发的正常函数后,它仍然没有工作。
如何解决这个问题?
fetch
默认不支持cookie,需要使用credentials: 'include'
启用
makePostRequest = (e: any) => {
e.preventDefault()
const payload = {
'email': this.state.email,
'password': this.state.password
}
fetch('http://127.0.0.1:5000/api/login', {
method: 'POST',
credentials: 'include',
headers: {
'Access-Control-Allow-Origin': '*',
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
}).then(res => res.json())
.then(res => {this.setState({
status: res['status'],
username: res['user']
})})
.catch(err => console.log(err))
}
使用 pip install flask-cors
在服务器上启用 cors
然后将其添加到 app.py
,您可以在此处初始化您的应用程序
from flask_cors import CORS
app = Flask(__name__)
CORS(app)
我使用 Flask-RESTful 和几个反应模块写了几个 API 用于测试目的。理想情况下,如果我通过请求在会话中存储了一些信息,python 应该能够检测到即使在其他 API 带有代码的条目中是否存在这样的会话,例如
if session:
return jsonify({'user': session['username'], 'status': 2000})
return jsonify({'user': None, 'status': 3000})
但是,我遇到的问题是在一个请求中,比如说登录请求,session确实被正确使用了,username
也存储在了session中——例如,
from flask import session
...
# login API
class UserLoginResource(Resource):
@staticmethod
def post():
...
... # a user object (model) is defined
session['username'] = user.username
return jsonify({'status': 2000, 'user': session['username']})
使用此代码,它返回会话中的确切用户名,这意味着信息已存储。但是,当我从反应端向索引 API 发出另一个获取请求时,比如
from flask import session
...
# index API (without any practical use)
class IndexResource(Resource):
@staticmethod
def get():
if session:
return jsonify({'username': session['username']})
在这种情况下,响应是 None,因为 API 没有检测到任何会话。
// makePostRequest Function
makePostRequest = (e: any) => {
e.preventDefault()
const payload = {
'email': this.state.email,
'password': this.state.password
}
fetch('http://127.0.0.1:5000/api/login', {
method: 'POST',
headers: {
'Access-Control-Allow-Origin': '*',
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
}).then(res => res.json())
.then(res => {this.setState({
status: res['status'],
username: res['user']
})})
.catch(err => console.log(err))
}
这是我发出登录 post 请求的方式。如果登录成功,则returns状态码2000;如果状态码为2000,则表示程序已经执行完代码session['username']=_the_username_
。我应该能够在访问索引页面时从会话存储中提取用户名数据。
componentDidMount = () => {
fetch('http://127.0.0.1:5000/api')
.then(res => res.json())
.then(res => this.setState({
user: res['user'],
status: res['status']
}))
}
这就是我在主页模块上发出获取请求的方式。但是,user
总是 None 而 status
总是 3000
这可能只是session的使用不当,但我不知道如何在flask中真正正确的使用session。那么,这里的错误是什么?
更新:
所以,我在 class UserLoginResource(Resource)
中添加了一个 GET 请求,就像这样
class UserLoginResource(Resource):
@staticmethod
def post():
... # identical to the previous code
@staticmethod():
def get(): # url: http://127.0.0.1:5000/api/login
session['username'] = 'user_a'
return jsonify({'message': 'session set'})
然后我在 http://127.0.0.1:5000/api/login
的反应端发出了一个获取请求并得到了 message: session set
。然而,当 react 然后访问 http://127.0.0.1:5000/api
时,结果仍然是 status
3000 和 None 用户名。
然后,我直接访问 url http://127.0.0.1:5000/api/login
然后访问 http://127.0.0.1:5000/api
然后我们就得到了用户名 user_a
和状态 2000
。
所以,我认为这里的问题可能是后端没有识别出访问它的浏览器是同一个人,也可能是其他人。
另外,我检查了 componentDidMount
是否有问题,但不幸的是 componentDidMount
不是错误的来源——在我将它变成由 onClick
触发的正常函数后,它仍然没有工作。
如何解决这个问题?
fetch
默认不支持cookie,需要使用credentials: 'include'
makePostRequest = (e: any) => {
e.preventDefault()
const payload = {
'email': this.state.email,
'password': this.state.password
}
fetch('http://127.0.0.1:5000/api/login', {
method: 'POST',
credentials: 'include',
headers: {
'Access-Control-Allow-Origin': '*',
'Content-Type': 'application/json'
},
body: JSON.stringify(payload)
}).then(res => res.json())
.then(res => {this.setState({
status: res['status'],
username: res['user']
})})
.catch(err => console.log(err))
}
使用 pip install flask-cors
然后将其添加到 app.py
,您可以在此处初始化您的应用程序
from flask_cors import CORS
app = Flask(__name__)
CORS(app)