在Python的web框架中中编写日志列表的教程


Posted in Python onApril 30, 2015

MVVM模式不但可用于Form表单,在复杂的管理页面中也能大显身手。例如,分页显示Blog的功能,我们先把后端代码写出来:

在apis.py中定义一个Page类用于存储分页信息:

class Page(object):
  def __init__(self, item_count, page_index=1, page_size=10):
    self.item_count = item_count
    self.page_size = page_size
    self.page_count = item_count // page_size + (1 if item_count % page_size > 0 else 0)
    if (item_count == 0) or (page_index < 1) or (page_index > self.page_count):
      self.offset = 0
      self.limit = 0
      self.page_index = 1
    else:
      self.page_index = page_index
      self.offset = self.page_size * (page_index - 1)
      self.limit = self.page_size
    self.has_next = self.page_index < self.page_count
    self.has_previous = self.page_index > 1

在urls.py中实现API:

def _get_blogs_by_page():
  total = Blog.count_all()
  page = Page(total, _get_page_index())
  blogs = Blog.find_by('order by created_at desc limit ?,?', page.offset, page.limit)
  return blogs, page

@api
@get('/api/blogs')
def api_get_blogs():
  blogs, page = _get_blogs_by_page()
  return dict(blogs=blogs, page=page)

返回模板页面:

@view('manage_blog_list.html')
@get('/manage/blogs')
def manage_blogs():
  return dict(page_index=_get_page_index(), user=ctx.request.user)

模板页面首先通过API:GET /api/blogs?page=?拿到Model:

{
  "page": {
    "has_next": true,
    "page_index": 1,
    "page_count": 2,
    "has_previous": false,
    "item_count": 12
  },
  "blogs": [...]
}

然后,通过Vue初始化MVVM:

<script>
function initVM(data) {
  $('#div-blogs').show();
  var vm = new Vue({
    el: '#div-blogs',
    data: {
      blogs: data.blogs,
      page: data.page
    },
    methods: {
      previous: function () {
        gotoPage(this.page.page_index - 1);
      },
      next: function () {
        gotoPage(this.page.page_index + 1);
      },
      edit_blog: function (blog) {
        location.assign('/manage/blogs/edit/' + blog.id);
      }
    }
  });
}

$(function() {
  getApi('/api/blogs?page={{ page_index }}', function (err, results) {
    if (err) {
      return showError(err);
    }
    $('#div-loading').hide();
    initVM(results);
  });
});
</script>

View的容器是#div-blogs,包含一个table,我们用v-repeat可以把Model的数组blogs直接变成多行的<tr>:

<div id="div-blogs" class="uk-width-1-1" style="display:none">
  <table class="uk-table uk-table-hover">
    <thead>
      <tr>
        <th class="uk-width-5-10">标题 / 摘要</th>
        <th class="uk-width-2-10">作者</th>
        <th class="uk-width-2-10">创建时间</th>
        <th class="uk-width-1-10">操作</th>
      </tr>
    </thead>
    <tbody>
      <tr v-repeat="blog: blogs" >
        <td>
          <a target="_blank" v-attr="href: '/blog/'+blog.id" v-text="blog.name"></a>
        </td>
        <td>
          <a target="_blank" v-attr="href: '/user/'+blog.user_id" v-text="blog.user_name"></a>
        </td>
        <td>
          <span v-text="blog.created_at.toDateTime()"></span>
        </td>
        <td>
          <a href="#0" v-on="click: edit_blog(blog)"><i class="uk-icon-edit"></i>
        </td>
      </tr>
    </tbody>
  </table>
  <div class="uk-width-1-1 uk-text-center">
    <ul class="uk-pagination">
      <li v-if="! page.has_previous" class="uk-disabled"><span><i class="uk-icon-angle-double-left"></i></span></li>
      <li v-if="page.has_previous"><a v-on="click: previous()" href="#0"><i class="uk-icon-angle-double-left"></i></a></li>
      <li class="uk-active"><span v-text="page.page_index"></span></li>
      <li v-if="! page.has_next" class="uk-disabled"><span><i class="uk-icon-angle-double-right"></i></span></li>
      <li v-if="page.has_next"><a v-on="click: next()" href="#0"><i class="uk-icon-angle-double-right"></i></a></li>
    </ul>
  </div>
</div>

