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

news2024/10/7 6:44:51

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文件中参数解析的作用是解析前端发送过来的数据。

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

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

相关文章

merge and rebase

文章目录 什么是merge什么是rebasemerge和rebase的区别操作执行git merge操作git rebase操作冲突解决解决冲突的步骤 Git Merge 和 Git Rebase 都是用于集成来自不同分支的修改的 Git 命令。 什么是merge Git Merge 是将一个分支的改动合并到另一个分支的方式。当你执行一个 m…

Unity 物体触碰事件监听

声明委托 public delegate void MyDelegate(Collider trigger); C# 委托(Delegate) | 菜鸟教程 (runoob.com)https://www.runoob.com/csharp/csharp-delegate.html 定义委托 public MyDelegate onTriggerEnter; public MyDelegate onTriggerStay; pu…

Leetcode—1041. 困于环中的机器人【中等】

2024每日刷题&#xff08;121&#xff09; Leetcode—1041. 困于环中的机器人 实现代码 class Solution { public:bool isRobotBounded(string instructions) {int x 0;int y 0;int d 0;vector<vector<int>> direction{{0, 1}, {1, 0}, {0, -1}, {-1, 0}};for…

C语言阶段的题目解析

前言 我们C语言已经学习的差不多了&#xff0c;但是C语言之中存在的一些问题与难点我们还不一定能够又快又好地解决&#xff0c;为了夯实我们的基础&#xff0c;我们来练习几道稍微有点难度的C语言习题吧 例题一 题目 int main(void) {unsigned char i 7;int j 0;for (; i…

织梦云端:网络信号原理的艺术解码

hello &#xff01;大家好呀&#xff01; 欢迎大家来到我的Linux高性能服务器编程系列之《织梦云端&#xff1a;网络信号原理的艺术解码》&#xff0c;在这篇文章中&#xff0c;你将会学习到网络信号原理以及应用&#xff0c;并且我会给出源码进行剖析&#xff0c;以及手绘UML图…

MQTT数据传输Payload的常见格式介绍

使用MQTT client过程中看到常见的数据格式&#xff1a; 下面是介绍 Plaintext&#xff08;纯文本&#xff09; 介绍&#xff1a;纯文本编码是最基本的编码形式&#xff0c;它使用标准的ASCII或Unicode字符来表示数据。这种编码格式是人类可读的&#xff0c;因为它直接表示文本信…

centos 7使用源码编译安装Python 3.12.2(最新版本)

&#xff08;一&#xff09;、说明 在centos 7上&#xff0c;默认安装出来的python是&#xff1a;2.7.5版本 1.查看python版本&#xff1a; python --version 2.通过yum安装出来的&#xff0c;适合当前操作系统的&#xff0c;最新的python版本是&#xff1a;3.6.8 python3…

C#队列(Queue)的基本使用

概述 在编程中&#xff0c;队列&#xff08;Queue&#xff09;是一种常见的数据结构&#xff0c;它遵循FIFO&#xff08;先进先出&#xff09;的原则。在C#中&#xff0c;.NET Framework提供了Queue<T>类&#xff0c;它位于System.Collections.Generic命名空间下&#x…

Spring事务回滚核心源码解读

记一次Springboot事务超时不回滚的分析过程 在Springboot中&#xff0c;我用的xml进行事务管理&#xff0c;DataSourceTransactionManager作为事务管理器&#xff0c;配置了事务控制在Service层&#xff1b;在事务管理器中&#xff0c;配置了defaultTimeout事务超时时间为5秒&…

RK3588 - RKNN(Rockchip 神经处理单元)的逆向工程

本文翻译自https://jas-hacks.blogspot.com/2024/02/rk3588-reverse-engineering-rknn.html RK3588 NPU 的内部操作和功能主要隐藏在名为RKNPU2的闭源 SDK 中。由于对大型语言模型 (LLM) 的兴趣以及对transform模型最佳矩阵乘法的追求&#xff0c;想了解 RKNPU SDK 新引入的矩阵…

Jetpack Compose简介

