Flask之手搓bootstrap翻页

2023-12-07 18:44
文章标签 之手 flask bootstrap 翻页

本文主要是介绍Flask之手搓bootstrap翻页,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用bootstrap框架的翻页组件时,记起在学习使用laravel框架的时候,只需要添加相应的功能代码,就可以直接使用翻页组件了,但缺少自定义,或者说自定义起来有点麻烦。

自己手搓翻页组件,不仅能加深对flask的认识,也更熟悉了前后代码之间的传递关系。

bootstrap翻页组件只有样式,如何把它变为自己想要的样子,做之前还需要在大脑里有个大概的形态。比如页面少时,有几页就显示几页,页数多时,就可以显示开始的和结束的页面,让人可以一目了然的知道,一共有多少页码。

页数少的时候,像这样:

页面多的时候,像这样:

这里面的数据,都是从omdb api里拉取的,详情可以看这个:flask之jinjia模板语法,拉取omdb api-CSDN博客

这次手搓翻页组件、控件,主要是为了自己的需求来做的。当当前页为第一页时,前翻按钮为禁用状态,当当前页为最后一页的时候,向后翻的按钮同样为禁用状态。

上代码:

from flask import Flask, render_template, request
import requests
import math
import jsonapp = Flask(__name__)@app.route('/', methods=["GET"])
# @app.route('/?s=<s>&page=<page>', methods=["GET"])
def main():s = request.args.get("s")page = request.args.get("page")if page is None:page = 1else:page = int(request.args.get("page"))if s is None:s = 'superman'# Here is your key: 4ee0241e# OMDb API: http://www.omdbapi.com/?i=tt3896198&apikey=4ee0241e# rawData = requests.get("http://www.omdbapi.com/?apikey=4ee0241e&s=batman&page=1")rawData = requests.get(f"http://www.omdbapi.com/?apikey=4ee0241e&s={s}&page={page}")movies = rawData.json()pages = math.ceil(int(movies["totalResults"]) / 10)data = dict(movies=movies,active1="active",active2="",pages=pages,page=page,s=s,)return render_template("index.html", data=data)@app.route('/', methods=["POST"])
def search():s = request.form["name"]page = 1rawData = requests.get(f"http://www.omdbapi.com/?apikey=4ee0241e&s={s}&page={page}")movies = rawData.json()pages = math.ceil(int(movies["totalResults"]) / 10)data = dict(movies=movies,active1="active",active2="",pages=pages,page=page,s=s,)return render_template("index.html", data=data)@app.route('/<imdbID>')
def movie_by_title(imdbID):# rawData = requests.get("http://www.omdbapi.com/?apikey=4ee0241e&i={}".format(imdbID))rawData = requests.get(f"http://www.omdbapi.com/?apikey=4ee0241e&i={imdbID}")movie = rawData.json()data = dict(movie=movie,active1="",active2="active",)return render_template("movie.html", data=data)if __name__ == '__main__':app.run(debug=True)

这次的路由只有三种,一是"/"根目录,有get和post状态2个路由,还有一个搜索search的post表单提交后展示电影详情页面的路由'/<imdbID>'。

目录结构:

模板代码:

footer.html

<div class="mt-3"><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.bundle.min.js"integrity="sha384-C6RzsynM9kWDrMNeT87bh95OGNyZPhcTNXj1NW7RuBCsyN/o0jlpcV8Qyq46cDfL"crossorigin="anonymous"></script>
</div>

header.html

<meta charset="UTF-8">
<title>母版</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet"integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">

home.html

