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

标签 python django http flutter dart

我有一个正在运行的 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/

相关文章:

Python:如何优化函数参数?

javascript - 使用 Javascript 或 Jquery 将参数传递给 url

django+nginx+gunicorn 与 Cerbot 转换为 HTTPS 的问题

django - unicode'对象在Django中没有属性 'get'

http - Mule Read 超时异常

http - Node.js : How to do something on all HTTP requests in Express?

python - 验证用 python 签名的文件的问题

python - 使用脚本参数 ("env: No match."的 pycharm 远程调试问题)

python - 反向互补DNA

c# - 使用 .net MVC 为什么我的列表不能在帖子中保留下来?