在网页中导航成批结果的助手。

lazr.batchnavigator的Python项目详细描述


.BR/>此文件是LaZr.Basnavigigor的一部分。
BR/> LZR.Basnavigigor是免费软件:您可以重新分发它和/或BR/>根据GNU小通用公共许可证的条款修改它为BR/>由自由软件基金会发布的许可证第3版。
BR/>lazr.batchnavigator的发布是希望它会有用,但它没有任何保证;甚至没有对适销性或特定用途的适用性的隐含保证。有关详细信息,请参阅gnu less general public
许可证。

如果没有,请参见
<;http://www.gnu.org/licenses/>;



batch navigation
********



batch navigation通过提供指向结果的下一页、上一页和编号页的url链接,提供了在web
页中导航批结果的方法。

控制批处理的OST参数:

-备注:用于
批的位置的基础存储索引指针的记录。
-方向:指示备注是在批的开始还是结束。
-开始:示意-用于计算表观位置n(但请注意,
由于对批的重复访问的并发性质,
真实偏移量可能不同-但是集合不会跳过或显示两次
项。为了与保存的url兼容,如果memo和
方向都不存在,那么start用于将
列表切片到集合中。
-batch:控制每个批次显示的项目数。只有当它与创建批时设置的默认值不同时,才会出现



这些值可以在请求中重写,除非同时传递
force_start=true,这将使start参数(再次默认为0)
始终处于选中状态。

导入:从lazr.batchnavigator导入batchnavigator,listrangefactory从zope.publisher.browser导入testrequest从zope.publisher.http导入httpcharsets从zope.component导入getsitemmanager
>;>sm=getsitemanager()
>;>sm.registeradapter(httpcharsets)

>;>def build_request(query_string_args=none,method='get'):
…如果query_string_args为none:
…查询字符串=''
…其他:
…如果getattr(query_string_args,'items',none)不是none:
…query_string_args=查询_string_args.items()
…查询字符串="&;"。加入(
…[%s=%s%(k,v)表示查询字符串中的k,v参数]
…request=testrequest(服务器url='http://www.example.com/foo',
…方法=方法,
…environ={'query_string':query_string})
…request.processinputs()
…返回请求

虚拟请求对象:

>一些示例数据。

>;>;驯鹿=['dasher'、'dancer'、'prancer'、'vixen'、'comet'、
…'Cupid、Donner、Blitzen、Rudolph']

range\u factory
提供一个实现irangefactory的对象并管理此协议。
listrangefactory是一个简单的包含实现,如果没有range\u factory,batchnavigator将使用它。

…range_factory=listrangefactory(驯鹿))

简单地说:

>;>;安全驯鹿=驯鹿
>;>;安全驯鹿批次导航器=批次导航器(
…safe_reinder,build_request(),size=3)


lazr.batchnavigator的一个重要特性是它不愿意在底层数据集上调用len()。len()是一个昂贵的
操作,几乎没有什么好处,因此这个库试图避免调用len(),除非它是绝对必要的。为了显示这一点,我们将定义一个python列表类型的子类,当对其调用
len()时,该子类将爆炸。

>;>class listwithexplosivelen(list):
…""不喜欢调用其len()的列表子类。""
…定义长度(自身):
…引发运行时错误

除非另有说明,否则我们将在整个
测试期间仅使用此列表,以验证除非我们希望调用len(),否则不会调用它。

>>;>;explosive椆reinder=listwithexplosivelen(reinder)
>;>;reinder椆batch椆navigaTOR=批次导航器(
…爆炸驯鹿,build_request(),size=3)

batchnavigator实现ibatchnavigator。我们需要在这里使用
"安全"的批导航器,因为verify object探测它传递的对象的所有方法,包括从zope.interface.verify import verifyobject

>>>;,从lazr.batch navigator.interface s import ibatchnavigator

>;>verifyobject(ibatchnavigator,safe_reindeer_batch_navigator)
true

batchnavigator类提供ibatchnavigator工厂。这可用于将批次导航器工厂注册为实用程序,例如,从lazr.batch navigator.interfaces导入ibatchnavigatorfactory

>;>verifyobject(ibatchnavigatorfactory,batchnavigator)
true


igator对于当前显示的结果块
(例如,在zpt中迭代它们以进行呈现):

>;>;列表(驯鹿批导航器.currentbatch())
['dasher','dancer','prancer']

/>
>>>驯鹿批导航器.firstBatchURL()
'
>>>驯鹿批导航器.prevBatchURL()
'
>>>驯鹿批导航器.nextBatchURL()
'http://www.example.com/foo?memo=3&start=3'

E.COM/FOO?direction=backward&start=6'

>如果没有进一步的结果,则下一个链接将为空:

>;>;请求=生成请求({"开始":"3","批":"20"})
>;>;最后一个驯鹿批导航器=批导航器(驯鹿,请求=请求)
>;>;last_reindeer_batch_navigator.nextbatchurl()
"


即使我们从0
和批大小之间的某个点开始,第一个和上一个链接也应该出现:

>;>;request=build_request({"start":"2","batch":"3"})
>;>;last_reindeer_batch_navigator=batchnavigator(reindeer,request=request)

在这里,我们也可以看到batch参数作为url的一部分出现。
这是因为在创建批处理对象时请求的大小不同于默认值
,默认情况下为5。

>;last_驯鹿导航仪.firstbatchurl()
'http://www.example.com/foo?batch=3'

>;>last_reindeer_batch_navigator.prevBatchURL()
'http://www.example.com/foo?batch=3&direction=backwards&memo=2'

这都适用于其他值在查询字符串中:

>;>;请求=生成请求({'fnorb':'bar',
…'开始":"3",
…"批次':'3'})
>;>驯鹿,请求,大小=3)
>;>安全的驯鹿,请求,大小=3)



在这种情况下,我们创建了默认大小为"3"的batchnavigator,并且
请求正是询问每个批的项目数,因此,我们不需要将"批"显示为url的一部分。

>;驯鹿批导航或者使用"qs.firstBatchURL()
"http://www.example.com/foo?fnorb=bar'
>>>>驯鹿批导航器带qs.prevbatchurl()
'http://www.example.com/foo?fnorb=bar&;direction=backwards&;memo=3'
>;>>驯鹿批次导航器,带有qs.nextBatchUrl()
'http://www.example.com/foo?fnorb=bar&;memo=6&start=6'

(同样,如果不知道整个列表的大小,就无法获取最后一批。)


>;>;安全的驯鹿批导航器,使用http://www.example.com/foo?fnorb=bar&;direction=backwards&;start=6'

"force\u start"参数允许忽略
请求中的起始值。例如,当筛选器已更改,并且
所需的行为是在0重新启动时,这可能很有用。

>;
驯鹿,请求,大小=3,force_start=true)
>;>reindeer_batch_navigator_with_qs.currentbatch().start
0
>;>reindeer_batch_navigator_with_qs.nextbatchurl()
'http://www.example.com/foo?fnorb=bar&;memo=3&start=3'
>;>>驯鹿[:3]==列表(驯鹿批导航器带有qs.currentbatch())
true


