在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使用post提交数据到远程url的方法
Apr 29 Python
使用Mixin设计模式进行Python编程的方法讲解
Jun 21 Python
Python编程实现从字典中提取子集的方法分析
Feb 09 Python
基于Python log 的正确打开方式
Apr 28 Python
Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
Jun 05 Python
python爬虫 正则表达式解析
Sep 28 Python
python自动生成model文件过程详解
Nov 02 Python
python numpy 反转 reverse示例
Dec 04 Python
Tensorflow 自定义loss的情况下初始化部分变量方式
Jan 06 Python
python模式 工厂模式原理及实例详解
Feb 11 Python
什么是python的列表推导式
May 26 Python
Python无损压缩图片的示例代码
Aug 06 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下HTTP Response中的Chunked编码实现方法
2008/11/19 PHP
用来解析.htgroup文件的PHP类
2012/09/05 PHP
php查找指定目录下指定大小文件的方法
2014/11/28 PHP
Yii2框架中一些折磨人的坑
2019/12/15 PHP
详解使用php-cs-fixer格式化代码
2020/09/16 PHP
[原创]图片分页查看
2006/08/28 Javascript
仿新浪微博返回顶部的jquery实现代码
2012/10/01 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/08/22 Javascript
JavaScript中字符串(string)转json的2种方法
2015/06/25 Javascript
BootstrapTable+KnockoutJS自定义T4模板快速生成增删改查页面
2016/08/01 Javascript
Vue.js一个文件对应一个组件实践
2016/10/27 Javascript
bootstrap提示标签、提示框实现代码
2016/12/28 Javascript
通过jsonp获取json数据实现AJAX跨域请求
2017/01/22 Javascript
JavaScript中常见的八个陷阱总结
2017/06/28 Javascript
javascript 中select框触发事件过程的分析
2017/08/01 Javascript
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
2017/09/26 Javascript
JavaScript面向对象程序设计中对象的定义和继承详解
2019/07/29 Javascript
微信小程序之左右布局的实现代码
2019/12/13 Javascript
echarts实现晶体球面投影的实例教程
2020/10/10 Javascript
pandas Dataframe行列读取的实例
2018/06/08 Python
Python 实现异步调用函数的示例讲解
2018/10/14 Python
Python批处理更改文件名os.rename的方法
2018/10/26 Python
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
python交易记录整合交易类详解
2019/07/03 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
2020/03/14 Python
python中的split、rsplit、splitlines用法说明
2020/10/23 Python
Python 利用flask搭建一个共享服务器的步骤
2020/12/05 Python
英国最受欢迎的平价女士时装零售商:Roman Originals
2019/11/02 全球购物
应届大专毕业生个人自荐信
2013/09/22 职场文书
医学专业个人求职自荐信格式
2013/09/23 职场文书
车辆年审委托书范本
2014/09/18 职场文书
2015年感恩母亲节的演讲稿
2015/03/18 职场文书
2015年度销售个人工作总结
2015/03/31 职场文书
教师工作证明范本
2015/06/12 职场文书
pytorch Dropout过拟合的操作
2021/05/27 Python
MySQL池化框架学习接池自定义
2022/07/23 MySQL