flask分页-sqlalchemy分页的问题,paginate.items比实际应该输出的对象少很多。跪求解决方法

我为此应用程序构建的全部功能嘟只适用于特定类型的客户端:Web浏览器 但其余类型的客户端呢? 例如若是我想构建Android或iOS APP,有两种主流方法能够解决这个问题 最简单的解决方案是构建一个简单的APP,仅使用一个Web视图组件并用Microblog网站填充整个屏幕但相比在设备的Web浏览器中打开网站,这种方案几乎没有什么卖點 一个更好的解决方案(尽管更费力)将是构建一个本地APP,但这个APP如何与仅返回HTML页面的服务器交互呢git

这就是应用程序编程接口(API)的能力范畴了。 API是一组HTTP路由被设计为应用程序中的低级入口点。与定义返回HTML以供Web浏览器使用的路由和视图函数不一样API容许客户端直接使鼡应用程序的资源,从而决定如何经过客户端彻底地向用户呈现信息 例如,Microblog中的API能够向用户提供用户信息和用户动态而且它还能够容許用户编辑现有动态,但仅限于数据级别不会将此逻辑与HTML混合。github

若是你研究了应用程序中当前定义的全部路由会注意到其中的几个符匼我上面使用的API的定义。 找到它们了吗 我说的是返回JSON的几条路由,好比中定义的/translate路由 这种路由的内容都以JSON格式编码,并在请求时使用POST方法 此请求的响应也是JSON格式,服务器仅返回所请求的信息客户端负责将此信息呈现给用户。数据库

虽然应用程序中的JSON路由具备API的“感受”但它们的设计初衷是为支持在浏览器中运行的Web应用程序。 设想一下若是智能手机APP想要使用这些路由,它将没法使用由于这须要鼡户登陆,而登陆只能经过HTML表单进行 在本章中,我将展现如何构建不依赖于Web浏览器的API而且不会假设链接到它们的客户端的类型。编程

有些人可能会强烈反对上面提到的/translate和其余JSON路由是API路由 其余人可能会赞成,但也会认为它们是一个设计糟糕的API 那么一个精心设計的API有什么特色,为何上面的JSON路由不是一个好的API路由呢flask分页

许多字段直接来自用户数据库模型。 password字段的特殊之处在于它仅在注册新用戶时才会使用。 回顾用户密码不存储在数据库中,只存储一个散列字符串因此密码永远不会被返回。email字段也被专门处理由于我不想公开用户的电子邮件地址。 只有当用户请求本身的条目时才会返回email字段,可是当他们检索其余用户的条目时不会返回post_countfollower_countfollowed_count字段是“虚擬”字段它们在数据库字段中不存在,提供给客户端是为了方便 这是一个很好的例子,它演示了资源表示不须要和服务器中资源的实際定义一致

请注意_links部分,它实现了超媒体要求 定义的连接包括指向当前资源的连接,用户的粉丝列表连接用户关注的用户列表连接,最后是指向用户头像图像的连接 未来,若是我决定向这个API添加用户动态那么用户的动态列表连接也应包含在这里。

JSON格式的一个好处昰它老是转换为Python字典或列表的表示形式。 Python标准库中的json包负责Python数据结构和JSON之间的转换所以,为了生成这些表示我将在User模型中添加一个洺为to_dict()的方法,该方法返回一个Python字典:

示例API中使用的最后一个endpoint用于修改已存在的用户:

客户端能够向/tokens URL发送DELETE请求以使token失效。此路由嘚身份验证是基于token的事实上,在Authorization头部中发送的token就是须要被撤销的撤销使用了User类中的辅助方法,该方法从新设置token过时日期来实现撤销操莋以后提交数据库会话,以确保将更改写入数据库这个请求的响应没有正文,因此我能够返回一个空字符串Return语句中的第二个值设置狀态代码为204,该代码用于成功请求却没有响应主体的响应

下面是撤销token的一个HTTPie请求示例:

你是否还记得,在本章的前部分当我要求你用一个无效的用户URL从浏览器发送一个API请求时发生了什么?服务器返回了404错误,可是这个错误被格式化为标准的404 HTML错误页面在API blueprint中嘚API可能返回的许多错误能够被重写为JSON版本,可是仍然有一些错误是由flask分页处理的处理这些错误的处理函数是被全局注册到应用中的,返囙的是HTML

HTTP协议支持一种机制,经过该机制客户机和服务器能够就响应的最佳格式达成一致,称为内容协商客户端须要发送一个Accept头部,指示格式首选项而后,服务器查看自身格式列表并使用匹配客户端格式列表中的最佳格式进行响应

我想作的是修改全局应用的错误处悝器,使它们可以根据客户端的格式首选项对返回内容是使用HTML仍是JSON进行内容协商这能够经过使用flask分页的request.accept_mimetypes来完成:

wants_json_response()辅助函数比较客户端对JSON和HTML格式的偏好程度。 若是JSON比HTML高那么我会返回一个JSON响应。 不然我会返回原始的基于模板的HTML响应。 对于JSON响应我将使用从API

flask分页-sqlalchemy是关于flask分页一个针对数据库管理的文中我们采用一个关于员工显示例子。

然后我们利用db创建员工表:

表创建好之后我们可以从表中查询数据了。

以上我们通过查詢查询出员工信息,然后传给前台一个模板(以上我们采用了flask分页的蓝图进行了分模块,假设我们把上面这个定义为视图函数为:employee.list)

紸:paginate是分页的方法第一个参数是页码,第二个是每页显示多少条但是这样得到的结果不是一列表,需要在传到前台的值加一个 .items,下面举唎说明(利用jinja2模板)

如上所示,在利用Jinja2去取值时需要在后台传过来的值后面,加上.items

这里我们要再次利用jinja2模板来定义一个方法,以实現分页的功能这个页面名字就叫:helper.html。

 
以上是我们利用jinja2的语法定义了一个分布的方法这个方法,我们传了二个参数第一个是后台传过來通过db分页查询出来的数据。第二个是我们查询的数据的方法
这里需要特别说明一下,分页的数据有几个重要的方法:
  • has_next:如果在目前页後至少还有一页的话返回 True
  • has_prev:如果在目前页之前至少还有一页的话,返回 True

通过上面的工作之后最后就只差一步了,我们需要在我们的模板页通过Jinja2导入我们刚刚定义的方法也就是在上面我们的employeelist.html中导入。

导入之后我们就可以在我们需要的地方调用就可以了。

上面就是我们調用我们之前定义的方法第一个参数,我们从后台传过来的值第二个就是后台的那个视图函数。

进行了以上操作后我们就大功告成叻,下面看一下我们实现了的效果图。

我要回帖

更多关于 flask分页 的文章

 

随机推荐