【自学开发之旅】Flask-restful-Jinjia页面编写template-回顾(五)

2023-11-04

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_name
            p1.product_kind = pro_kind
            p1.product_price = pro_price
            p1.product_address = pro_address

            db.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_template


return 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。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【自学开发之旅】Flask-restful-Jinjia页面编写template-回顾(五) 的相关文章

  • 如何在GPU支持下运行python代码

    我创建了一个 Flask 服务 用于接受以相机 URL 作为参数的请求 用于在相机框架中查找对象 桌子 椅子等 我已经在 Flask 中编写了用于接受 POST 请求的代码 app route rest detectObjects meth
  • 如何从本地模式下运行的 pyspark 中的 S3 读取数据?

    我正在使用 PyCharm 2018 1 使用 Python 3 4 并通过 virtualenv 中的 pip 安装 Spark 2 3 本地主机上没有安装hadoop 因此没有安装Spark 因此没有SPARK HOME HADOOP
  • 使用gunicorn和环境变量运行flask应用程序

    对于本地开发 我只需设置包含必要变量的 env 文件 然后运行应用程序 Flask run 一切看起来都很好 所有环境变量都在应用程序中正确读取和设置 但是 当我使用 Gunicorn 运行应用程序时 gunicorn api app bi
  • 反转 Python 整数的位

    给定一个十进制整数 例如 65 如何反转 Python 中的底层位 即以下操作 65 01000001 10000010 130 看来这个任务可以分为三步 将十进制整数转换为二进制表示形式 反转位 转换回十进制 第 2 步和第 3 步看起来
  • 扭曲的日志记录到屏幕(标准输出)不起作用

    我有这个小程序取自这里 https twistedmatrix com documents 16 3 0 core howto logger html usage for emitting applications from twisted
  • 在 opencv 中一次性将旋转和平移结合起来

    我有一段用于旋转和平移图像的代码 Point2f pt 0 in rows double angle atan trans c trans b 180 M PI Mat r getRotationMatrix2D pt angle 1 0
  • 字符串中数字的连续相加

    我是一名正在学习 python 的新程序员 并且在如何完成此任务方面遇到了困难 所以本质上我有一个从文件导入的数字字符串需要读取 并且需要将第一个数字的总和添加到第二个数字并将其转换为正确的 ascii 字符 因此 例如 如果我正在读取字符
  • 将 Python 字典中的键替换为唯一值

    a 0 PtpMotion 1 PtpMotion 2 LinMotion 3 LinMotion 4 LinMotion 5 LinMotion 6 LinMotion 7 LinMotion 8 LinMotion 9 PtpMotio
  • 组内条件计数

    我想在之后进行条件计数groupby 例如 按列的值分组A 然后计算每组中值出现的频率5出现在列中B 如果我整个过程都这样做DataFrame 只是len df df B 5 所以我希望我能做到df groupby A df B 5 siz
  • 将 Python 列表(JSON 或其他)插入 MySQL 数据库

    所以我在Python中有一堆数组数据 嗯 相反 我有一个清单 我试图将此数组存储到 MySQL 数据库中的单个单元格中 我尝试使用 JSON 来序列化我的数据 但也许我不明白 JSON 是如何工作的 因此 在连接到我的数据库后 我尝试了上游
  • 增加 sigmoid 预测输出值?

    我创建了一个用于文本分类的 Conv1D 模型 当在最后一个密集处使用 softmax sigmoid 时 它产生的结果为 softmax gt 0 98502016 0 0149798 sigmoid gt 0 03902826 0 00
  • 字段“id”期望一个数字,但得到“natsu”django

    我想创建一个 user posts 视图 其中包含与特定用户相关的所有帖子 假设有用户 Natsu 撰写的博客帖子 那么登录用户 Testuser 将能够查看所有帖子由该用户发布 即用户 Natsu 的所有帖子 blog models py
  • 如何在Python Selenium中获取WebElement的类名?

    我使用 Selenium WebDriver 来抓取从网页中获取的 用 JavaScript 编写的表格 我正在迭代表行列表 每行可能属于不同的类别 我想获取此类的名称 以便我可以为每一行选择适当的操作 table body table f
  • Django Rest框架Json解析

    我想解析传入的POSTdjangoviews py 文件中的数据 发布数据 number 17386372 data banana apple grapes 这是我尝试读取上述传入数据的方法request views py class Fr
  • 将连续行与相同的列值合并

    我有一个看起来像这样的东西 我该如何处理 0 d 0 The DT 1 Skoll ORGANIZATION 2 Foundation ORGANIZATION 3 4 based VBN 5 in IN 6 Silicon LOCATIO
  • 仅将唯一行插入 SQLite (python)

    我在用着cursor executemany将 CSV 文件中的批量行插入到 SQLite 表中 根据主键字段 其中一些行预计会重复 当我执行该命令时 可以预见的是 我会收到完整性错误 并且不会插入任何内容 如何有选择地仅插入非重复行 而无
  • 带有远程解释器的 Python 控制台无法在 PyCharm 中接受输入

    我是使用 PyCharm 进行远程开发的新手 我设置了一个远程环境 除了一个例外之外它工作正常 无法在控制台中接受用户输入 在控制台中运行以下语句时 控制台被阻塞 提示 上一个命令仍在运行 请等待或按控制台中的 Control C 来中断
  • 如何在我的 heroku 应用程序上安装软件包?

    我有一个使用 Shortuuid 的应用程序 https pypi python org pypi shortuuid 0 1 https pypi python org pypi shortuuid 0 1 当我使用 runapp py
  • 对象对于所需数组来说太深 - scipy.integrate.odeint

    我昨天刚开始使用Python 使用时遇到错误scipy integrate odeint 我定义了一个函数 def SIR x t beta gamma mu M 这需要numpy array物体x t and M 标量浮动beta gam
  • gis计算点和多边形/边界之间的距离

    我想使用 python 计算一个点到一个国家边界之间的距离shapely 它应该工作得很好 point distance poly 例如在这里展示查找多边形形状上最近点的坐标 https stackoverflow com question

