在開發blog系統的時候,我們有一個需求,就是要顯示作者已經發表的blog文章的列表,或是顯示作者追蹤者的文章列表。實現這個功能並不複雜,只需要在儲存文章的資料庫中過濾出指定作者的文章,然後渲染HTML顯示即可。
但是,這個方法在文章不多的情況下或許是可行的,當文章的數量變多的時候,就無法在一頁中顯示完所有的文章了。這時就需要將文章清單進行分頁顯示,每一頁只顯示指定數量的文章。
這個功能該如何實現呢?我們能想到的一個直觀的方法就是將從資料庫中過濾得到的文章列表進行分組,每次只顯示一組文章。然後根據使用者的需要來顯示指定群組的文章清單。
Flask-sqlalchemy是關於flask一個針對資料庫管理的。文中我們採用一個關於員工顯示例子。
首先,我們建立SQLALCHEMY物件db。
from flask import Flask, render_template,request from flask_sqlalchemy import SQLAlchemy app = Flask(name,static_url_path='') app.debug = True app.secret_key = "faefasdfaf" app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///./db/personal.db' # app的配置,指定数据库路径 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True app.config['SQLALCHEMY_ECHO'] = True db = SQLAlchemy(app)
然後我們利用db建立員工表格:
from datetime import datetime class Employee(db.Model): '''员工''' tablename = 'employee' id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50)) gender = db.Column(db.String) job = db.Column(db.String) birthday = db.Column(db.DateTime) idcard = db.Column(db.String) address = db.Column(db.String) salary = db.Column(db.String) release_time = db.Column(db.DateTime) def init(self, name, gender, job, birthday, idcard, address, salary, release_time=None): self.name = name self.gender = gender self.job = job self.birthday = birthday self.idcard = idcard self.address = address self.salary = salary self.release_time = release_time if release_time else datetime.now() def repr(self): return '<员工{},{},{},{}>'.format(self.id, self.name, self.salary, self.address)
表創建好之後,我們可以從表中查詢資料了。
from flask import render_template from flask.views import MethodView class EmployeeListView(MethodView): # 获取员工信息 def get(self,page=1): employees = Employee.query.paginate(page,per_page=10) return render_template('employeelist.html', employees=employees)
以上我們透過查詢,查詢出員工信息,然後傳給前台一個範本。 (以上我們採用了flask的藍圖進行了分模組,假設我們把上面這個定義為視圖函數為:employee.list)
註:paginate是分頁的方法,第一個參數是頁碼,第二個是每頁顯示多少條。但是這樣得到的結果不是一列表,需要在傳到前台的值加一個 .items,下面舉例說明。 (利用jinja2模板)
{% for item in employees.items %
如上所示,在利用Jinja2去取值時,需要在後台傳過來的值後面,加上.items。
繼續上面的分頁,這裡我們要再次利用jinja2模板來定義一個方法,以實現分頁的功能,這個頁面名字就叫:helper.html。
{% macro render_page_data(page_data,page_function) %} <p class="text-center"> <ul class="page_data"> <li><a href="{{ url_for(page_function,page = 1) }}">首页</a></li> {% if page_data.has_prev %} <li><a href="{{ url_for(page_function,page = page_data.prev_num) }}">«</a></li> {% endif %} {% for page in page_data.iter_pages() %} {% if page %} {% if page !=page_data.page %} <li><a href="{{ url_for(page_function,page = page) }}">{{ page }}</a></li> {% else %} <li class="active"><a href="#">{{ page }}</a></li> {% endif %} {% endif %} {% endfor %} {% if page_data.has_next %} <li><a href="{{ url_for(page_function,page = page_data.next_num) }}">»</a></li> {% endif %} <li><a href="{{ url_for(page_function,page = page_data.pages) }}">末页</a></li> </ul> </p> {% endmacro %}
以上是我們利用jinja2的語法定義了一個分佈的方法,這個方法,我們傳了二個參數,第一個是後台傳過來透過db分頁查詢出來的資料。第二個是我們查詢的資料的方法。
這裡需要特別說明一下,分頁的資料有幾個重要的方法:
#has_next:如果在目前頁後面至少還有一頁的話,返回True
has_prev:如果在目前頁之前至少還有一頁的話,返回True
{% import 'helper.html' as helper %}
{{ helper.render_pagination(employees,'employee.list') }}
以上是詳解Python利用flask sqlalchemy實現分頁的詳細內容。更多資訊請關注PHP中文網其他相關文章!