python實戰----Todo清單續寫

添加分頁功能

第一步:是對視圖函數的改寫,經過查詢數據庫數據,進行分頁顯示html

# 修改清單顯示的視圖函數
@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文件,實現分頁顯示,從新定義一個宏文件python

{# 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,用來存聽任務的修改編輯日誌
對原有的數據庫進行再添加時,須要進行數據庫遷移。flask

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)

確保你有一個關於數據庫遷移的文件,基礎代碼以下session

# 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終端執行命令app

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()

圖片描述

相關文章
相關標籤/搜索