rest - Tornado 可以处理分页吗?

标签 rest sorting python-2.7 pagination tornado

Django REST 框架让你设置分页。 当我们发出请求时,它会返回一个 JSON 对象,该对象具有一个“分页”属性,该属性具有“下一个”和/或“上一个”属性,其中包含其他页面的 url(如果它们存在的话)。

Tornado 是否提供设置分页的选项?

我在网上搜索了 tornado 分页示例,但没有找到。

感谢任何帮助。 提前谢谢你。

最佳答案

不,因为分页需要与数据库紧密配合,而 Tornado 与数据库无关。

这是我使用的一个 UI 模块;您需要计算总结果以及页面结果(如果只是构建分页链接,这不会限制您的结果):

from __future__ import division
import math
import urlparse
import urllib

import tornado.web

def update_querystring(url, **kwargs):
    base_url = urlparse.urlsplit(url)
    query_args = urlparse.parse_qs(base_url.query)
    query_args.update(kwargs)
    for arg_name, arg_value in kwargs.iteritems():
        if arg_value is None:
            if query_args.has_key(arg_name):
                del query_args[arg_name]

    query_string = urllib.urlencode(query_args, True)     
    return urlparse.urlunsplit((base_url.scheme, base_url.netloc,
        base_url.path, query_string, base_url.fragment))

class Paginator(tornado.web.UIModule):
    """Pagination links display."""

    def render(self, page, page_size, results_count):
        pages = int(math.ceil(results_count / page_size)) if results_count else 0

        def get_page_url(page):
            # don't allow ?page=1
            if page <= 1:
                page = None
            return update_querystring(self.request.uri, page=page)

        next = page + 1 if page < pages else None
        previous = page - 1 if page > 1 else None

        return self.render_string('uimodules/pagination.html', page=page, pages=pages, next=next,
            previous=previous, get_page_url=get_page_url)

这是模块模板(上例中的uimodules/pagination.html):

{% if pages > 1 %}
<div class="pagination pagination-centered">
  <ul>
  <li{% if previous %}><a href="{{ get_page_url(previous) }}">&laquo;</a>{% else %} class="disabled"><span>&laquo;</span></li>{% end %}  
  {% for page_num in xrange(1, pages + 1) %}{# 1-index range #}
  <li{% if page_num != page %}><a href="{{ get_page_url(page_num) }}">{{ page_num }}</a>{% else %} class="active"><span>{{ page_num }}</span></li>{% end %}
  {% end %}
  <li{% if next %}><a href="{{ get_page_url(next) }}">&raquo;</a>{% else %} class="disabled"><span>&raquo;</span></li>{% end %}  
</ul>
</div>
{% end %}

别忘了tell your tornado app about the module .

最后,实际使用它:

{% for result in results %}
<p>{{ result }}</p>
{% end %}
{% module Paginator(page, page_size, results_count) %}

希望有帮助!

关于rest - Tornado 可以处理分页吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15981257/

相关文章:

python - 根据字符串的首选顺序对可迭代对象进行排序

python - 在 Python 中使用 Re 删除双空格/制表符组合

php - 如何在 PHP 中构建安全的 RESTful 服务?

ruby - Sinatra API 功能切换

xml - vb.net 中的 REST 调用 : how to pass the key "file" that works in cURL

ruby-on-rails - http中的Host header有什么用?

c - 冒泡排序到 char 指针

ruby - 按 ruby​​ 中数组的元素属性排序

转义十六进制的 Python 字符串

python - 如何为 python 2.7.x 创建虚拟环境?