gpt4 book ai didi

python - 将 session 从模板 View 传递到 python 请求 api 调用

转载 作者:太空狗 更新时间:2023-10-29 21:52:14 24 4
gpt4 key购买 nike

我想使用请求库从我的 Django TemplateView 进行多个内部 REST API 调用。现在我也想将 session 从模板 View 传递到 api 调用。在牢记性能的情况下,推荐的方法是什么。

现在,我正在从模板 View 中的当前 request 对象中提取 cookie,并将其传递给 requests.get()requests.post() 调用。但问题是,我必须将 request 对象传递给我的 API 客户端,这是我不想要的。

这是我用来路由我的请求的当前包装器:

def wrap_internal_api_call(request, requests_api, uri, data=None, params=None, cookies=None, is_json=False, files=None):
headers = {'referer': request.META.get('HTTP_REFERER')}
logger.debug('Request API: %s calling URL: %s', requests_api, uri)
logger.debug('Referer header sent with requests: %s', headers['referer'])
if cookies:
csrf_token = cookies.get('csrftoken', None)
else:
csrf_token = request.COOKIES.get('csrftoken', None)

if csrf_token:
headers['X-CSRFToken'] = csrf_token
if data:
if is_json:
return requests_api(uri, json=data, params=params, cookies=cookies if cookies else request.COOKIES, headers=headers)
elif not files:
return requests_api(uri, data=data, params=params, cookies=cookies if cookies else request.COOKIES, headers=headers)
else:
return requests_api(uri, data=data, files=files, params=params, cookies=cookies if cookies else request.COOKIES,
headers=headers)
else:
return requests_api(uri, params=params, cookies=cookies if cookies else request.COOKIES, headers=headers)

基本上我想摆脱那个 request 参数(第一个参数),因为要调用它我必须继续将 request 对象从 TemplateViews 传递到内部服务.另外,如何在多个调用之间保持持久连接?<​​/p>

最佳答案

REST 与直接调用 View

虽然网络应用程序可以对自身进行 REST API 调用。这不是 REST 的设计目的。考虑以下内容:https://docs.djangoproject.com/ja/1.9/topics/http/middleware/

Django Request Response Life Cycle

如您所见,django 请求/响应周期有相当多的开销。再加上网络服务器和 wsgi 容器的开销。在客户端,您有与请求库相关的开销,但稍等一下,客户端也恰好是同一个 Web 应用程序,因此它也成为 Web 应用程序开销的一部分。还有持久性问题(我很快就会谈到)。

最后但并非最不重要的一点是,如果您设置了 DNS 循环机制,您的请求实际上可能会在返回同一服务器之前通过网络发送出去。有一种更好的方法,即直接调用 View 。

不调用 rest API 调用另一个 View 真的很容易

 other_app.other_view(request, **kwargs)

这已在此处讨论过几次,例如 Django Call Class based view from another class based view。和 Can I call a view from within another view?所以我不会详细说明。

持久请求

持久性 http 请求(谈论 python 请求而不是 django.http.request.HttpRequest )是通过 session 对象管理的(同样不要与 django session 混淆)。避免混淆真的很难:

The Session object allows you to persist certain parameters across requests. It also persists cookies across all requests made from the Session instance, and will use urllib3's connection pooling. So if you're making several requests to the same host, the underlying TCP connection will be reused, which can result in a significant performance increase

对您的 django View 的不同点击可能来自不同的用户,因此您不希望内部 REST 调用重复使用相同的 cookie。另一个问题是 python session 对象不能在两次不同的 django View 命中之间持久化。套接字通常不能序列化,这是将它们放入 memcached 或 redis 的要求。

如果你仍然想坚持使用内部 REST

我认为@julian 的回答展示了如何避免将 django 请求实例作为参数传递。

关于python - 将 session 从模板 View 传递到 python 请求 api 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38442683/

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