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

news2024/11/17 5:31:12

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。

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

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

相关文章

Tomcat修改配置文件

1.Tomcat启动乱码问题 1.1conf目录 说明&#xff1a;找到conf目录下logging.properties文件 1.2打开logging.properties文件 说明&#xff1a;将UTF-8修改成GBK 1.3.效果 2.端口冲突问题 2.1 conf目录 2.2打开 server.xml文件 2.3.修改端口 说明&#xff1a;port指的就是端…

自动化测试框架实战详解

前言 之前文章跟大家分享了一下自己在接口自动化测试中进行测试准备的一些相关知识点&#xff0c;接下来本篇文章详细分享一下接口自动化框架设计的思路总结&#xff0c;希望能对初次探索接口自动化测试的小伙伴们有一些思路上的帮助。 小编是以pythonrequestsunittestHTMLTes…

淘礼金红包检测,规避订单返款/转账资损问题的技术实现方案

先说业务场景&#xff1a;很多电商人在订单转账或返款时&#xff0c;可能会因订单使用了如首单礼金/新品礼金/优惠劵或其他红包类型&#xff0c;导致资金损失问题。如下图所示&#xff1a; 再说解决方案&#xff1a;具体规避这类订单红包的资损&#xff08;返款/转账多返&#…

mount报错NTFS signature is missing

给nvidia AGX orin的开发板加了一个内存条 sudo fdisk -l sudo mount /dev/nvme0n1 /mnt/pan1 #将/dev/nvme0n1挂载到/mnt/pan1 下结果挂载时报错如下&#xff1a; NTFS signature is missing解决方法&#xff0c;给创建一个ntfs即可&#xff1a; sudo mkfs.ntfs /dev/nvme0n…

三勾商城(java+vue3)微信小程序商城+SAAS+前后端源码

项目介绍 本系统功能包括&#xff1a; 前台展示后台管理SAAS管理端&#xff0c;包括最基本的用户登录注册&#xff0c;下单&#xff0c; 购物车&#xff0c;购买&#xff0c;结算&#xff0c;订单查询&#xff0c;收货地址&#xff0c;后台商品管 理&#xff0c;订单管理&…

芯片设计流程

VLSI 代表超大规模集成&#xff08;Very Large Scale Integration&#xff09;&#xff0c;这是一种通过将数百万个晶体管集成到单个芯片中来创建集成电路 (IC) 的技术。超大规模集成电路技术可以生产出紧凑、功能强大且低成本的微处理器、存储芯片、数字信号处理器和其他先进电…

DC系列靶机4通关教程

DC-4 信息收集 扫描主机 arp-scan -l端口扫描 nmap -p- -A 192.168.16.165发现ssh端口和80端口都打开着呢 目录扫描 dirsearch -u http://192.168.16.165dirb hhtp://192.168.16.165登录web网页 发现没有可用信息&#xff0c;发现页面提示admin 爆破 用户密码爆破 使用…

什么是AI数字员工?它能帮我们做什么?

在今年360智脑大模型应用发布会上&#xff0c;360集团创始人周鸿祎再度提到了AI数字员工&#xff0c;他认为AI数字员工将为企业带来一场工作效率革命。在当今数字化和自动化的时代&#xff0c;人工智能&#xff08;AI&#xff09;正在逐渐地融入到各行业&#xff0c;而AI数字员…

《优化接口设计的思路》系列:第二篇—接口用户上下文的设计与实现

系列文章导航 《优化接口设计的思路》系列&#xff1a;第一篇—接口参数的一些弯弯绕绕 《优化接口设计的思路》系列&#xff1a;第二篇—接口用户上下文的设计与实现 前言 大家好&#xff01;我是sum墨&#xff0c;一个一线的底层码农&#xff0c;平时喜欢研究和思考一些技术…

财富潮涌:银行发展绿色经济创新路径

在《玩转金融新“绿”潮&#xff0c;银行纷纷亮大招》内容中&#xff0c;我们带大家了解了商业银行有关绿色信贷产品、绿色债券产品及绿色投资的内容。今天&#xff0c;我们将继续带大家了解商业银行绿色金融实践路径中关于绿色财富、绿色服务和绿色运营的分析。 在绿色金融实…

