>  기사  >  백엔드 개발  >  플라스크 sqlalchemy를 사용하여 페이징을 구현하는 Python에 대한 자세한 설명

플라스크 sqlalchemy를 사용하여 페이징을 구현하는 Python에 대한 자세한 설명

零下一度
零下一度원래의
2017-07-16 11:38:122274검색

블로그 시스템을 개발할 때 저자가 게시한 블로그 기사 목록을 표시하거나 저자의 팔로어가 작성한 기사 목록을 표시해야 할 필요가 있습니다. 이 기능을 구현하는 것은 복잡하지 않습니다. 기사가 저장된 데이터베이스에서 지정된 작성자의 기사를 필터링한 다음 표시할 HTML을 렌더링하기만 하면 됩니다.
단, 기사 수가 많지 않은 경우에는 이 방법이 가능할 수 있습니다. 기사 수가 늘어나면 한 페이지에 모든 기사를 표시하는 것이 불가능할 수 있습니다. 이때 기사 목록을 페이징표시해야 하며, 각 페이지에는 지정된 수의 기사만 표시해야 합니다.
이 기능은 어떻게 구현해야 하나요? 우리가 생각할 수 있는 직관적인 방법은 데이터베이스에서 필터링된 기사 목록을 그룹화하고 한 번에 한 그룹의 기사만 표시하는 것입니다. 그런 다음 사용자의 필요에 따라 지정된 그룹의 기사 목록을 표시합니다.

Flask-sqlalchemy는 데이터베이스 관리를 위한 플라스크에 관한 것입니다. 이 기사에서는 직원 디스플레이의 예를 사용합니다.

먼저 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 &#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으로: Employees.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를 반환

  • next_num: 다음 페이지의 페이지 수

  • prev_num: 이전 페이지의 페이지 수

위 작업, 마지막으로 한 단계만 남았습니다. 템플릿 페이지에서 Jinja2를 통해 방금 정의한 메서드, 즉 위의 Employeelist.html에서 가져와야 합니다.

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

가져온 후 필요한 곳에 호출하면 됩니다.

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

위는 앞서 정의한 메소드를 호출하는 곳입니다. 첫 번째 매개변수는 백그라운드에서 전달한 값이고 두 번째 매개변수는 백그라운드의 보기 함수입니다.

위 작업을 수행한 후 우리가 달성한 렌더링을 살펴보겠습니다.

위 내용은 모두의 학습에 도움이 되기를 바랍니다.

위 내용은 플라스크 sqlalchemy를 사용하여 페이징을 구현하는 Python에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
이전 기사:Python 기본 요약다음 기사:Python 기본 요약