Python轻量级Web框架Flask(12)—— Flask类视图实现前后端分离

0、前言:

  • 在学习类视图之前要了解前后端分离的概念,相对于之前的模板,前后端分离的模板会去除views文件,添加两个新python文件apis和urls,其中apis是用于传输数据和解析数据 的,urls是用于写模板路径的。

1、Flask类视图和RESTful(前后端分离)

  • 前后端不分离:在之前用到的render_template(‘index.html’, users=users),这种的就是前后端不分离,这种方式在前后端进行数据交互的时候会非常方便,可以直接把后端数据传递给前端。
  • 前后端分离:后端会返回json字符串,前端使用ajax来请求数据。一般app就是通过前后端分离开发的,后端写后端的数据,前端写前端的数据,互不牵扯。app开发中,使用者手机中的是前端代码,后端代码是存放在服务器当中的。
  • HTTP请求方式:
    • GET :主要用来获取数据(网页请求获取服务器的数据)
    • POST :主要用来新增数据(网页向服务器提交数据)
    • PUT :主要用来修改数据(网页向服务器发送修改数据请求)
    • DELETE :主要用来删除数据(网页向服务器发送删除数据请求)
  • Flask类视图和RESTful主要服务于前后端分离,如果前后端不分离,就使用render_templlate。
    在这里插入图片描述
    • Flask-RESTful是一种Flask插件
    • 字段格式化:用来规定返回给前端的数据格式,更加规范。
      在这里插入图片描述
    • Url:也是fields中的一个返回数据类型
      在这里插入图片描述
    • 参数解析:前端传递数据过来,需要做参数解析
  • 举例:通过下面的例子可以实现简单的前后端分离,了解如何通过类视图和RESTful实现前后端分离。
    项目概览:
    在这里插入图片描述

__ init __:

# __init__.py : 初始化文件,创建Flask应用
from flask import Flask
from .exts import init_exts
from .urls import *

def creat_app():
    app = Flask(__name__)


    # 配置数据库(配置不同数据库软件,就要用不同配置,配置的目的,就是在用到数据库的时候让项目知道找什么数据库,去哪找数据库)
    db_uri = 'sqlite:///sqlite3.db'
    # db_uri = 'mysql+pymysql://root:123456@localhost:3306/flaskdb' # mysql的配置
    app.config['SQLALCHEMY_DATABASE_URI'] = db_uri
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  # 禁止对象追踪修改(为了不浪费服务器资源进行的设置)

    # 初始化插件
    init_exts(app=app)

    return app

apis:

from flask import jsonify
from flask_restful import Resource, fields, marshal_with, reqparse
from .models import *

# 字段格式化---------------------------------
user_fields = {
    'name' : fields.String,
    'age' : fields.Integer
}
# 在字段格式化时嵌入另一个字段格式化
ret_fields = {
    'status' : fields.Integer,
    'msg' : fields.String,
    'user' : fields.Nested(user_fields),
    'url' : fields.Url(endpoint='id',absolute=True) # 在urls中endpoint='id'写在哪,url就是哪个根路径
}
# 如果获取多个对象列表就要嵌入下面格式化方法
ret_fields2 = {
    'status' : fields.Integer,
    'msg' : fields.String,
    'user' : fields.List(fields.Nested(user_fields))
}
# ---------------------------------字段格式化---------------------------------
# 没有加字段格式化
class UserResource(Resource):
    def get(self):
        return {
            'status' : 1,
            'msg' : 'ok',
            'data' : '千峰教育python',
        }
# 添加字段格式化(导入一个数据库对象)
class Usera(Resource):
    @marshal_with(ret_fields)
    def get(self):
        user = User.query.first()
        return {
            'status' : 1,
            'msg' : 'ok',
            'data' : '千峰教育python',
            'user' : user
        }
# 没有加字段格式化(导入多个数据库对象)
class Usera1(Resource):
    @marshal_with(ret_fields2)
    def get(self):
        user = User.query.all()
        return {
            'status' : 1,
            'msg' : 'ok',
            'data' : '千峰教育python',
            'user': user
        }

# --------------------------------- 参数解析---------------------------------
# 参数解析: 主要解析前端发送过来的数据,对前端发送过来的数据做一些限制
parse = reqparse.RequestParser()
parse.add_argument('name', type=str, required=True, help='name is must!') # required=True表示该参数必须传递
parse.add_argument('age', type=int, action='append') # action=append表示这个参数可以传多个

class Usera2(Resource):
    def get(self):
        # 获取参数
        args = parse.parse_args()
        name = args.get('name')
        age = args.get('age')

        return {'name':name,'age':age} # 返回获取的参数

