在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实现字符串和日期相互转换的方法
May 13 Python
Python编程中归并排序算法的实现步骤详解
May 04 Python
浅谈python中列表、字符串、字典的常用操作
Sep 19 Python
Python3实现发送QQ邮件功能(文本)
Dec 15 Python
python3+PyQt5重新实现QT事件处理程序
Apr 19 Python
python 判断矩阵中每行非零个数的方法
Jan 26 Python
python 使用pandas计算累积求和的方法
Feb 08 Python
基于Python的微信机器人开发 微信登录和获取好友列表实现解析
Aug 21 Python
python+django+rest框架配置创建方法
Aug 31 Python
jupyternotebook 撤销删除的操作方式
Apr 17 Python
Python内置方法和属性应用:反射和单例(推荐)
Jun 19 Python
Python Opencv实现单目标检测的示例代码
Sep 08 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读书笔记整理_结构语句详解
2016/07/01 PHP
图文详解PHP环境搭建教程
2016/07/16 PHP
Laravel 添加多语言提示信息的方法
2019/09/29 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
JavaScript入门教程(1) 什么是JS
2009/01/31 Javascript
jquery里的each使用方法详解
2010/12/22 Javascript
javaScript函数中执行C#代码中的函数方法总结
2013/08/07 Javascript
JavaScript中的常见问题解决方法(乱码,IE缓存,代理)
2013/11/28 Javascript
js获取光标位置和设置文本框光标位置示例代码
2014/01/09 Javascript
js实现图片拖动改变顺序附图
2014/05/13 Javascript
jQuery中removeClass()方法用法实例
2015/01/05 Javascript
jquery使用经验小结
2015/05/20 Javascript
javascript实现类似于新浪微博搜索框弹出效果的方法
2015/07/27 Javascript
JS实现弹性菜单效果代码
2015/09/07 Javascript
js实现获取div坐标的方法
2015/11/16 Javascript
Node.js程序中的本地文件操作用法小结
2016/03/06 Javascript
JS实现的表格行上下移动操作示例
2016/08/03 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
2017/01/09 Javascript
bootstrap响应式工具使用详解
2017/11/29 Javascript
Angular4学习之Angular CLI的安装与使用教程
2018/01/04 Javascript
详解给Vue2路由导航钩子和axios拦截器做个封装
2018/04/10 Javascript
vue 解决循环引用组件报错的问题
2018/09/06 Javascript
layui table 列宽百分比显示的实现方法
2019/09/28 Javascript
JavaScript或jQuery 获取option value值方法解析
2020/05/12 jQuery
python模拟登陆Tom邮箱示例分享
2014/01/13 Python
python将字典内容存入mysql实例代码
2018/01/18 Python
Python 操作mysql数据库查询之fetchone(), fetchmany(), fetchall()用法示例
2019/10/17 Python
美国创意之家:BulbHead
2017/07/12 全球购物
Otticanet意大利:最顶尖的世界名牌眼镜, 能得到打折季的价格
2019/03/10 全球购物
JAVA和C++的区别
2013/10/06 面试题
党员干部观看《周恩来四个昼夜》思想汇报
2014/09/10 职场文书
2015最新学生自我评价范文
2015/03/03 职场文书
六一活动主持词
2015/06/30 职场文书
中学校园广播稿
2015/08/18 职场文书
哪类餐饮行业,最适合在高校创业?
2019/08/19 职场文书
Mysql中 unique列插入重复值该怎么解决呢
2021/05/26 MySQL