文章目录 Jetpack Compose简介概述声明式UI和命令式UIJetpack Compose和Android View对比Compose API设计原则一切皆为函数组合优于继承单一数据源 Jetpack Compose和Android View关系使用ComposesetContent()源码ComposablePreview Jetpack Compose简介 概述 Jetpack Compos…

数据结构-二叉搜索树(BST)

目录 什么是二叉搜索树 二叉搜索树的特性 (1)顺序性 (2)局限性 二叉搜索树的应用 二叉搜索树的操作 (1)查找节点 (2)插入节点 (3)删除节点 (4)中序遍历 什么是二叉搜索树 如图所示&#xff0c;二叉搜索树&#xff08;binary search tree&#xff09;满足以下条件。…

Unity 递归实现数字不重复的排列组合

实现 private void Permutation(List<int> num, int leftIndex, List<string> strs) {if (leftIndex < num.Count){for (int rightIndex leftIndex; rightIndex < num.Count; rightIndex){Swap(num, leftIndex, rightIndex);Permutation(num, leftIndex 1…

【深度学习】【Lora训练1】StabelDiffusion,Lora训练过程,秋叶包,Linux,SDXL Lora训练

文章目录 一、环境搭建指南二、个性化安装流程三、启动应用四、打开web五、开始训练 19.27服务器 一、环境搭建指南 打造一个高效且友好的开发环境&#xff1a; 项目源码获取&#xff1a; 通过以下命令轻松克隆项目及所有子模块至您的Linux系统&#xff1a; git clone --recu…

workminer之dht通信部分

workminer是通过SSH爆破传播的挖矿木马&#xff0c;感染后会释放xmrig挖矿程序利用主机的CPU挖取北方门罗币。该样本能够执行特定的指令&#xff0c;指令保存在一个配置文件config中&#xff0c;config文件类似于xml文件&#xff0c;里面有要执行的指令和参数&#xff0c;样本中…

服务注册与发现Eureka、Zookeeper、Consul 三个注册中心的异同点(CAP理论)

Eureka Eureka是由Netflix开源的一个服务注册和发现组件&#xff0c;它主要用于构建高可用、分布式系统的基础设施中。Eureka的服务器端被称为Eureka Server&#xff0c;客户端则是那些需要注册的服务。Eureka具有以下特点&#xff1a; 高可用性&#xff1a;Eureka支持多节点…

小米汽车充电枪继电器信号

继电器型号&#xff1a; 参考链接 小米SU7&#xff0c;便捷充放电枪拆解 (qq.com)https://mp.weixin.qq.com/s?__bizMzU5ODA2NDg4OQ&mid2247486086&idx1&sn0dd4e7c9f7c72d10ea1c9f506faabfcc&chksmfe48a110c93f2806f6e000f6dc6b67569f6e504220bec14654ccce7d…

Linux网络开发基础知识

一个网络服务器的简单实现 项目需求 实现回声服务器的客户端/服务器程序&#xff0c;客户端通过网络连接到服务器&#xff0c;并发送任意一串英文信息&#xff0c;服务器端接收信息后&#xff0c; 将每个字符转换为大写并回送给客户端显示。 eoch_client.c #include <arpa/i…

Android双向认证配置过程

1&#xff08;可以绕过&#xff09;准备过程 为了让这个教程可以一直复用&#xff0c;打算直接写一个双向认证的APP作为素材。 工具&#xff1a; ●protecle&#xff08;签名文件转换&#xff09; ●keytool&#xff08;java自己就有&#xff09; ●openssl&#xff08;apache里…

前端canvas项目实战——在线图文编辑器(九):逻辑画布

目录 前言一、 效果展示二、 实现步骤1. 调整布局&#xff0c;最大化利用屏幕空间2. 添加逻辑画布3. 添加遮罩4. 居中显示逻辑画布5. 一个容易被忽视的bug点 三、Show u the code后记 前言 上一篇博文中&#xff0c;我们实现了一组通用的功能按钮&#xff1a;复制、删除、锁定…