gpt4 book ai didi

python - 对于flutter/dart http.Client()不能持久连接

转载 作者:行者123 更新时间:2023-12-03 03:37:49 25 4
gpt4 key购买 nike

我有一个正在运行的 django服务器,可与 session 一起使用。下面是我的 views.py 中的一个简单示例,该示例足以重现我的问题:

def test(request):
print("Session objects(")
for k,v in request.session.items():
print(k,v)
print(")")
request.session["a"] = "b"

因此,这仅会打印当前 session 中的所有内容,然后在 session 中保存一些虚拟数据。如果我第一次通过浏览器访问此文件,则输出为
Session objects(
)

因此该 session 是空的,正如预期的那样。然后,刷新站点后,输出为:
Session objects(
a b
)

也符合预期,因此一切似乎都正常。

但是现在我想在我的flutter应用程序中使用该网站。为此,我使用了如下的fluck packacke import 'package:http/http.dart' as http:
var client = http.Client();

String host = ...; // just the ip:port to my host

void my_request() async {
var response = await client.get(host + "/path/to/test/");
response = await client.get(host + "/path/to/test/");
}

因此,就像我以前手动在浏览器中所做的一样,此操作应该两次请求我的网站。但是现在我的服务器记录了两次:
Session objects(
)

因此,很明显,客户端具有一个不持久的连接,其中未保留 session 。但是根据doc https://pub.dev/packages/http,这应该可以工作

If you're making multiple requests to the same server, you can keep open a persistent connection by using a Client rather than making one-off requests



这是我的flutter / dart应用程序出现问题还是服务器上的问题? flutter 包装中的包装可能很大吗?

注意:我首先认为这可能是csrf身份验证的问题,因此请在我的服务器上将其停用,但这并不会改变任何内容...

最佳答案

您不需要第三方库。这是相当少量的代码。因此,在第一个授权请求之后,服务器将使用set-cookie键下的响应头中的cookie进行响应。从开始到set-cookie字符的第一次出现,有用的信息在;键的值中(稍后会对此进行更多介绍)。例如,set-cookie的值可能看起来像这样:

sessionid=asfweggv7bet4zw11wfpb4u415yx; expires=Fri, 06 Nov 2020 11:14:40 GMT;
您需要保存它,并在每次下一个授权请求中都使用它。
为了保存它,我创建了一个方法,您应该在第一个授权响应之后调用该方法。您可以在每个响应之后调用它(如果您具有通用响应处理),因为如果服务器未发送新的cookie,它将不会与现有的cookie混淆。
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
const kCookie = 'my_fancy_cookie';
// ...
void _storeCookie(http.Response response) async {
String rawCookie = response.headers['set-cookie'];
if (rawCookie != null) {
int index = rawCookie.indexOf(';');
String cookie = (index == -1) ? rawCookie : rawCookie.substring(0, index);
await FlutterSecureStorage().write(key: kCookie, value: cookie);
}
}
然后,在发送请求之前,我将cookie添加到标题中:
// endpoint, payload and accessToken are defined earlier
cookie = await FlutterSecureStorage().read(key: kCookie);
http.Response response = await http.post(
endpoint,
body: json.encode(payload),
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer ' + accessToken,
'cookie': cookie,
}
);
记得注销后从安全存储中清除cookie。 :)
***-服务器可能会更改 session ID(以减少我们不需要考虑的诸如clickjacking之类的事情),因此最好继续从每个响应中提取cookie。

关于python - 对于flutter/dart http.Client()不能持久连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59612359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com