【自学开发之旅】Flask-restful-Jinjia页面编写template-回顾(五)
restful是web编程里重要的概念
– 一种接口规范也是一种接口设计风格
设计接口:
要考虑:数据返回、接收数据的方式、url、方法
统一风格
rest–表现层状态转移
web–每一类数据–资源
资源通过http的动作来实现状态转移 GET、PUT、POST、DELETE
path组成:
/{version}/{resources}/{resource_id}
restful api设计
方法
/v1/product POST 新增
GET 查询所有
/v1/product/id PUT 修改
DELETE 删除
GET 查询某一个
router/product_view/product_api.py
from flask import Blueprint, request
from flask_restful import Api, Resource
from libs.response import generate_response
from . import product_bp# 将restful api对象和蓝图绑定
api = Api(product_bp)# 每个资源就是类,定义类
class ProductView(Resource):def get(self, id = None):return generate_response(msg="get product")def post(self):generate_response(msg="add product")def put(self, id):generate_response(msg="modify success!")def delete(self, id):return generate_response(msg="delete success!")# 路由
api.add_resource(ProductView, "/product")
api.add_resource(ProductView, "/product/<id>", endpoint="productid")
为什么要设置endpoint:由flask路由管理可知endpoint全局唯一,不指定的话都会默认endpoint为函数名(这里为类名)ProductView重复名了。
这行代码是使用Flask框架(一个Python微型web框架)来定义一个路由。‘api.add_resource’是Flask-RESTful扩展提供的方法,用于将资源(这里是’ProductView’)映射到URL(这里是’/product’)。‘ProductView’可能是一个你定义的类,它继承自Flask-RESTful的’Resource’类,用于处理与产品相关的HTTP请求。’/product’是URL路径,当用户发送请求到这个路径时,Flask会调用’ProductView’类中对应的方法来处理请求。
接着将增删改查功能都实现restful接口规范
router/product_view/product_api.py
"""
@date: 2023/9/12
@file: product_api
@author: Jiangda
@desc: test"""
from flask import Blueprint, request
from flask_restful import Api, Resource
from libs.response import generate_response
from . import product_bp
from models.product import ProductInfo
from models import db# 将restful api对象和蓝图绑定
api = Api(product_bp)# 每个资源就是类,定义类
class ProductView(Resource):def get(self, id = None):if id:result = ProductInfo.query.get(id)else:result = ProductInfo.query.all()if result:if isinstance(result, list):result2 = [dict(pro) for pro in result]else:result2 = dict(result)return generate_response(msg="get success!", data=result2)else:return generate_response(code=1010, msg="data empty!")def post(self):pro_name = request.json.get("proname")pro_kind = request.json.get("prokind")pro_price = request.json.get("proprice")pro_address = request.json.get("proadd")if pro_name and pro_kind and pro_price and pro_address:proinfo = ProductInfo(product_name = pro_name,product_kind = pro_kind,product_price = pro_price,product_address = pro_address)db.session.add(proinfo)db.session.commit()return generate_response(msg="add success!")else:return generate_response(msg="add fail!", code=1011)def put(self, id):p1 = ProductInfo.query.get(id)if p1:# 接收客户端的传递pro_name = request.json.get("proname")pro_kind = request.json.get("prokind")pro_price = request.json.get("proprice")pro_address = request.json.get("proadd")p1.product_name = pro_namep1.product_kind = pro_kindp1.product_price = pro_pricep1.product_address = pro_addressdb.session.add(p1)db.session.commit()return generate_response(msg="modify success!")else:return generate_response(msg="no such product!", code=1012)def delete(self, id):p2 = ProductInfo.query.get(id)if p2:db.seesion.delete(p2)db.session.commit()return generate_response(msg="delete success!")else:return generate_response(msg="delete failed!", code=1013)# 路由
api.add_resource(ProductView, "/product")
api.add_resource(ProductView, "/product/<id>", endpoint="productid")
不做前后端分离的项目的话:直接返回网页 web开发模式:MVC(model数据模型+view视图用户界面+control控制路由查找)
flask – MTV模型(M-model,T-template,V-view),写网站(Jinjia模板引擎)
router/view01.py
#render_template()函数:页面渲染
import render_template
@view01_bp.route("index2")
def index2():return render_template("index.html", message = "hello k8s")
templates/index.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
{{ message }}
<img src="/static/images/k8s.jpg">
</body>
</html>

