在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 提取文件的小程序
Jul 29 Python
Python中的getopt函数使用详解
Jul 28 Python
python3中bytes和string之间的互相转换
Feb 09 Python
python django 实现验证码的功能实例代码
May 18 Python
python数据结构之列表和元组的详解
Sep 23 Python
Python3实现的爬虫爬取数据并存入mysql数据库操作示例
Jun 06 Python
python模糊图片过滤的方法
Dec 14 Python
Python发送手机动态验证码代码实例
Feb 28 Python
Django 返回json数据的实现示例
Mar 05 Python
Python在后台自动解压各种压缩文件的实现方法
Nov 10 Python
python实现企业微信定时发送文本消息的实例代码
Nov 25 Python
Python 线程池模块之多线程操作代码
May 20 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
Apache, PHP在Windows 9x/NT下的安装与配置 (二)
2006/10/09 PHP
修改php.ini实现Mysql导入数据库文件最大限制的修改方法
2007/12/11 PHP
php实现异步数据调用的方法
2015/12/24 PHP
javascript中的对象和数组的应用技巧
2007/01/07 Javascript
ext 同步和异步示例代码
2009/09/18 Javascript
jQuery基本选择器选择元素使用介绍
2013/04/18 Javascript
js的Boolean对象初始值示例
2014/03/04 Javascript
浅谈jQuery中replace()方法
2015/05/13 Javascript
基于jquery实现的鼠标悬停提示案例
2016/12/11 Javascript
Bootstrap CSS组件之分页(pagination)和翻页(pager)
2016/12/17 Javascript
Node.js pipe实现源码解析
2017/08/12 Javascript
js正则取值的结果数组调试方法
2018/10/10 Javascript
详解vantUI框架在vue项目中的应用踩坑
2018/12/06 Javascript
深入理解vue中的slot与slot-scope
2019/04/22 Javascript
JavaScript Math对象和调试程序的方法分析
2019/05/13 Javascript
使用Vue.js 和Chart.js制作绚丽多彩的图表
2019/06/15 Javascript
[00:47]DOTA2荣耀之路6:天火,天火!
2018/05/30 DOTA
Windows下实现Python2和Python3两个版共存的方法
2015/06/12 Python
Python实现的文本对比报告生成工具示例
2018/05/22 Python
python对离散变量的one-hot编码方法
2018/07/11 Python
django基于restframework的CBV封装详解
2019/08/08 Python
Python之数据序列化(json、pickle、shelve)详解
2019/08/30 Python
python实现批量处理将图片粘贴到另一张图片上并保存
2019/12/12 Python
Jupyter加载文件的实现方法
2020/04/14 Python
Python3爬虫中Splash的知识总结
2020/07/10 Python
Pycharm常用快捷键总结及配置方法
2020/11/14 Python
HTML5+CSS3 诱人的实例:3D立方体旋转动画实例
2016/12/30 HTML / CSS
优衣库澳大利亚官网:UNIQLO澳大利亚
2017/01/18 全球购物
英国时尚服饰电商:Boohoo
2017/10/12 全球购物
New Balance天猫官方旗舰店:始于1906年,百年慢跑品牌
2017/11/15 全球购物
顺丰快递Java软件工程师面试题
2015/07/31 面试题
信用卡逾期证明示例
2014/09/13 职场文书
2015年保险公司个人工作总结
2015/05/22 职场文书
初中政治教学反思
2016/02/23 职场文书
深入理解python协程
2021/06/15 Python
SpringDataJPA实体类关系映射配置方式
2021/12/06 Java/Android