如何在单个请求中禁用分页以获取资源下全部条目?
解决Eve启用分页时外部请求获取全量资源的方法
针对你遇到的问题,不用全局禁用分页,也不用自己写Flask端点重造轮子,有两个实用方案:
方案一:通过自定义钩子动态修改分页限制
Eve允许通过钩子在请求处理前临时调整资源的分页配置,你可以添加一个特殊的请求参数(比如fetch_all),当这个参数存在时,临时把当前资源的max_results设为一个足够大的值,从而返回全量数据,同时保留Eve的投影、数据库优化等功能。
具体实现步骤:
- 在你的Eve应用中添加
on_pre_GET钩子:
from eve import Eve def adjust_pagination(resource, request, lookup): # 检测请求是否携带fetch_all参数 if request.args.get('fetch_all') == 'true': # 临时将当前资源的max_results设为极大值(根据你的数据量调整) app.config['DOMAIN'][resource]['max_results'] = 999999 app = Eve() # 注册钩子 app.on_pre_GET += adjust_pagination if __name__ == '__main__': app.run()
- 外部请求时,只需带上
fetch_all=true参数,同时可以正常使用投影:GET /your-resource?fetch_all=true&projection={"_id":1}
这个方法的好处是,只有携带特定参数的请求才会返回全量数据,其他请求依然遵循原有分页规则,完全不影响正常业务。
方案二:利用资源级别的分页配置(静态设置)
如果某些资源确实经常需要获取全量数据,你可以在Eve的配置文件中,单独给该资源设置一个极大的max_results值,而不是全局修改:
# settings.py DOMAIN = { 'your-resource': { 'schema': {...}, 'max_results': 999999, # 单独给这个资源设置超大分页限制 }, 'other-resource': { 'schema': {...}, 'max_results': 25, # 其他资源保持默认分页 } }
不过这个方案是静态的,不如钩子灵活,适合固定需要全量获取的资源。
另外你提到设置max_results为0或-1无效,是因为Eve的内部逻辑会将这些非正数值重置为默认的max_results(通常是25),所以这种方式行不通。
内容的提问来源于stack exchange,提问作者tgm
相关产品推荐
相关产品推荐