数字中国背景下,企业数字化转型需要“强IT”

随着科技的快速发展和全球商业环境的不断变化&#xff0c;中国企业对灵活性、创新性、全球化和效率的需求是迫切的&#xff0c;进行数字化转型来支撑企业的业务变革、组织优化已是业界共识。如何根据企业的实际情况进行数字化转型对企业管理层&#xff0c;特别是CIO提出了新的挑…

解决 Axios 跨域问题,轻松实现接口调用

跨域是指访问另外一个域的资源&#xff0c;由于浏览器的同源策略&#xff0c;默认情况下使用 XMLHttpRequest 和 Fetch 请求时是不允许跨域的。跨域的根本原因是浏览器的同源策略&#xff0c;这是由浏览器对 JavaScript 施加的安全限制。 Axios 跨域常见报错 跨域请求被阻止 (…

电子凭证试点深化后,企业如何应对?百望云提供电子凭证一体化解决方案!

今年5月&#xff0c;财政部、税务总局、人民银行、国务院国资委、国家档案局、标准委、国电联办、民航局、国铁集团九单位组织召开电子凭证会计标准深化试点启动会。 电子会计凭证的格式非常多样化&#xff0c;电子会计凭证的处理一直是企业的难点。此次试点工作虽然对企业的财…

SSL证书为什么要选付费?

SSL证书已经越来越多的使用在网站&#xff0c;小程序和APP上&#xff0c;对于保障网络安全&#xff0c;加密数据信息有至关重要的作用。随着SSL证书市场的发展&#xff0c;各种类型的证书产品也在不断丰富&#xff0c;用户在选择SSL证书时&#xff0c;除了可以购买付费证书&…

2023年8月京东白酒行业数据分析(京东数据开放平台)

中秋、国庆“双节”即将到来之际&#xff0c;白酒市场中越来越多的促销手段浮现&#xff0c;除了线下门店&#xff0c;线上电商也推出“百款直降”“限量预约抢购”“百亿补贴”等活动&#xff0c;如习酒消费满额享华为手机&#xff0c;五粮液指定产品满219减120元&#xff0c;…

Spring系列文章:Bean的作⽤域

1、singleton 默认情况下&#xff0c;Spring的IoC容器创建的Bean对象是单例的 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSche…

会声会影2023免费版电脑视频剪辑软件

会声会影视频剪辑软件对硬件配置要求不高&#xff0c;功能强大且涵盖面广&#xff0c;能为用户节省出大量的硬件成本与学习时间成本。大多数用户仅需一周左右的时间就可以掌握会声会影的基本功能模块&#xff0c;会声会影视频剪辑软件&#xff0c;已经拥有了超过20年的品牌历史…

微软hotmail邮箱的存储空间查询

我最近注册了hotmail邮箱&#xff0c;查询到的存储空间如下&#xff1a; 我们关注的存储应该是下面的电子邮箱存储&#xff0c;15 GB&#xff0c;还是比较大的。 而上面的存储是Microsoft账户存储。 我打算用hotmail邮箱以邮件的形式存储一些重要资料。

2024年浙江财经大学MBA招生简章发布:有哪些看点?

2024年研究生招生简章近期正在陆续发布&#xff0c;作为立足浙江十余年的专业机构&#xff0c;杭州达立易考教育带领考生们来认真分析一下各MBA项目的招生政策以及趋势&#xff0c;以方面在接下来的全国研究生考试网报期间顺利选到适合自己的项目&#xff01;本期围绕浙江财经大…

南京融资融券(信用账户)开户利率最低能做到多少?无门槛利率5%!

南京融资融券(信用账户)开户利率最低能做到多少?无门槛利率5%! 信用账户是指一种可以在购物和信贷过程中使用的账户。它通常与信用卡或贷款相关联&#xff0c;在购物或信贷过程中可以使用它来进行支付。 融资融券是一种证券投资方式&#xff0c;可以通过券商开通该服务。以下…