python - 谷歌云人才解决方案:如何使用 page_token
问题描述
我正在尝试使用 GCTS 的 v4beta1 - search_jobs()
有对参数的引用,pageToken
但在\google\cloud\talent_v4beta1\gapic\job_service_client.py
函数定义中没有这样的参数:
def search_jobs(
self,
parent,
request_metadata,
search_mode=None,
job_query=None,
enable_broadening=None,
require_precise_result_size=None,
histogram_queries=None,
job_view=None,
offset=None,
page_size=None,
order_by=None,
diversification_level=None,
custom_ranking_info=None,
disable_keyword_match=None,
retry=google.api_core.gapic_v1.method.DEFAULT,
timeout=google.api_core.gapic_v1.method.DEFAULT,
metadata=None,
):
在评论page_token
中提到 - 例如对于Offset
参数。
如何为职位搜索指定页面令牌?
我已指定require_precise_result_size=False
但返回值不包含SearchJobsResponse.estimated_total_size
. 这search_jobs()
是未设置为所需“模式”的线索吗?
解决方案
我相信 python 客户端库为您抽象出了 pageToken。如果您深入到源代码中 search_jobs 方法的末尾,您将看到它构建了一个知道 pageToken 和 nextPageToken 字段的迭代器:
iterator = google.api_core.page_iterator.GRPCIterator(
client=None,
method=functools.partial(
self._inner_api_calls["search_jobs"],
retry=retry,
timeout=timeout,
metadata=metadata,
),
request=request,
items_field="matching_jobs",
request_token_field="page_token",
response_token_field="next_page_token",
)
return iterator
因此,您需要做的就是以下内容 - 从https://googleapis.github.io/google-cloud-python/latest/talent/gapic/v4beta1/api.html的文档中复制:
from google.cloud import talent_v4beta1
client = talent_v4beta1.JobServiceClient()
parent = client.tenant_path('[PROJECT]', '[TENANT]')
# TODO: Initialize `request_metadata`:
request_metadata = {}
# Iterate over all results
for element in client.search_jobs(parent, request_metadata):
# process element
pass
# Alternatively:
# Iterate over results one page at a time
for page in client.search_jobs(parent, request_metadata).pages:
for element in page:
# process element
pass
默认页面大小显然是 10,您可以使用 pageSize 参数对其进行修改。页面迭代器文档可以在这里找到:
文档:https ://googleapis.github.io/google-cloud-python/latest/core/page_iterator.html
可能最简单的处理方法是使用所有结果
allResults = list(results_iterator)
如果您有大量数据并且不想一次性翻页,我会执行以下操作。“.pages”只是返回一个您可以照常使用的生成器。
resultsIterator = client.search_jobs(parent, request_metadata)
pages = resultsIterator.pages
currentPageIter = next(pages)
#do work with page
currentItem = next(currentPageIter)
currentPageIter = next(pages)
# etc...
当您用完项目或页面时,您需要捕获 StopIteration 错误:
https://anandology.com/python-practice-book/iterators.html
这就是为什么:
def _page_iter(self, increment):
"""Generator of pages of API responses.
Args:
increment (bool): Flag indicating if the total number of results
should be incremented on each page. This is useful since a page
iterator will want to increment by results per page while an
items iterator will want to increment per item.
Yields:
Page: each page of items from the API.
"""
page = self._next_page()
while page is not None:
self.page_number += 1
if increment:
self.num_results += page.num_items
yield page
page = self._next_page()
看看它在 yield 之后如何调用 _next_page?这将检查更多页面,然后为您执行另一个请求(如果存在)。
def _next_page(self):
"""Get the next page in the iterator.
Returns:
Page: The next page in the iterator or :data:`None` if
there are no pages left.
"""
if not self._has_next_page():
return None
if self.next_page_token is not None:
setattr(self._request, self._request_token_field, self.next_page_token)
response = self._method(self._request)
self.next_page_token = getattr(response, self._response_token_field)
items = getattr(response, self._items_field)
page = Page(self, items, self.item_to_value)
return page
如果您想要一个无会话选项,您可以使用偏移量 + 页面大小并在每个 ajax 请求上将当前偏移量传递给用户:
偏移量(整数)-</p>
可选的。一个整数,指定搜索结果中的当前偏移量(即起始结果位置,在 API 认为相关的工作中)。仅当 page_token 未设置时才考虑此字段。
例如,0 表示从第一个匹配的作业开始返回结果,10 表示从第 11 个作业返回。这可以用于分页,(例如,pageSize = 10 和 offset = 10 表示从第二页返回)。
推荐阅读
- java - 如何在 android 中的启动画面活动后开始登机活动?
- image - JPG 到 4 位彩色 COE/文本文件
- reactjs - 使用 docker 和 nginx 部署的 React 应用程序:/etc/nginx/conf.d/default.conf 与软件包不同
- powershell - PS:从文本文件创建多维数组 - Cisco Switch Config
- java - Spring 中未从 data.sql 加载初始数据
- reactjs - 如何使用酶笑话检查条件渲染?
- php - 无法使用 PhpSpreadsheet 读取 xlsx 文件
- xamarin.forms - 在 Xamarin.Forms 应用程序的后台使用 NSTextView
- r - 将拟合指数方程添加到 ggplot 2
- javascript - 如何将两个 JSON 对象组合在一起