exts:

from flask_sqlalchemy import SQLAlchemy # orm技术
from flask_migrate import Migrate # 数据迁移技术
from flask_restful import Api

db = SQLAlchemy()
migrate = Migrate()
api = Api()

def init_exts(app):
    db.init_app(app=app)
    migrate.init_app(app=app, db=db)
    api.init_app(app=app)

models:

# models.py : 模型,数据库
'''
    模型      ===      数据库
    类        ——>     表结构
    类属性     ——>    表字段
    一个对象   ——>    表的一行数据
'''
from .exts import db # 导入db对象就能通过python实现ORM技术,避免了写SQL语句。

# 模型Model:类
# 必须继承 db.Model User才能从普通的类变成模型
class User(db.Model):
    # 表名
    __tablename__ = 'user'   # 数据迁移就是让模型变成表,ORM就是让类变成模型
    # 定义表字段
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30), unique=True)
    age = db.Column(db.Integer, default=1)
    # 通过orm技术得到的db,就是用于替代数据库,后面用到数据库相关操作,可以检索。

urls:

# urls是路由文件
from .exts import api
from .apis import *

# 路由
api.add_resource(UserResource, '/UR/', endpoint='id') # 这里endpoint和apis中endpoint是id的路径关联
api.add_resource(Usera, '/U/')
api.add_resource(Usera1, '/U1/')
api.add_resource(Usera2, '/U2/')

app:

# Flask类试图和restful
from App import creat_app

app = creat_app()


if __name__ == '__main__':
    app.run(debug=True)

假前端:

import requests

# res1 = requests.get('http://127.0.0.1:5000/hello/')
# res2 = requests.post('http://127.0.0.1:5000/hello/')
a = requests.get('http://127.0.0.1:5000/U2/',
                 json={'name':'zhangsan','age':12},
                 headers={'Content-Type':'application/json'}
                 )
print(a.text)

总结:

1、前后端分离的Flask模板相对于前后端不分离的模板而言,少了views这个文件,它相当于把views这个文件的功能分配到了apis和urls这两个文件中。apis主要写的是接口,urls主要写接口路由。
2、在api文件中字段格式化的作用是定义返回给前端的数据格式。
3、在api文件中参数解析的作用是解析前端发送过来的数据。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

终于有人把无人机5G通信原理讲清楚了

在现代科技快速发展的背景下,无人机技术在各个领域都有了广泛应用,从送外卖到农业监控,无人机正变得越来越普遍。然而,无人机的效能很大程度上受到其通信系统的限制,尤其是在城市这种高楼林立、障碍物众多的环境中。为…

五一旅游必备物品清单 建议把这份清单记在备忘录

五一小长假就要来临,相信很多人已经跃跃欲试,准备带着家人或朋友外出旅游,享受这难得的休闲时光。出游总是让人兴奋不已,但带小孩出游,行李准备可是一项大工程。为了让旅程更加顺利,提前列一份必备物品清单…

Python绘制3D曲面图

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 探索Python中绘制3D曲面图的艺术 在数据可视化的世界中,3D曲面图是一种强大的工…

压铸机PQ控制阀比例放大器

压铸机PQ控制阀比例放大器是确保压铸机正常工作的重要组成部分,它通常由多种液压元件组成,负责提供动力和控制系统中各个部件的运动。液压系统通过液体(通常是油)传递压力能,以驱动机械装置工作。在压铸机中&#xff0…

ElasticSearch教程入门到精通——第五部分(基于ELK技术栈elasticsearch 7.x+8.x新特性)

ElasticSearch教程入门到精通——第五部分(基于ELK技术栈elasticsearch 7.x8.x新特性) 1. Elasticsearch集成1.1 框架集成-SpringData-整体介绍1.2 Spring Data Elasticsearch 介绍1.3 框架集成-SpringData-代码功能集成1.3.1 创建Maven项目1.3.2 修改po…

[C++] 类和对象 _ 剖析构造、析构与拷贝

一、构造函数 构造函数是特殊的成员函数,它在创建对象时自动调用。其主要作用是初始化对象的成员变量(不是开辟空间)。构造函数的名字必须与类名相同,且没有返回类型(即使是void也不行)。 在C中&#xff0…

Yolov5简单部署(使用自己的数据集)

一.注意事项 1.本文主要是引用大佬的文章(侵权请联系,马上删除),做的工作为简单补充 二.正文 1.大体流程按照 准备:【简单易懂,一看就会】yolov5保姆级环境搭建_哔哩哔哩_bilibili 主要过程&#xff1…