使用bootstrap4实例:
router/product_view/product.py
添加
import render_templatereturn render_template("product.html", prolist=result2)
访问http://127.0.0.1:9000/v1/product/get

templates/product.html
在body加入
<table class="table"><th><td>产品名称</td><td>产品种类</td><td>产品价格</td><td>产品产地</td></th>{% for pro in prolist %}<tr><td></td><td>{{ pro["product_name"] }}</td><td>{{ pro["product_kind"] }}</td><td>{{ pro["product_price"] }}</td><td>{{ pro["product_address"] }}</td></tr>{% endfor %}</table>

加按钮,且利用url_for()通过endpoint找url
templates/product.html
<td>操作</td>
<td><button type="button" class="btn btn-light"><a href="{{ url_for('product_bp.productdelete', id = pro.product_id) }}">删除</a></button></td>
router/product_view/product2.py
@product_bp.route("/product2/delete", methods=['GET'])
def productdelete():id = request.args.get("id")p2 = ProductInfo.query.get(id)if p2:db.session.delete(p2)db.session.commit()return render_template("product.html",msg="delete success!")else:return generate_response(msg="no such product", code=6)
添加增加功能
router/product_view/product2.py
@product_bp.route("/product2/add" ,methods=['GET','POST'])
def productadd():# 接收客户端的传递pro_name = request.form.get("proname")pro_kind = request.form.get("prokind")pro_price = request.form.get("proprice")pro_address = request.form.get("proadd")proinfo = ProductInfo(product_name = pro_name,product_kind = pro_kind,product_price = pro_price,product_address = pro_address)# 生效到数据库db.session.add(proinfo)db.session.commit()return render_template("product_add.html")
templates/product_add.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" type="text/css" href="/static/css/bootstrap.css">
</head>
<body>
<form method="post"><div class="form-group row"><label for="inputPassword" class="col-sm-2 col-form-label">产品名称</label><div class="col-sm-10"><input class="form-control" name="proname"></div></div><div class="form-group row"><label for="inputPassword" class="col-sm-2 col-form-label">产品类型</label><div class="col-sm-10"><input class="form-control" name="prokind"></div></div><div class="form-group row"><label for="inputPassword" class="col-sm-2 col-form-label">产品价格</label><div class="col-sm-10"><input class="form-control" name="proprice"></div></div><div class="form-group row"><label for="inputPassword" class="col-sm-2 col-form-label">产品产地</label><div class="col-sm-10"><input class="form-control" name="proadd"></div></div><input type="submit" value="新增"><input type="reset" value="取消">
</form>
</body>
</html>
为什么用orm?什么是orm?
对象关系映射,它不需要和复杂的sql语句打交道,直接操控对象就是操控数据库,把表映射为类,把字段映射为属性,每一行记录映射为对象,提高我们开发的速度,方便开发。
可以不用,我们用过pymysql去创建sql语句去做的。
对象关系映射(Object Relational Mapping,简称ORM)是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。它通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
ORM的由来:面向对象是从软件工程基本原则(如耦合、聚合、封装)的基础上发展起来的,而关系数据库则是从数学理论发展而来的,两套理论存在显著的区别。为了解决这个不匹配的现象,对象关系映射技术应运而生。
简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。 ORM提供了实现持久化层的另一种模式,它采用映射元数据来描述对象关系的映射,使得ORM中间件能在任何一个应用的业务逻辑层和数据库层之间充当桥梁。
什么是restful?
一种接口规范也是一种接口设计风格,一般来说api的设计都会遵循,他是表现层状态转移,它将每一类数据看做成资源,每一类资源又为其设计一种url,这种资源的增删改查通过http的动作(get post put delete)等方法来实现
RESTful是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。它适用于移动互联网厂商作为业务使能接口的场景,实现第三方OTT调用移动网络资源的功能。
在RESTful中,每个资源都有一个唯一的URL,可以通过HTTP请求来获取或修改该资源的状态。RESTful采用了一种无状态协议,即服务器不维护与客户端的连接状态,每个请求都是独立的。这种无状态协议使得RESTful更加灵活和可扩展,可以轻松地支持并发请求和负载均衡。
RESTful的核心思想是将网络资源视为一种状态,并通过HTTP协议来传输和操作这些状态。在RESTful中,每个资源都有一个唯一的URL,可以通过HTTP请求来获取或修改该资源的状态。客户端使用GET、POST、PUT、DELETE4个表示操作方式的动词对服务端资源进行操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。
统一接口返回
也是restful接口返回的一种规范,返回json数据,返回data,code,message。
相关文章:
【自学开发之旅】Flask-restful-Jinjia页面编写template-回顾(五)
restful是web编程里重要的概念 – 一种接口规范也是一种接口设计风格 设计接口: 要考虑:数据返回、接收数据的方式、url、方法 统一风格 rest–表现层状态转移 web–每一类数据–资源 资源通过http的动作来实现状态转移 GET、PUT、POST、DELETE path…...
input 的 placeholder 样式
::placeholder 伪元素 这个伪元素可以改变 input、textarea 占位文本的样式。 input::placeholder {color: green; }完整的兼容性写法: input {&::-webkit-input-placeholder, /* WebKit browsers*/ &:-moz-input-placeholder, /* Mozilla Firefox 4 to …...
4.4-Spring源码循环依赖终极讲解
回顾上期内容 new 容器 new AnnotateBeanDefinitionReader 的时候创建很多创世纪的类,其中有一个ConfigurationPostProcessor是用来解析配置类的,将其注册起来存到Bean定义的Map中【这个类是基于Bean工厂后置处理器的】 这一步是将配置类注册到Bean定…...
腾讯云4核8G服务器选CVM还是轻量比较好?价格对比
腾讯云4核8G云服务器可以选择轻量应用服务器或CVM云服务器标准型S5实例,轻量4核8G12M服务器446元一年,CVM S5云服务器935元一年,相对于云服务器CVM,轻量应用服务器性价比更高,轻量服务器CPU和CVM有区别吗?性…...
数学实验-素数(Mathematica实现)
一、实验名称:素数 二、实验环境:Mathematica 10.3软件 三、实验目的:本实验将探讨素数的规律,研究素数的判别、最大的素数、构成生成素数的公式和素数的分布,并学会求解某些范围内的素数。 四、实验内容、步骤以及…...
Vue3样式绑定
文章目录 Vue3样式绑定1. class 属性绑定1.1 v-bind:class 设置一个对象,从而动态的切换 class1.2 在对象中传入更多属性用来动态切换多个 class1.3 直接绑定数据里的一个对象1.4 绑定一个返回对象的计算属性。这是一个常用且强大的模式1. 5 数据语法1.6 errorClass…...
【深度学习】 Python 和 NumPy 系列教程(廿二):Matplotlib详解:2、3d绘图类型(8)3D饼图(3D Pie Chart)
一、前言 Python是一种高级编程语言,由Guido van Rossum于1991年创建。它以简洁、易读的语法而闻名,并且具有强大的功能和广泛的应用领域。Python具有丰富的标准库和第三方库,可以用于开发各种类型的应用程序,包括Web开发、数据分…...
数仓主题域和数据域、雪花模型,星型模型和星座模型
数仓模型和领域划分 一、主题域和数据域的差别二、雪花模型,星座模型和星型模型 一、主题域和数据域的差别 明确数据域作为数仓搭建的重要一环,能够让数仓的数据便于管理和应用。 数据域和主题域都是数据仓库中的重要概念,但含义略有不同&am…...
黑马头条 热点文章实时计算、kafkaStream
热点文章-实时计算 1 今日内容 1.1 定时计算与实时计算 1.2 今日内容 kafkaStream 什么是流式计算kafkaStream概述kafkaStream入门案例Springboot集成kafkaStream 实时计算 用户行为发送消息kafkaStream聚合处理消息更新文章行为数量替换热点文章数据 2 实时流式计算 2…...
数据分析:利用gpt进行归因分析
prompt: 你是某电商平台的一名数据分析师,发现昨日的GMV环比下降了5%,请对这数据变动做出归因。 output: 在电商行业中,GMV(总销售额)是一个非常重要的指标,用于衡量业务的整体健康…...
Python工程师Java之路(p)Module和Package
文章目录 1、Python的Module和Package2、Java的Module和Package2.1、Module2.1.1、分模块开发意义2.1.2、模块的调用 2.2、Package Module通常译作模块,Package通常译作包 1、Python的Module和Package Python模块(Module):1个以.…...
某计费管理系统任意文件读取漏洞
文章目录 声明一、漏洞描述二、漏洞复现声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 一、漏洞描述 蓝海…...
LeetCode:1929.数组串联
1929. 数组串联 来源:力扣(LeetCode) 链接: https://leetcode.cn/problems/concatenation-of-array/description/ 给你一个长度为 n 的整数数组 nums 。请你构建一个长度为 2n 的答案数组 ans ,数组下标 从 0 开始计数 ,对于所有 0 < = i < n 0 <= i < n …...
记录:移动设备软件开发(activity组件)
目录 前言Android简介和发展Android应用的基本组件介绍Activity组件Activity简介Activity的状态和生命周期 小结 前言 移动设备软件开发是指为智能手机、平板电脑等移动设备设计和开发应用程序的过程。移动设备软件开发涉及多种技术、平台和工具,例如Android、iOS、…...
Redis常用应用场景
Redis是一款开源的基于内存的键值存储系统,它提供了多种数据结构和丰富的功能,适用于各种不同的应用场景。以下是Redis常用的应用场景: 1.缓存:Redis最常见的用途就是作为缓存。由于Redis存储在内存中,读取速度非常快…...
grafana 监控无图解决
环境 k8s 1.26.0 helm 部署的prometheus charts为 prometheus-community/kube-prometheus-stack 问题 部署上之后,发现grafana很多dashboard无图。 处理过程 进grafana dashboards 任意选取一张有问题的图,查看查询语句,如下 sum(container_memory_rss{job="kube…...
Linux--进程-消息队列
一、 消息队列,是消息的链接表,存放在内核中。一个消息队列有一个人标识符(及队列ID)来标识。 1、特点: ①、消息队列是面向记录的,其中的消息具有特定的格式以及待定的优先级。 ②、消息队列独立与发送与…...
MySQL下载安装环境变量配置,常用命令
一、下载安装 mysql官网 下载连接 这个是下载图形安装 https://dev.mysql.com/downloads/installer/ 这个是下载免图形安装 https://dev.mysql.com/downloads/mysql/ 担心个别宝宝没有账号,这边也提供一下,方便下载: 账户:1602404…...
HSRP(热备份路由选择协议)的概念,原理与配置实验
作者:Insist-- 个人主页:insist--个人主页 梦想从未散场,传奇永不落幕,持续更新优质网络知识、Python知识、Linux知识以及各种小技巧,愿你我共同在CSDN进步 目录 一、了解HSRP协议 1. 什么是HSRP协议 2、HSRP协议的…...
数据可视化大屏模板 | 保姆级使用教程
近来很多朋友私信咨询怎么下载使用数据可视化大屏模板,在这里就给大家做一个相对简单的教程总结。有需要的朋友记得先收藏保存,以便不时之需。 数据可视化大屏制作软件:奥威BI系统 数据可视化报表模板板块:模板秀 主要操作&…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...
实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...