<!DOCTYPE html>
<html lang="en">
<head>{% block head %}{% include './common/header.html' %}{% endblock %}<style>.card:hover {box-shadow: 10px 5px 5px #ccc;}.active {background: rgb(208, 216, 222);}.navbar {--bs-navbar-padding-y: 0;}.nav-link {padding: 20px;}.row > * {padding-left: 0;}</style>
</head>
<body>
{% block nav %}{% include './common/nav.html' %}
{% endblock %}
<div class="container mt-3"><div class="row">{% block content %}{% endblock %}</div>
</div>
{% block footer %}{% include './common/footer.html' %}
{% endblock %}
</body>
</html>

nav.html

<div class="contain  bg-body-tertiary"><nav class="navbar navbar-expand-lg container"><div class="container-fluid"><a class="navbar-brand">电影</a><button class="navbar-toggler" type="button" data-bs-toggle="collapse"data-bs-target="#navbarSupportedContent"aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"><span class="navbar-toggler-icon"></span></button><div class="collapse navbar-collapse" id="navbarSupportedContent"><ul class="navbar-nav me-auto mb-2 mb-lg-0"><li class="nav-item {{ data["active1"] }}"><a class="nav-link" aria-current="page" href="/">首页</a></li><li class="nav-item {{ data["active2"] }}"><a class="nav-link" href="javascript:(0)">详情</a></li></ul><form class="d-flex" role="search" method="post" action="{{ url_for('search') }}"><input class="form-control me-2" type="search" name="name" placeholder="搜索影片" value="{{ data.s }}"aria-label="Search"><button class="btn btn-outline-success" type="submit">search</button></form></div></div></nav>
</div>

index.html

{% extends "common/home.html" %}{% block content %}{% for movie in data["movies"].Search %}<div class="col text-center mt-3"><div class="card" style="height: 510px;overflow: hidden;width: 240px;"><img src="{{ movie.Poster }}" height="350" class="card-img-top" alt="..."><div class="card-body"><h5 class="card-title" style="height: 48px;">{{ movie.Title[:35] }}</h5><p class="card-text">{{ movie.Year }}</p><a href="/{{ movie.imdbID }}" class="btn btn-primary">详情</a></div></div></div>{% endfor %}{#    翻页    #}{% if data.pages>0 %}<div class="d-flex align-items-center justify-content-center"><div class="mt-3 mb-5"><nav aria-label="Page navigation example"><ul class="pagination pagination-lg justify-content-center"><li class="page-item {{ 'disabled' if data.page==1 else '' }}"><a class="page-link" href="/?s={{ data.s }}&page={{ data.page -  1 }}"aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>{% if data.pages<8 %}{% for i in range(data.pages) %}<li class="page-item"><aclass="page-link {{ 'disabled' if data.page == i + 1 else '' }}"href="/?s={{ data.s }}&page={{ i + 1 }}">{{ i + 1 }}</a></li>{% endfor %}{% elif data.pages>=8 %}{% for i in range(3) %}{% if data.pages - 5 > data.page %}<li class="page-item"><aclass="page-link {{ 'disabled' if data.page == i + data.page else '' }}"href="/?s={{ data.s }}&page={{ i + data.page }}">{{ i + data.page }}</a></li>{% else %}<li class="page-item"><aclass="page-link {{ 'disabled' if data.page == i + data.pages - 5 else '' }}"href="/?s={{ data.s }}&page={{ data.pages - 5 + i }}">{{ i + data.pages - 5 }}</a></li>{% endif %}{% endfor %}<li class="page-item}"><a class="page-link" href="javascript:(0)"><span aria-hidden="true">...</span></a></li>{% for i in range(3)[::-1] %}<li class="page-item"><aclass="page-link {{ 'disabled' if data.page == data.pages - i else '' }}"href="/?s={{ data.s }}&page={{ data.pages - i }}">{{ data.pages - i }}</a></li>{% endfor %}{% endif %}<li class="page-item {{ 'disabled' if data.page==data.pages else '' }}"><a class="page-link" href="#" aria-label="Next"><span aria-hidden="true">&raquo;</span></a></li></ul></nav></div></div>{% endif %}
{% endblock %}

movie.html

{% extends "common/home.html" %}{% block content %}<div class="d-flex align-items-center justify-content-center"><div class="card mb-3" style="max-width: 1080px;"><div class="row"><div class="col-md-4"><img src="{{ data["movie"].Poster }}" class="img-fluid rounded-start" alt="..."></div><div class="col-md-8"><div class="card-body"><h5 class="card-title">{{ data["movie"].Title }}</h5><p class="card-text">Year:{{ data["movie"].Year }}</p><p class="card-text">Runtime:{{ data["movie"].Runtime }}</p><p class="card-text">Actors:{{ data["movie"].Actors }}</p><p class="card-text">{{ data["movie"].Actors }}</p><p class="card-text">{{ data["movie"].Year }}</p><p class="card-text"><small class="text-body-secondary">{{ data["movie"].Plot }}</small></p></div><div class="d-flex align-items-center justify-content-center"><a href="{{ url_for("main") }}" class="btn btn-success">返回</a></div></div></div></div></div>
{% endblock %}

里面容易绕圈圈的是,首页默认会有搜索词及内容,点击搜索按钮后,也是跳转到首页页面,显示搜索的内容,翻页也是在首页模板里面进行翻页。之前考虑使用

url_for()

url_for函数来进行跳转,发现这样的话,在循环翻页按钮的时候,怎么批量生成翻页按钮难住我了。这样不如直接获取链接地址里面的参数,来实现页面跳转。如果单独写一个 

'/?s=<s>&page=<page>'

这样的路由,发现根本不起作用,起作用的还是'/'这个路由,只有使用函数url_for才能指定路由函数名称,才会执行,否则就是'/'起作用了。

 

这篇关于Flask之手搓bootstrap翻页的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/466958

相关文章

基于Python实现PDF动画翻页效果的阅读器

《基于Python实现PDF动画翻页效果的阅读器》在这篇博客中,我们将深入分析一个基于wxPython实现的PDF阅读器程序,该程序支持加载PDF文件并显示页面内容,同时支持页面切换动画效果,文中有详... 目录全部代码代码结构初始化 UI 界面加载 PDF 文件显示 PDF 页面页面切换动画运行效果总结主

flask-login 生成 cookie,session

flask-login 生成 cookie,session Flask-Login login_user() 显示来自 Set-Cookie 标头的加密 cookie # 模拟一个用户类class User(UserMixin):def __init__(self, id):self.id = id@app.route('/login')def login():# 模拟用户登录过程user

Flask 创建app 时候传入的 static_folder 和 static_url_path参数理解

Flask 在创建app的时候 是用 app = Flask(__name__) 来创建的,不传入 static_folder参数的话 ,默认的静态文件的位置是在 static目录下 我们可以进入 Flask的源码里面查看 ctrl+鼠标左键进入 这是Flask的 __init__源码(后面还有一些,我就选了需要的代码)     def __init__(self,import_

【python web】Flask+Echarts 实现动图图表

flask 是python web开发的微框架,Echarts酷炫的功能主要是javascript起作用,将两者结合起来,发挥的作用更大。下面将Echarts嵌套进Flask的html模板中。 项目结构: 打开demo.py运行,点击console中的链接http://127.0.0.1:5000/ 就可以看到我们想要的动态图表。 demo.py #coding:utf-8fro

Flask-Session扩展,使用Redis存储会话数据

深入理解Flask-session扩展Redis Flask 应用中使用 flask-session 扩展将 session 数据存储在 Redis 中是一种高效且可扩展的方法,特别是在需要处理大量用户或需要分布式部署的应用中。以下是如何在 Flask 应用中配置 flask-session 以使用 Redis 存储 session 的步骤: 1. 安装必要的库 首先,你需要安装 Flask

Flask:Python轻量级Web框架详解

Flask是一个用Python编写的轻量级Web应用框架。它被设计为易于使用和扩展,非常适合小型项目和微服务,同时也能够支持大型应用。Flask依赖于少量的外部库,并且提供了一个简单的方式来创建Web应用。 Flask的主要特点 轻量级:Flask核心非常简单,使得它易于理解和扩展。扩展性:Flask可以通过扩展来增加额外的功能。灵活性:Flask允许你以任何你喜欢的方式组织你的应用。微核心设

基于node.js/jquery/bootstrap的博客系统开发---总结

1 express Express 是一个基于 Node.js 平台的极简、灵活的 web 应用开发框架,它提供一系列强大的特性,帮助你创建各种 Web 和移动设备应用。 var express = require('express');var app = express(); 1.1 路由 路由是指如何定义应用的端点(URIs)以及如何响应客户端的请求。 app.METHOD(pa

如何处理Flask中的路由

在Flask框架中,路由是Web应用的核心组成部分之一,它定义了URL路径与视图函数之间的映射关系。当用户通过浏览器访问特定的URL时,Flask会根据定义的路由规则找到对应的视图函数,并调用该函数来处理请求,最后返回响应给客户端。处理Flask中的路由涉及定义路由、动态路由、路由参数、路由装饰器、蓝图等多个方面。由于直接撰写5000字详细阐述这些内容可能过于冗长,我将提供一个简明而全面的概述,并

Flask中 blinker 是什么

在Flask框架中,blinker 是一个非常重要的组件,它作为信号处理的库,为Flask应用提供了一种灵活而强大的事件处理机制。以下是对Flask中blinker的详细阐述,考虑到篇幅限制,无法直接达到5000字,但会尽量全面而深入地介绍其关键方面。 一、blinker 简介 blinker 是一个基于Python的轻量级信号库,它允许开发者在Python应用程序中实现观察者模式(也称为发布

Flask中多app应用怎么完成

在Flask中实现多app应用,通常指的是在同一个Flask项目中运行多个相对独立的应用(或称为模块、组件)。这种需求在大型项目中尤为常见,因为它可以帮助开发者更好地组织代码,提高项目的可维护性和可扩展性。以下将详细阐述Flask中多app应用的实现方式,但请注意,由于篇幅限制,无法直接提供6000字的详细解答,但会尽量全面且深入地介绍相关概念和步骤。 一、Flask多app应用的基本概念 在