【发布时间】:2016-11-21 09:54:51
【问题描述】:
我想使用请求库从我的 Django TemplateView 进行多个内部 REST API 调用。现在我也想将会话从模板视图传递到 api 调用。考虑到性能,推荐的方法是什么。
现在,我正在从模板视图中的当前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 传递给内部服务。另外,如何在多个调用中保持持久连接?
【问题讨论】:
-
几个问题:您是如何接收数据的?您一般想要完成什么?这些是出站 API 调用吗?你需要传递整个会话对象吗?似乎是一个不寻常的用例,但我需要看到更大的图景。您能否解释一下要完成的工作。谢谢。
-
@mariodev:我有一个 Django TemplateView。我想收集数据以放入该视图的上下文中。为此,我将调用一个 REST API,它再次出现在我的应用程序中。但是进行 REST API 调用将是一个新调用,因此如果我不通过
cookie,那么session将与我不想要的 TemplateView 中的不同。基本上我想保持身份验证对内部 API 调用有效。 -
@mariodev:
data只是一个 python 字典。 -
每当处理 api 请求时,最好为 auth 传递令牌(在这种情况下,像 JWT 这样的东西应该可以工作)。虽然我仍然很困惑,你为什么要使用 api 调用?为什么不直接使用指向接收端点的内部函数或类方法呢?正如您声称的那样,您只在内部使用它,所以我认为没有必要调用 api 真的..
-
您是否有理由不能只从视图中调用其余 API 函数并将数据传递给您的模板上下文? Django 在请求、视图、模板、响应的循环中运行。您正在尝试在此处添加一个步骤,并使其请求、视图、模板、视图、响应,这从来都不是堆栈的设计方式。