随机推荐

  • Win10专业版系统Docker安装、配置和使用详细教程

    一 win10专业版系统首先需要开启硬件虚拟化及Hyper V功能 才能进行Docker for Windows软件安装 如何开启硬件虚拟化 自行百度 可在任务栏中查看虚拟化是否开启 win10系统 打开控制面板 应用 程序和功能 开启Hy
  • postman——集合——执行集合——迭代运行集合

    网址 https learning getpostman com docs postman collection runs starting a collection run 开始收集运行 集合是一组请求 可以在对应的环境下作为一系列请求一
  • 前后端接口规范

    原文地址 https github com f2e journey treasure blob master api md 前后端接口规范 随着前后端分离越来越普遍 后端接口规范也就越来越重要了 一套良好的接口规范可以提升工作效率 减少沟通
  • Java-线程同步

    Java 线程同步 在Java中 我们通过同步机制 来解决线程的安全问题 实现线程安全的三种方法 1 同步代码块 synchronized 同步监视器 需要被同步的代码 说明 操作共享数据的代码 即为需要被同步的代码 gt 不能包含代码多了
  • 基于Python+Django的项目实战-信息安全领域中语义搜索引擎的设计与实现(附源码+论文)

    大家好 我是职场程序猿 感谢您阅读本文 欢迎一键三连哦 当前专栏 基于Python的毕业设计 精彩专栏推荐 微信小程序毕业设计 安卓app毕业设计 Java毕业设计 信息安全领域中语义搜索引擎的设计 django 演示 源码及论文下载地址
  • 前端复习HTML+CSS+JavaScript(必问面试题)

    前端复习 HTML 常见的几种图片格式以及他们之间的区别是什么 JPG 支持有损压缩 不支持透明 不支持动画 色彩还原度较好 PNG 不支持压缩 支持透明 半透明 不透明 不支持动画 GIF 支持有损压缩 不支持全透明 支持半透明 支持动画
  • Java 接入微信支付API V3 接口开发案例

    关于API v3 为了在保证支付安全的前提下 带给商户简单 一致且易用的开发体验 我们推出了全新的微信支付API v3 相较于之前的微信支付API 主要区别是 遵循统一的REST的设计风格 使用JSON作为数据交互的格式 不再使用XML 使
  • C02_02 Python笔记备份 变量

    author Liu Shao Ji encoding utf 8 字符串赋值到变量 再打变量打印出来 message Hello Python world print message 尝试在Hello world py中使用一个变量 在这
  • 如何在微信小程序中生成二维码:一个最简单的案例就让你明白

    使用weapp qrcode js 在 微信小程序 中 快速生成二维码 一 效果 二 具体步骤 代码 下载weapp qrcode代码 然后 将 dist 目录下的weapp qrcode esm js 复制到项目目录中 这里是utils目
  • 泰勒公式的展开细节解析(转载)

    转载自 https blog csdn net dog250 article details 76697167 上周写完了 三体 读后思考 泰勒展开 维度打击 黑暗森林 后收到一些邮件 进一步思考了关于泰勒展开的意义 也许我掌握的那些网络技
  • [4G&5G专题-5]:RRU 全面了解什么是4G+5G RF动态频谱共享?

    前言 建议在了解动态频谱DSS之前 前先了解 5G专题 4 RRU 全面了解什么是4G 5G RF静态射频共享 4G 5G专题 4 RRU 全面了解什么是4G 5G RF静态射频共享 文火冰糖的硅基工坊的博客 CSDN博客 rru设计原理与
  • 安卓在ecplise的问题

    Description Resource Path Location Type AndroidManifest xml file missing This is build issue Go to Menu in eclipse Proje
  • 【编程测试题】头条校招

    题目描述 头条的2017校招开始了 为了这次校招 我们组织了一个规模宏大的出题团队 每个出题人都出了一些有趣的题目 而我们现在想把这些题目组合成若干场考试出来 在选题之前 我们对题目进行了盲审 并定出了每道题的难度系统 一场考试包含3道开放
  • 用python实现简易控制台五子棋小游戏

    finish False 游戏是否结束 flagNum 1 当前下棋者标记 flagch 当前下棋者棋子 x 0 当前棋子的横坐标 y 0 当前棋子的纵坐标 print 033 1 37 41m 简易五子棋游戏 控制台版 033 0m 棋盘
  • python生成器的实现及原理

    1 迭代 一个接一个读取列表中的值 这个过程叫迭代 案例 mylist1 1 2 3 for v in mylist1 print v end print mylist2 x x for x in range 5 for v in myli
  • STM32F103(六)——定时器中断

    定时器原理与例程 1 定时器基本原理 1 1 三种定时器的区别 1 2 通用定时器的主要特点 1 3 通用定时器的3种计数器模式 1 4 通用定时器工作过程 1 5 定时器的内部时钟配置 2 定时器中断实验 2 1 常见库函数 2 2 定时
  • Notepad++正则命令全解 -- 小黑超细详解

    notepad 为文本编辑器工具 是windows的一款免费开源工具 功能有很多吧 还可以运行脚本 倒是也没有具体去研究 不过用起来挺方便的 记录一下平常使用会用到的吧 下载 Notepad GitHub 目录 举一个栗子 简单使用正则 正
  • Qt中多个单选按钮信号连接到同一个槽函数

    当多个类似信号需要连接到同一个槽函数时 在槽函数内需要对信号的来源进行判断 这里主要是采用sender 函数 此函数会返回信号来源的方向 让我们来看看效果 接下来是具体的代码 首先添加3个RadioButton 并且连接到同一个槽函数 QS
  • 软件工程——第13章软件项目管理知识点整理(完结)

    本专栏是博主个人笔记 主要目的是利用碎片化的时间来记忆软工知识点 特此声明 文章目录 1 管理的定义 2 软件项目管理地位 重要性
  • 【自学开发之旅】Flask-restful-Jinjia页面编写template-回顾(五)

    restful是web编程里重要的概念 一种接口规范也是一种接口设计风格 设计接口 要考虑 数据返回 接收数据的方式 url 方法 统一风格 rest 表现层状态转移 web 每一类数据 资源 资源通过http的动作来实现状态转移 GET