在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爬虫之爬虫编写全记录
Nov 06 Python
简单介绍Python的轻便web框架Bottle
Apr 08 Python
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
Jan 20 Python
对django xadmin自定义菜单的实例详解
Jan 03 Python
python模块hashlib(加密服务)知识点讲解
Nov 25 Python
Pytorch to(device)用法
Jan 08 Python
Django用户身份验证完成示例代码
Apr 03 Python
如何基于python对接钉钉并获取access_token
Apr 21 Python
Python pymysql模块安装并操作过程解析
Oct 13 Python
Python模块常用四种安装方式
Oct 20 Python
Python 微信公众号文章爬取的示例代码
Nov 30 Python
python 获取谷歌浏览器保存的密码
Jan 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读写文件的方法(生成HTML)
2006/11/27 PHP
值得分享的php+ajax实时聊天室
2016/07/20 PHP
PHP+MySQL使用mysql_num_rows实现模糊查询图书信息功能
2018/05/31 PHP
jQuery formValidator表单验证插件开源了 含API帮助、源码、示例
2008/08/14 Javascript
Jquery上传插件 uploadify v3.1使用说明
2012/06/18 Javascript
javascript创建createXmlHttpRequest对象示例代码
2014/02/10 Javascript
JS+CSS实现简单的二级下拉导航菜单效果
2015/09/21 Javascript
js验证真实姓名与身份证号是否匹配
2015/10/13 Javascript
理解javascript闭包
2015/12/15 Javascript
Javascript基础之数组的使用
2016/05/13 Javascript
Javascript中call,apply,bind方法的详解与总结
2016/12/12 Javascript
jquery实时获取时间的简单实例
2017/01/26 Javascript
BootStrap框架中的data-[ ]自定义属性理解(推荐)
2017/02/14 Javascript
react高阶组件经典应用之权限控制详解
2017/09/07 Javascript
微信小程序实现点击按钮修改字体颜色功能【附demo源码下载】
2017/12/05 Javascript
利用ES6实现单例模式及其应用详解
2017/12/09 Javascript
解决vue A对象赋值给B对象,修改B属性会影响到A的问题
2018/09/25 Javascript
如何使用 vue-cli 创建模板项目
2020/11/19 Vue.js
[01:05:32]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第一局
2016/03/04 DOTA
python实现带声音的摩斯码翻译实现方法
2015/05/20 Python
Python教程之全局变量用法
2016/06/27 Python
Python爬取网易云音乐上评论火爆的歌曲
2017/01/19 Python
django使用xlwt导出excel文件实例代码
2018/02/06 Python
解读python logging模块的使用方法
2018/04/17 Python
python 根据字典的键值进行排序的方法
2019/07/24 Python
波兰香水和化妆品购物网站:Notino.pl
2017/11/07 全球购物
汽车维修工岗位职责
2014/02/12 职场文书
初三新学期计划书
2014/05/03 职场文书
三八红旗手先进事迹材料
2014/05/13 职场文书
学校综治宣传月活动总结
2014/07/02 职场文书
新员工试用期自我评价
2015/03/10 职场文书
2015年房产经纪人工作总结
2015/05/15 职场文书
堂吉诃德读书笔记
2015/06/30 职场文书
《自己的花是让别人看的》教学反思
2016/02/19 职场文书
Django框架中模型的用法
2022/06/10 Python
如何利用python实现列表嵌套字典取值
2022/06/10 Python