往Model的blogs数组中增加一个Blog元素,table就神奇地增加了一行;把blogs数组的某个元素删除,table就神奇地减少了一行。所有复杂的Model-View的映射逻辑全部由MVVM框架完成,我们只需要在HTML中写上v-repeat指令,就什么都不用管了。

可以把v-repeat="blog: blogs"看成循环代码,所以,可以在一个<tr>内部引用循环变量blog。v-text和v-attr指令分别用于生成文本和DOM节点属性。

完整的Blog列表页如下:

在Python的web框架中中编写日志列表的教程

Python 相关文章推荐
python实现发送邮件功能代码
Dec 14 Python
python实现一个简单的ping工具方法
Jan 31 Python
Python中新式类与经典类的区别详析
Jul 10 Python
python实现证件照换底功能
Aug 20 Python
安装2019Pycharm最新版本的教程详解
Oct 22 Python
tensorflow 查看梯度方式
Feb 04 Python
python集成开发环境配置(pycharm)
Feb 14 Python
django实现HttpResponse返回json数据为中文
Mar 27 Python
使用Python实现将多表分批次从数据库导出到Excel
May 15 Python
Python 如何操作 SQLite 数据库
Aug 17 Python
基于Python制作一副扑克牌过程详解
Oct 19 Python
python海龟绘图之画国旗实例代码
Nov 11 Python
python登录pop3邮件服务器接收邮件的方法
Apr 30 #Python
python通过smpt发送邮件的方法
Apr 30 #Python
在Python的web框架中编写创建日志的程序的教程
Apr 30 #Python
用Python实现web端用户登录和注册功能的教程
Apr 30 #Python
用Python编写web API的教程
Apr 30 #Python
为Python的web框架编写前端模版的教程
Apr 30 #Python
为Python的web框架编写MVC配置来使其运行的教程
Apr 30 #Python
You might like
PHP调用Webservice实例代码
2011/07/29 PHP
php学习笔记(三)操作符与控制结构
2011/08/06 PHP
php日期转时间戳,指定日期转换成时间戳
2012/07/17 PHP
javascript some()函数用法详解
2014/11/13 PHP
使用php自动备份数据库表的实现方法
2017/07/28 PHP
PHP登录验证功能示例【用户名、密码、验证码、数据库、已登陆验证、自动登录和注销登录等】
2019/02/25 PHP
TP5(thinkPHP5)框架使用ajax实现与后台数据交互的方法小结
2020/02/10 PHP
jquery.cookie用法详细解析
2013/12/18 Javascript
jquery实现简单合拢与展开网页面板的方法
2015/09/01 Javascript
鼠标点击input,显示瞬间的边框颜色,对之修改与隐藏实例
2016/12/26 Javascript
JS中静态页面实现微信分享功能
2017/02/06 Javascript
一次围绕setTimeout的前端面试经验分享
2017/06/15 Javascript
用JS实现简单的登录验证功能
2017/07/28 Javascript
基于Cookie常用操作以及属性介绍
2017/09/07 Javascript
利用React Router4实现的服务端直出渲染(SSR)
2019/01/07 Javascript
你可能不知道的CORS跨域资源共享
2019/03/13 Javascript
使用JS监听键盘按下事件(keydown event)
2019/11/07 Javascript
Vue select 绑定动态变量的实例讲解
2020/10/22 Javascript
微信小程序实现底部弹出框
2020/11/18 Javascript
Python入门之三角函数全解【收藏】
2017/11/08 Python
解决python报错MemoryError的问题
2018/06/26 Python
Python计算开方、立方、圆周率,精确到小数点后任意位的方法
2018/07/17 Python
numpy数组之存取文件的实现示例
2019/05/24 Python
python numpy之np.random的随机数函数使用介绍
2019/10/06 Python
python函数不定长参数使用方法解析
2019/12/14 Python
python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案
2020/02/18 Python
Django DRF认证组件流程实现原理详解
2020/08/17 Python
美国大型的健身社区和补充商店:Bodybuilding.com
2016/09/06 全球购物
美的官方商城:Midea
2016/09/14 全球购物
美国优质宠物用品购买网站:Muttropolis
2020/02/17 全球购物
茱莉蔻美国官网:Jurlique美国
2020/11/24 全球购物
思想汇报范文
2013/11/04 职场文书
应急处置方案
2014/06/16 职场文书
群众路线自查自纠工作情况报告
2014/10/28 职场文书
《秦兵马俑》教学反思
2016/02/24 职场文书
MySQL GRANT用户授权的实现
2021/06/18 MySQL