我们确保对后期操作也遵守url中提供的批参数


>;请求=生成请求({'fnorb':‘酒吧’,
…开始":"3",
…"批处理':'3'},method='post')
>;>>驯鹿批处理导航器批处理,qs=batch navigator(
…驯鹿,请求)

fnorb=bar&batch=3&memo=6&start=6'

首选第一个。

>;>;请求=生成请求(
…[("batch","1"),("batch","7"),("start","2"),("start","10")])
>;>gt;navigator=batchnavigator(驯鹿,请求=请求)
>;>gt;navigator.nextbatchurl()
'http://www.example.com/foo?batch=1&memo=3&start=3'

batch参数必须为正。忽略其他数字,而是使用默认批大小。


>>>;from cgi import parse-qs
>;>;request=build-request({'batch':'0})
>;>;navigator=batchnavigator(range(99),request=request)
>;>;print'batch'in parse_qs(navigator.nextbatchurl())
false

>;>;request=build_request({'batch':'-1'})
>;>;navigator=batchnavigator(range(99),request=request)
>;>;在parse_qs(navigator.nextbatchurl())中打印"batch"


=======
空批次
===


无,生成请求(),大小=3)
>;。>;空的批次导航器。firstBatchUrl()
'
>>>空的批次导航器。nextBatchUrl()
'
>>>空的批次导航器。prevBatchUrl()
'
>>>空的批次导航器。lastBatchUrl()

>>>空的批次导航器。TOR=批次导航器(
…[],build_request(),size=3)
>;>null_batch_navigator.firstbatchurl()
'
>;>null_batch_navigator.nextbatchurl()
'
>;>null_batch_navigator.prevbatchurl()
>;>null_batch_navigator.lastbatchurl()








>待办事项:

-在开始时间超出结束时间时炸毁
-孤儿
-重叠


一个不受欢迎的支持结果,不受欢迎的支持结果,不受欢迎的支持结果,不受欢迎的支持结果,不受欢迎的支持结果,不受欢迎的支持结果,不受欢迎的支持结果,不受欢迎的支持结果,不受欢迎的支持结果,不受欢迎的支持结果,不受欢迎,不受欢迎的支持结果,不受欢迎,不受欢迎的影响,br/>





一些result对象不实现len,因为通常python代码假定len是廉价的。例如,sqlobject和storm结果集都有这种
行为,因此获取长度是一个非常简单的操作。要支持这些对象,批处理将在结果集上查找"len"。如果
它不存在,它会将结果调整为
zope.interface.common.sequence.ifinitesequence,并使用该结果集(对象):

定义初始化(自我,结果):
…self.stub_results=结果
…定义计数(自身):
…#假设这实际上返回了
…返回len(self.stub_results)
…定义获取项(self,ix):
…返回self.stub_results[ix]也适用于切片
…定义(自我):
…从zope返回iter(self.stub_results)

>>>;。接口导入实现从zope执行
>;。组件导入适配器,从zope.interface.common.sequence导入ifinitesequence
>;>;类示例适配器(检查pleresultset):
…改编(例如resultset)
…实现(ifinitesequence)
…定义长度(自身):
…返回self.stub_results.count()

>;>;sm=getsitemanager()
>;>;sm.registeradapter(示例适配器)
>;>;example=exampleResultset(安全驯鹿)
>;>;example=batchNavigator=batchNavigator(
…例如,build_request(),size=3)
只获取结果的一部分,而不是访问整个结果。

>;>>类ExampleResultSet(ExampleResultSet):
…定义初始化(自我,结果):
…超级(例如resultset,self)。\uu init(结果)
…self.getitem_历史记录=[]
…定义获取项(self,ix):
…self.getitem_history.append(ix)
…返回super(exampleResultSet,self)。\uGetitem(ix)



>;example=exampleResultSet(驯鹿)
>;>example=batchNavigator=batchNavigator(
…例如,build_request(),size=3)
>;>比需要的多一个项目。这是为了方便
确定给定批次是否是列表中的最后一个批次,
无需显式查找列表的长度
(可能是一个昂贵的操作)。


==
==添加回调函数
==
==

==有时,在确定批处理值后,使用批处理值调用函数是很有用的。如果
是需要对每个批执行的后续查询,
则会出现这种情况,并且对于整个结果集中的
每个值执行查询是不可取的或代价过高的。

回调函数必须定义两个参数。第一个是
batch navigator对象本身,第二个是当前批。
构造
batchnavigator并确定当前批时,只调用一次回调函数。

对于批量项目:
…打印项目

>>>驯鹿批次导航器=批次导航器(
…驯鹿,构建请求(),大小=3,回调=打印回调)
dasher
dancer
prancer

>;>;请求=构建请求({"开始":"3","批":"20"})
>;>;最后一个驯鹿批导航器=批导航器(
…驯鹿,请求=请求,回调=打印回调)
vixen
comet
cupid
donner
blitzen
rudolph

OWS添加额外的成员变量。当batchnavigator成为批处理的页面模板
中的上下文时,这将非常有用。

>;>;类reindeerview:
…def constructureIndeerFromatoms(self、context、batch):
…#一些明显缓慢的过程
…view.build_reindeer=列表(批)
…def batchedReinder(自):
…返回BatchNavigator(
…驯鹿,构建请求(),大小=3,
…回调=self.constructReindeerRomatoms)

>;>;view=ReindeerView()
>;>;批处理导航器=view.batchedReindeer()
>;>;打印视图。已生成的驯鹿
['dasher','dancer','prancer']
>;>;打印列表(批处理导航器.currentbatch()
['dasher'、'dancer'、'prancer']

========
最大批大小
==========


由于批大小在url中公开,因此用户可以调整批参数以检索更多结果。由于这可能会
潜在地耗尽服务器资源,因此对批
大小设置了上限。如果请求的批处理参数高于此值,则会引发一个
InvalidBatchSizeRor错误。

>>gt;类DemoBatchNavigator(BatchNavigator):
…最大批处理大小=5

>;>request=build\u request({"start":"0","batch":"20"})
>;>demobatchnavigator(驯鹿,request=request)
回溯(最近的最后一次调用):

invalidBatchSizeRor:"batch"参数的最大值为5。

==
url参数
==

==



通常,在当前页面的url中传递的任何参数都会在批处理导航器的链接中复制。"transient"参数是指仅与当前页请求相关且不应传递给后续页请求的参数。


……安静":"ssht",
…"嘈杂的':'你好',
…}

>;>request_with_parameters=build_request(request_parameters)

一个参数"quiet"是暂时的。还有一个名为"absent"的临时
参数,但它没有在我们正在进行的页面
请求中传递。飞行员(名单):
…返回BatchNavigator(
…列表,带有参数的请求,大小=3,
…瞬态导航参数=['quiet','absent'])
>;>navigator_with_parameters=build_navigator(驯鹿)
>;>safe_navigator_with_parameters=build_navigator(驯鹿)

_parameters.nextBatchUrl()
'http://www.example.com/foo?noisy=hello&memo=3&start=3'
>>gt;带参数的安全导航器。lastbatchurl()
'http://www.example.com/foo?noisy=hello&direction=backwards&start=6'


省略了瞬态参数,而一开始从未传入的参数也不会神奇地出现。


=======

BatchNavigator的heading属性包含要显示的对象的描述。


>;>;安全驯鹿批次导航器。heading
"结果"


=batch navigator(['only-one',request=request)
>;>navigator.heading
'result'

(accessing.heading导致在基础列表中调用len(),
这就是为什么我们必须使用安全的批导航器的原因。理论上,这个
是可以优化的,但没有实际意义,因为标题总是
前面加上基本列表的实际长度,
例如"10个结果"。因为len()无论如何都会被调用,并且其值是缓存的,所以第二个len()不会影响性能。)


批次导航将根据批次中的总项目返回相应的
标题。

>>;>;navigator=batchnavigator(安全驯鹿,请求=请求)
>;>;navigator.setheadings('bug','bugs')
>;>;navigator.heading
'bugs'
>;>;navigator=batchnavigator(['only-one'],request=request)
>>gt>gt;navigator.setheadings('bug,'bug,'bugs')
>>gt;navigator.heading
'bug'

(清理)
(清理)

>
>gt>gt;sm.unregisteradapter(httpcharset)unregister(httpcharset)
true
>true
>true
>true
>true
>true

>true

>true



===================是的s
==


toctree::
:glob:

*
docs/*

============================
NEWS for lazr.batchnavigator
============================

1.2.11 (2015-04-09)
===================

- Save a query if the slice is of the form [x:x].

1.2.10 (2011-09-14)
===================

- delegate the calc将结果集的大致长度计算为
irangefactory.


1.2.9(2011-08-25)
====


-当向后批处理开始太短,并且添加了结果集中的另一个块
时,已切片的批处理列表()不再为已检索的块使用备注值。

参数开始确定上一个/下一个批次是否存在;不依赖len(result set)并确定批次的实际大小。


-避免空结果集上的负开始索引。


1.2.7(2011-07-18)
====br/>

-仅通过t的
范围工厂。

1.2.6(2011-07-28)
======


-修复了在处理返回的元素少于预期的向后批处理时的错误。
-url编码batchnavigator.generatebatchrl()

1.2.5(2011-07-13)
==
==

==-允许用一个前缀更改所有变量名。


1.2.4(2011-04-11)
==
==


-允许重写determinesize以控制如何在子类中确定批默认值和具体的大小。
-列表IFY(切片后)而不是假设成批切片将遵守完整的列表协议。


1.2.3(2011-04-06)
==
==


-添加irangefactory和使用后端数据库提示高效检索页面的能力。

-删除terribl对GetBatchUrls方法进行扩展。


1.2.2(2010-08-19)1.2.2(2010-08-08-19)1.2.2(2010-08-08-19)1.2.2(2010-08-08-19)1.2.2


-使len()在当前批是最后一批(或仅
批)时调用变得便宜;br/>



















-避免在生成导航器时调用len len len 1.2.1.2.1(2010/>-修复以前对批进行



1.2.0(2010-08-05)迭代时批的len()中的错误
==


-尽可能避免在底层序列上调用len()
-当批超出范围


1.1.1(2010-0)时不返回endnumber5-10)
=

>
-忽略负批量



>1.1(2009-08-08-31)
=
>1.1(2009-08-08-31)1.1(2009-08-08-08-31)1.1(2009-08-08-31)1.1(2009-08-08-31)1.1






=
=
=





=========br/>




=>1.1.1(2009-08-08-31)
===

-初始rpypi上的elease

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
另一个布局上的java Access文本视图   安卓在Java中,我什么时候应该用*导入整个包,而不是从包中导入单个对象?   JavaSpringMVC:请解释@RequestParam和@ModelAttribute之间的区别   java Flyway Ant构建未迁移   java“没有可供下载的文件”   如何解决java静态名称冲突?   我是否需要框架来补充JavaEE6、JSF2 WebApp?哪一个?   java如何传递HttpServletRequest参数?   只有java的视频不会播放声音。为什么?   java在Maven3中做这样的属性重写工作吗?   java计算Android中两个标记之间的距离   Javascript页面加载中的java复选框持久性问题   java序列化lambda函数的映射   java使用jersey、maven和eclipse配置swagger   java我可以在oncreate方法之外使用setContentView吗?   java在使用JAXRS响应类返回实体时遇到异常   java规范了加密和解密文本的文本编写方法   java如何更改ChoiceBox的默认大小?   java在Android上暂时禁用PIN/密码锁