ホームページ  >  記事  >  バックエンド開発  >  フラスコ sqlalchemy を使用してページングを実装する Python の詳細な説明

フラスコ sqlalchemy を使用してページングを実装する Python の詳細な説明

零下一度
零下一度オリジナル
2017-07-16 11:38:122347ブラウズ

ブログシステムを開発する際、著者が公開したブログ記事の一覧を表示したり、著者のフォロワーの記事を一覧表示したいというニーズがあります。この関数の実装は複雑ではありません。必要なのは、記事が保存されているデータベース内で指定した著者の記事をフィルタリングして、表示用に HTML をレンダリングすることだけです。
ただし、記事数が少ない場合はこの方法でも可能ですが、記事数が多くなると1ページに全ての記事を表示できなくなります。このとき、記事リストをページング表示し、各ページに指定した数の記事のみを表示する必要があります。
この機能はどのように実装する必要がありますか?考えられる直観的な方法は、データベースからフィルタリングされた記事のリストをグループ化し、一度に 1 つの記事グループのみを表示することです。次に、ユーザーのニーズに応じて、指定したグループの記事リストを表示します。

Flask-sqlalchemy はデータベース管理用の Flask についてです。この記事では、従業員表示の例を使用します。

まず、SQLALCHEMY オブジェクト データベースを作成します。

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 &#39;<员工{},{},{},{}>&#39;.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(&#39;employeelist.html&#39;, employees=employees)


上記では、従業員情報をクエリし、それをテンプレートとしてフロント デスクに渡します。 (モジュールをモジュールに分割するためにフラスコ ブループリントを使用しました。上記を viewfunction as:employee.list として定義するとします)

注: paginate はページング メソッドで、最初のパラメーターはページ番号です。 2 番目のパラメータは、各ページに表示される項目の数です。ただし、この方法で得られる結果はリストではありません。フロント デスクに渡す値に .items を追加する必要があります。以下に例を示します。 (jinja2テンプレートを使用)

{% for item inemployees.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 ページングを通じてクエリされるデータです。 2 つ目は、クエリするデータの方法です。

ここでは特別な説明が必要です: データをページングするための重要なメソッドがいくつかあります:

  • has_next: 現在のページの後に少なくとも 1 ページがある場合、True を返します

  • has_prev:現在のページ 少なくとも 1 ページ残っている場合は True を返します

  • next_num: 次のページのページ数

  • prev_num: 前のページのページ数

上記の作業を終えると、最後に残っているステップは 1 つだけです。Jinja2 を通じて定義したメソッドをテンプレート ページにインポートする必要があります。つまり、上記のemployeelist.html にインポートする必要があります。

{% import 'helper.html' as helper %}

インポート後、必要な場所で呼び出すことができます。

{{ helper.render_pagination(employees,'employee.list') }}

上記は、前に定義したメソッドを呼び出す場所です。最初のパラメータはバックグラウンドから渡した値で、2 番目のパラメータはバックグラウンドのビュー関数です。

上記の操作を実行したら、完成したレンダリングを見てみましょう。

以上がこの記事の全内容です。皆様の学習のお役に立てれば幸いです。また、皆様もスクリプトハウスを応援していただければ幸いです。

以上がフラスコ sqlalchemy を使用してページングを実装する Python の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。