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才能指定路由函数名称,才会执行,否则就是'/'起作用了。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/205268.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32基础教程 p18 UART通信协议基础知识

1 UART通信协议简介 UART通信协议详细介绍 1.1 串行通信的简介 1. 单工通信&#xff1a;学校广播 2. 半双工通信&#xff1a;对讲机 3. 全双工通信&#xff1a;手机打电话 UART:通用的同步异步收发器 1.1.1 同步通信 组成&#xff1a;数据线、时钟线、偏选信号线 收发双方…

从文字到使用,一文读懂Kafka服务使用

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

大数据在互联网营销中的应用:案例与策略

互联网时代的营销领域正经历着一场由大数据驱动的变革。在2023年&#xff0c;大数据的应用已成为推动市场策略和决策的关键因素。本文将探讨大数据如何影响互联网营销&#xff0c;并通过实际案例分析展示其在提升营销效果方面的作用。 首先&#xff0c;通过分析海量数据&#x…

NumSharp

github地址&#xff1a;https://github.com/SciSharp/NumSharp High Performance Computation for N-D Tensors in .NET, similar API to NumPy. NumSharp (NS) is a NumPy port to C# targetting .NET Standard. NumSharp is the fundamental package needed for scientific …

第二十一章——网络通信

一.网络程序设计基础 1.局域网与互联网 2.网络协议 1.IP协议 IP是Internet Protocol的简称&#xff0c;是一种网络协议。 1.1 TCP/IP层次结构 2.TCP与UDP协议 TCP可保证数据从一端送至另一端时&#xff0c;能够确实送达&#xff0c;而且抵达的数据的排列顺序和送出时的顺序相…

设备间的指令通信

指令通信的概念 要进行设备和设备之间的交流就需要通过串口发送数据进行交流 而串口发送简单的数据只需要传输介质 但是要发送复杂的数据就需要介质和传输的规则了 三种应用场景 比如在上位机和mcu之间 通过上位机管理控制器 从而控制电池 单片机和单片机之间 用户输入数据到…

国产麒麟操作系统部署记录

前提&#xff1a;部署项目首先要安装各种软件&#xff0c;在内网环境下无法在线下载。 思路&#xff1a;首先部署一台能上网的系统&#xff0c;在此系统下只下载包&#xff0c;然后传到另一台内网系统下进行安装&#xff1b; 1、最开始yum未安装&#xff0c;因此需要先安装yu…

C语言中的动态内存管理

在C语言中&#xff0c;动态内存管理是通过一系列的标准库函数来实现的&#xff0c;这些函数包括malloc, free, calloc 和 realloc。它们允许程序在运行时动态地分配和释放内存&#xff0c;这是管理复杂数据结构&#xff08;如链表、树等&#xff09;时非常有用的功能。 为什么…

硬件基础:运放

理想运算放大器 理想运算放大器放大倍数无穷大&#xff1b;输入端阻抗无穷大&#xff0c;所以输入端电流为0&#xff1b;输出电压和负载无关&#xff0c;不管负载怎么变化&#xff0c;输出电压都是固定的。 还有个就是输出阻抗为0&#xff1b; 输出阻抗越小&#xff0c;输出时就…

Avalonia中如何实现文件拖拽上传

前言 前面我们讲了在Avalonia中如何将View事件映射到ViewModel层感兴趣的读者可以看一下&#xff0c;本章我们将讲一下在Avalonia框架下如何实现文件和文字的拖拽到指定区域进行处理和上传。 先看效果 界面设计比较简单&#xff0c;还是在前一张的基础上加了一个指定区域&…

基于springboot + vue的社区医院信息系统

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

leetcode 622. 设计循环链表

这道题讲了两种方法&#xff0c;第一个代码是用数组实现的&#xff0c;第二个是用链表实现的&#xff0c;希望对你们有帮助 &#xff08;最好在VS自己测试一遍&#xff0c;再放到 leetcode上哦&#xff09; 下面的是主函数&#xff08;作参考&#xff09;&#xff0c;静下心来…

Ubuntu安装向日葵【远程控制】

文章目录 引言下载向日葵安装向日葵运行向日葵卸载向日葵参考资料 引言 向日葵是一款非常好用的远程控制软件。这一篇博文介绍了如何在 Ubuntu Linux系统 中安装贝瑞向日葵。&#x1f3c3;&#x1f4a5;&#x1f4a5;&#x1f4a5;❗️ 下载向日葵 向日葵官网: https://sunl…

动态规划学习——最长回文子序列,让字符串变成回文串的最小插入次数

一&#xff0c;最长回文串 1.题目 给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 示例 1&#xff1a; 输入&…

【我爱C语言】详解字符函数isdigit和字符串转换函数(atoi和snprintf实现互相转换字符串)三种strlen模拟实现

&#x1f308;write in front :&#x1f50d;个人主页 &#xff1a; 啊森要自信的主页 ✏️真正相信奇迹的家伙&#xff0c;本身和奇迹一样了不起啊&#xff01; 欢迎大家关注&#x1f50d;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;>希望看完我的文章对你有小小的帮助&am…

煤矿电力监控系统

煤矿电力监控系统是一种用于煤矿电力系统的监控解决方案。该系统在重点煤矿的矿井变电站、主运输、主通风、主排水、主副提升等重要设备上加装智能用电融合终端&#xff0c;实时监测煤矿重要设备的电流、电压、负载等主要数据变化。为管理人员提供实时监测、报表管理、告警中心…

Centos7中的mysql环境安装以及卸载【Linux】

Linux中的mysql环境安装【Linux】 一. 检测mysql和mariadb是否存在二. 安装mysql2.1查看自身系统版本2.2 查看yum源2.3 选择yum源头2.4 安装yum源2.5 安装mysql2.6 启动mysql服务2.7 首次登录mysql 三. 卸载mysql3.1 关闭mysql服务3.2 查找并删除组件服务3.2.1 查找组件服务3.2…

漏洞复现-速达软件全系产品存在任意文件上传漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

阿里年薪50w和5w都是如何进行需求分析,过来围观!

工作中难免会遇到并不“完美”的需求文档&#xff0c;比如牵一发而动全身却不清晰的交互逻辑、子条目频繁的变更、交流缺失导致的歧义等&#xff0c;都会让测试在项目推进中手足无措。 一份好的需求文档&#xff0c;不止能够加速开发和测试的脚步&#xff0c;还能够提前发现风…

【尘缘送书第五期】Java程序员:学习与使用多线程

目录 1 多线程对于Java的意义2 为什么Java工程师必须掌握多线程3 Java多线程使用方式4 如何学好Java多线程5 参与方式 摘要&#xff1a;互联网的每一个角落&#xff0c;无论是大型电商平台的秒杀活动&#xff0c;社交平台的实时消息推送&#xff0c;还是在线视频平台的流量洪峰…