Java | Leetcode Java题解之第55题跳跃游戏

题目&#xff1a; 题解&#xff1a; public class Solution {public boolean canJump(int[] nums) {int n nums.length;int rightmost 0;for (int i 0; i < n; i) {if (i < rightmost) {rightmost Math.max(rightmost, i nums[i]);if (rightmost > n - 1) {retu…

VitePress 构建的博客如何部署到 github 平台?

VitePress 构建的博客如何部署到 github 平台&#xff1f; 1. 新建 github 项目 2. 构建 VitePress 项目 2.1. 设置 config 中的 base 由于我们的项目名称为 vite-press-demo&#xff0c;所以我们把 base 设置为 /vite-press-demo/&#xff0c;需注意前后 / export default…

tidb离线本地安装及mysql迁移到tidb

一、背景&#xff08;tidb8.0社区版&#xff09; 信创背景下不多说好吧&#xff0c;从资料上查tidb和OceanBase“兼容”&#xff08;这个词有意思&#xff09;的比较好。 其实对比了很多数据库&#xff0c;有些是提供云服务的&#xff0c;有些“不像”mysql&#xff0c;综合考虑…

uniapp:K线图,支持H5,APP

使用KLineChart完成K线图制作,完成效果: 1、安装KLineChart npm install klinecharts2、页面中使用 <template><view class="index"><!-- 上方选项卡 --><view class="kline-tabs"><view :style="{color: current==ite…

Windows使用bat远程操作Linux并执行命令

背景&#xff1a;让客户可以简单在Windows中能自己执行 Linux中的脚本&#xff0c;傻瓜式操作&#xff01; 方法&#xff1a;做一个简单的bat脚本&#xff01;能远程连接到Linux&#xff0c;并执行Linux命令&#xff01;客户双击就能使用&#xff01; 1、原先上网查询到使用P…

深度学习:基于Keras框架,使用神经网络模型对葡萄酒类型进行预测分析

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

《Fundamentals of Power Electronics》——全桥型隔离降压转换器

以下是关于全桥型隔离降压转换器的相关知识点&#xff1a; 全桥变压器隔离型降压转换器如下图所示。 上图展示了一个具有二次侧绕组中心抽头的版本&#xff0c;该电路常用于产生低输出电压。二次侧绕组的上下两个绕组可以看作是两个单独的绕组&#xff0c;因此可以看成是具有变…

CSS-复合选择器

作用&#xff1a; 后代选择器&#xff1a; 子代选择器 并集选择器 用逗号隔开&#xff0c;在style里面写的时候&#xff0c;每一个标签空一行。 <title>Document</title><style>p,div,span{color: aqua;}</style> </head> <body><p>…

Java对象在堆和栈上的存储(对象布局,待完善)

0、前言 这里提到的 Java 对象不仅仅包含引用类型&#xff08;Object&#xff09;&#xff0c;还包含基本数据类型&#xff08;boolean、int、long、float、double&#xff09;。文中部分图片来源于 B站 黑马程序员。 1、在栈上的数据存储 1.1、局部变量 局部变量包含以下情…

C++:map和set的封装

关于红黑树的模拟实现&#xff0c;大家不清楚的先去看看博主的博客再来看这篇文章&#xff0c;因为set和map的封装底层都是利用用的红黑树。所以这里不会过多介绍红黑树的相关内容&#xff0c;而更多的是去为了契合STL中的红黑树去进行改造&#xff0c;让封装的set和map能够去复…

【Java】Java基础 使用集合实现斗地主分牌

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 今天使用集合TreeSet来实现一个斗地主的分牌流程。 TreeSet集合的一个特点就是 元素有序&#xff0c;这样就方便我们分的牌自动排序。 0.思路 1.创建玩家手牌集合 我们到时候分的牌都存储在这里&#xff0c;但你可能会…

华为静音模式指定联系人来电响铃

华为静音模式指定联系人来电响铃 本人7年水果转华为&#xff0c;手机常年静音但是还是想收到指定人来电的。水果这个地方做的是很方便的&#xff0c;直接添加紧急联系人&#xff0c;什么声音都没有&#xff0c;只有指定人的电话铃声 直接上结论&#xff0c;华为是不支持直接这样…

关于google search console工具提交sitemap.xml无法抓取的问题解决办法

其实这个问题很好解决。 第一种情况&#xff1a;利用工具为我们的网站自动生成静态的sitemap.xml文件。这种可以检查下是否完整&#xff0c;然后上传到根目录下去&#xff0c;再去google search console提交我们的网站地图。 第二种情况&#xff1a;同样利用工具自动生成动态s…