python实战----Todo清单续写
添加分页功能
第一步:是对视图函数的改写,通过查询数据库数据,进行分页显示
# 修改清单显示的视图函数
@app.route('/list/')
@app.route('/list/<int:page>')
def todo_list(page=1):
todos = Todo.query.paginate(page,5)
parts = Department.query.all()
return render_template('todo_list.html',todos=todos,parts=parts)
第二步:改写html文件,实现分页显示,重新定义一个宏文件
{# marco_page.html#}
{% macro paginate(fname, todos) %}
{# dataObj 就是views函数中传递过来的Paginate实例化的对象;#}
<ul class="pagination">
{# 判断是否由上一页, #}
{% if todos.has_prev %}
{# /list/4/ ===> /list/3/#}
<li><a href="{{ url_for(fname, page=todos.prev_num) }}">前一页</a></li>
{% else %}
<li class="disabled"><a href="#">前一页</a></li>
{% endif %}
{# 根据从数据库中查询的数据, 来确定分页的个数, 使用for循环 #}
{# 返回一个迭代器, 如果有100页, 薄嗯不会返回100个数字, 而是1 2 。。。。 99 100 #}
{% for page in todos.iter_pages(right_current=2) %}
{# page: 要生成html代码的页数, todos.page: 用户希望显示数据的页数 #}
{% if page == todos.page %}
<li class="active"><a href={{ url_for(fname, page=page) }}>{{ page }}
</a></li>
{% elif page == None %}
<li class="disabled"><a href={{ url_for(fname, page=1) }}>...</a></li>
{% else %}
<li><a href={{ url_for(fname, page=page) }}>{{ page }}</a></li>
{% endif %}
{% endfor %}
{# 判断是否有后一页 #}
{% if todos.has_next %}
{# /list/4/ ===> /list/3/#}
<li><a href="{{ url_for(fname, page=todos.next_num) }}">后一页</a></li>
{% else %}
<li class="disabled"><a href="#">后一页</a></li>
{% endif %}
</ul><br>
{% endmacro %}
第三步,清单显示的模板文件调用分页显示栏
{% from 'macro_page.html' import paginate %}
{{ paginate('todo_list', todos) }}
添加日志收集功能
第一步,给原有数据库操作文件添加新的数据库表Userlog,用来存放任务的修改编辑日志
对原有的数据库进行再添加时,需要进行数据库迁移。
class Userlog(db.Model):
id = db.Column(db.Integer, autoincrement=True, primary_key=True)
add_time = db.Column(db.DateTime, default=datetime.now()) # 创建时间
ip = db.Column(db.String(200), nullable=False) # 登录ip
content = db.Column(db.String(200))
area = db.Column(db.String(200)) # 用户登录地点
user_id = db.Column(db.Integer, db.ForeignKey('user.id')) # 外键
def __repr__(self):
return '<Userlog: %s>' % (self.ip)
确保你有一个关于数据库迁移的文件,基础代码如下
# manage.py
from flask_migrate import MigrateCommand, Migrate
from flask_script import Shell,Manager
from todo_models import app,db,User,Department,Todo
manager = Manager(app)
migrate = Migrate(app,db)
manager.add_command('db',MigrateCommand)
if __name__ == '__main__':
manager.run()
在terminal终端执行命令
python manage.py db init
python manage.py db migrate -m '添加日志信息'
python manage.py db upgrade
第二步,给路由和对应视图函数加上采集的日志信息,以添加清单任务为例
修改状态和删除任务也加上日志信息,这里省略
userlog = Userlog(ip=request.remote_addr, area="西安",
user_id=1, content="添加任务%s" %(name))
db.session.add(userlog)
db.session.commit()
python实战----Todo清单续写的更多相关文章
- python实战:用70行代码写了一个山炮计算器!
python实战训练:用70行代码写了个山炮计算器! 好了...好了...各位因为我是三年级而发牢骚的各位伙伴们,我第一次为大家插播了python的基础实战训练.这个,我是想给,那些python基础一 ...
- Python+Flask+Gunicorn 项目实战(一) 从零开始,写一个Markdown解析器 —— 初体验
(一)前言 在开始学习之前,你需要确保你对Python, JavaScript, HTML, Markdown语法有非常基础的了解.项目的源码你可以在 https://github.com/zhu-y ...
- Python实战:Python爬虫学习教程,获取电影排行榜
Python应用现在如火如荼,应用范围很广.因其效率高开发迅速的优势,快速进入编程语言排行榜前几名.本系列文章致力于可以全面系统的介绍Python语言开发知识和相关知识总结.希望大家能够快速入门并学习 ...
- python实战--数据结构二叉树
此文将讲述如何用python实战解决二叉树实验 前面已经讲述了python语言的基本用法,现在让我们实战一下具体明确python的用法 点击我进入python速成笔记 先看一下最终效果图: 首先我们要 ...
- JAVA之旅(二十四)——I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习
JAVA之旅(二十四)--I/O流,字符流,FileWriter,IOException,文件续写,FileReader,小练习 JAVA之旅林林总总也是写了二十多篇了,我们今天终于是接触到了I/O了 ...
- python实战博客
2018-10-31 更新Logging日志记录以及异常捕获 感谢廖大教程.Python实战 直接在闲置的服务器上开发.阿里云Centos 6.8 64位. 1 搭建开发环境 Python 环境是Py ...
- Python实战之自己主动化评论
Python实战之自己主动化评论 玩csdn博客一个多月了,渐渐发现了一些有意思的事,常常会有人用相同的评论到处刷.不知道是为了加没什么用的积分,还是纯粹为了表达楼主好人.那么问题来了,这种无聊的事情 ...
- vue.js 实战 todo list
vue.js 起源 vue.js 的作者是尤雨溪,是一名中国人,之前在谷歌工作,现在在全职维护 vue 项目. vue.js 是 2014 年推出来的.现在已经更新到 2.x 版本,3.0 版本会在 ...
- zeromq 学习和python实战
参考文档: 官网 http://zeromq.org/ http://www.cnblogs.com/rainbowzc/p/3357594.html 原理解读 zeromq只是一层针对socke ...
随机推荐
- Linux的用户与用户组管理
1.Linux用户与用户组 Linux 是多用户多任务操作系统,Linux 系统支持多个用户在同一时间内登陆,不同用户可以执行不同的任务,并且互不影响.不同用户具有不问的权限,毎个用户在权限允许的范围 ...
- ROS中msg和srv文件的区别
1.msg和srv究竟有什么区别?? msg只是单向的发送和接受. srv包含两个部分:请求和响应. 2.msg和srv简介 msg:msg文件是描述ROS消息字段的简单文本文件.它们用于为不同语言( ...
- python面试_总结03_列表练习题
1.列表练习题 完成下列列表相关的编程题,先运行下列的test函数,在完成每道题之后,都可以通过调用test函数检测所写函数对错. def test(got, expected): if got == ...
- (三)目标检测算法之SPPNet
今天准备再更新一篇博客,加油呀~~~ 系列博客链接: (一)目标检测概述 https://www.cnblogs.com/kongweisi/p/10894415.html (二)目标检测算法之R-C ...
- Go基础知识梳理(三)
Go基础知识梳理(三) 结构 type Person struct { name string sex int } func main() { //推荐写法 person := Person{ nam ...
- LeetCode-078-子集
子集 题目描述:给你一个整数数组 nums ,数组中的元素 互不相同 .返回该数组所有可能的子集(幂集). 解集 不能 包含重复的子集.你可以按 任意顺序 返回解集. 示例说明请见LeetCode官网 ...
- Vue运用swoole 实现多人聊天
1:项目目录新建php文件和html文件,这里我建了一个swoole文件夹,chat.php 和chat.html 2:将项目同步上线 0.0.0.0 代表的是所有人都可以连接. chat.php代码 ...
- mysql更改my.ini配置文件以后mysql服务无法启动
最近在调试mysql时,更改了mysql的端口以后发现,mysql怎么改都启动不了,从其它机器重新复制一个my.ini文件就可以启动,这是由于一般用记事本打开配置文件同时更改的ini的格式,我们需要重 ...
- 解析ansible远程管理客户端【win终端为例】
一.前提: 1.1.windows机器开启winrm服务,并设置成允许远程连接状态 具体操作命令如下 set-executionpolicy remotesigned winrm quickconfi ...
- 基于python 实现KNN 算法
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/11/7 14:50 # @Author : gylhaut # @Site ...