Python 3.x 为什么flask session没有';从react向其发送不同帖子时,是否存储用户信息?

Python 3.x 为什么flask session没有';从react向其发送不同帖子时,是否存储用户信息?,python-3.x,session,web,flask,flask-restful,Python 3.x,Session,Web,Flask,Flask Restful,出于测试目的,我使用Flask RESTful和几个react模块编写了几个API。理想情况下,如果我通过一个请求在会话中存储了一些信息,python应该能够检测到是否存在这样的会话,即使是在其他API条目中,比如 if会话: 返回jsonify({'user':会话['username'],'status':2000}) 返回jsonify({'user':None,'status':3000}) 然而,我遇到的问题是在单个请求中,比如登录请求,会话确实被正确使用,username也存储在会

出于测试目的,我使用Flask RESTful和几个react模块编写了几个API。理想情况下,如果我通过一个请求在会话中存储了一些信息,python应该能够检测到是否存在这样的会话,即使是在其他API条目中,比如

if会话:
返回jsonify({'user':会话['username'],'status':2000})
返回jsonify({'user':None,'status':3000})
然而,我遇到的问题是在单个请求中,比如登录请求,会话确实被正确使用,
username
也存储在会话中——例如

来自flask导入会话的

...
#登录API
类UserLoginResource(资源):
@静力学方法
def post():
...
... # 定义了一个用户对象(模型)
会话['username']=user.username
返回jsonify({'status':2000,'user':session['username']})
使用这段代码,它从会话返回了准确的用户名,这意味着信息被存储。然而,当我从react端向索引API发出另一个get请求时,比如

来自flask导入会话的

...
#索引API(无任何实际用途)
类索引资源(资源):
@静力学方法
def get():
如果会议:
返回jsonify({'username':会话['username']})
在本例中,响应为None,因为API没有检测到任何会话

//makePostRequest函数
makePostRequest=(e:any)=>{
e、 预防默认值()
常数有效载荷={
“电子邮件”:this.state.email,
“密码”:this.state.password
}
取('http://127.0.0.1:5000/api/login', {
方法:“POST”,
标题:{
“访问控制允许来源”:“*”,
“内容类型”:“应用程序/json”
},
正文:JSON.stringify(有效负载)
}).then(res=>res.json())
.then(res=>{this.setState({
状态:res['status'],
用户名:res['user']
})})
.catch(err=>console.log(err))
}
这是我发出登录post请求的方式。如果登录成功,返回状态码2000;如果状态代码为2000,则表示程序已通过代码
会话['username']=\u用户名
。当访问索引页面时,我应该能够从会话存储中提取用户名数据

componentDidMount=()=>{
取('http://127.0.0.1:5000/api')
.then(res=>res.json())
.然后(res=>this.setState({
用户:res['user'],
状态:res['status']
}))
}
这是我在主页模块上发出get请求的方式。但是,
用户
始终为无,
状态
始终为3000

这可能只是会话的不当使用,但我不知道如何在flask中正确使用会话。那么,这里的错误是什么


更新: 因此,我在
类UserLoginResource(Resource)
中添加了一个GET请求,如下所示

class UserLoginResource(资源):
@静力学方法
def post():
... # 与前面的代码相同
@staticmethod():
def get():#url:http://127.0.0.1:5000/api/login
会话['username']='user\u a'
返回jsonify({'message':'sessionset'})
我在react侧向
http://127.0.0.1:5000/api/login
并获得
消息:会话集
。但是,当react被访问时
http://127.0.0.1:5000/api
,结果仍然是
状态
3000,没有用户名。 然后,我直接访问了url
http://127.0.0.1:5000/api/login
然后访问
http://127.0.0.1:5000/api
我们有了用户名
user\u a
和状态
2000
。 因此,我认为这里的问题可能是后端无法识别访问它的浏览器是同一个人,或者可能是其他人。 此外,我还检查了
componentDidMount
是否有问题,但不幸的是
componentDidMount
不是错误的来源-在我将其转换为由
onClick
触发的正常函数后,它仍然不起作用。
如何修复此问题?

fetch
默认情况下不支持cookie,您需要使用
凭据启用它:“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安装烧瓶cors在服务器上启用cors

然后将其添加到
app.py
,在那里初始化应用程序

from flask_cors import CORS 
app = Flask(__name__) 
CORS(app)

默认情况下,
fetch
不支持cookie,您需要使用
凭据:“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安装烧瓶cors在服务器上启用cors

然后将其添加到
app.py
,在那里初始化应用程序

from flask_cors import CORS 
app = Flask(__name__) 
CORS(app)

您使用什么来调用api?将该代码添加到您的问题中。@waynetech是的。我刚刚添加了react代码。您使用什么来调用api?将该代码添加到您的问题中。@waynetech是的。我刚刚添加了react代码。对于get和post请求?好的,console.log告诉我,如果添加了
Credentials:'include'
,那么在标题中也要将“Access Control Allow Credentials”设置为true,因为CORsand要澄清,在响应中要将标题“Access Control Allow Credentials”设置为true,哪一个是服务器端而不是反应端。检查答案,我已经添加了为get和post请求启用CORSFO的步骤?好的,console.log告诉我,如果添加了
Credentials:'include'
,则在标题中也要将“Access Control Allow Credentials”(访问控制允许凭据)设置为true,因为CORsand需要澄清,这是为了在响应中将标题“Access Control Allow Credentials”设置为true,这是服务器端而不是响应端。检查答案,我添加了启用cors的步骤