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_uriapp.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 Apidb = 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_appapp = 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.mzph.cn/web/4544.shtml

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

相关文章

数据库介绍(Mysql安装)

前言 工程师再在存储数据用文件就可以了,为什么还要弄个数据库? 一、什么是数据库? 文件保存数据有以下几个缺点: 文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件在程序中控制不方便 数据库存储介质: 磁…

【UE C++】设置游戏模式

问题 我们都知道如何使用蓝图创建一个游戏模式并且在这个游戏模式蓝图中去设置“默认pawn类”、“HUD类”、“玩家控制器类”、“游戏状态类”、“玩家状态类”、“旁观者类”。那么如何使用C完成该操作呢? 步骤 1. 首先创建“GameMode”、“GameState”、“HUD”…

Arthas:阿里出品,线上问题快速搞定!

前面我们通过JVM线程分析及内存分析来让大家从服务器资源异常情况下排查代码问题,类似这种的解决方式,更多的是在服务器资源占用已经异常显现,我们就可以按照这种方式去排查和解决。 但实际工作中,可能会出现:接口的TP…

Paddle OCR v4 微调训练文字识别SVTRNet模型实践

文字识别步骤参考:https://github.com/PaddlePaddle/PaddleOCR/blob/main/doc/doc_ch/recognition.md 微调步骤参考:https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.7.1/doc/doc_ch/finetune.md 训练必要性 原始模型标点符号和括号容易识别不到 数据…

自动化机器学习:让机器学习更智能

自动化机器学习:让机器学习更智能 在当今数据驱动的时代,机器学习技术已经成为了许多行业和领域的核心。然而,随着数据量的增加和模型复杂度的提升,传统的机器学习方法往往需要大量的人力和时间进行调参和优化,这在某…

3步教你成为微信客户管理高手,助你事半功倍!

在如今的商业世界中,与客户建立良好的关系并提供个性化的服务已成为企业成功的关键。今天就 分享三个简单的步骤,让大家成为微信客户管理的高手,事半功倍! 第一步:客户分类与精细化服务 为了更好地管理客户&#xff…

mongodb使用debezium

前置 服务器上需要安装jdk11 jdk下载地址 kafka安装 官网下载地址 安装教程 debezium 安装 运行 Debezium 连接器需要 Java 11 或更高版本 Debezium 并不是一个独立的软件,而是很多个 Kafka 连接器的总称。这些 Kafka 连接器分别对应不同的数据库,…

【C++】C\C++内存管理

下面是围绕C\C内存管理这一块知识谈论相关的内存管理机制,有需要借鉴即可。 同时,我在下面也放了快速建立链表的模板,方便oj题目拿到vs上进行调试。 内存管理目录 1.CPP内存管理1.1new、delete关键字概念1.2特性1.3总结 2.new、delete的底层…

电商API数据采集接口||大数据的发展,带动电子商务产业链,促进了社会的进步

最近几年计算机技术在诸多领域得到了有效的应用,同时在多方面深刻影响着我国经济水平的发展。除此之外,人民群众的日常生活水平也受大数据技术的影响。 主流电商API数据采集接口||在这其中电子商务领域也在大数据技术的支持下,得到了明显的进…

《逃离塔科夫》PVE模式加入付费特别版引发玩家不满

《逃离塔科夫》PVE模式加入付费特别版引发玩家不满 近期,《逃离塔科夫》开发者Battlestate发布了多个新版本,但其中PVE模式只能在价格最高的“Unheard Edition”中购买,导致玩家不满。据悉,“Unheard Edition”售价高达250欧元&a…

Linxu系统服务管理,systemd知识/进程优先级/平均负载/php进程CPU100%怎么解决系列知识!

shell脚本(命令)放后台 sleep 300& 放到后台运行,脚本或命令要全路径 nohup:用户推出系统进程继续工作 【功能说明】 nohup 命令可以将程序以忽略挂起信号的方式运行起来,被运行程序的输出信息将不会显示到终端 如…

小程序的合同是怎么样写的

​很多商家找第三方做小程序都遭遇到了各种问题,如访问速度慢、服务器关闭、反复收费等。如果当初商家找的是正规的第三方服务商,双方签订了明确的合同条款,出现任何问题后,相信都能够进行解决。下面将具体介绍合同内容&#xff0…

大田场景下的路径检测论文汇总

文章目录 2020Visual Servoing-based Navigation for Monitoring Row-Crop Fields 2020 Visual Servoing-based Navigation for Monitoring Row-Crop Fields code: https://github.com/PRBonn/visual-crop-row-navigation 摘要: 自主导航是野外机器人执行精确农业…

ElasticSearch自动补全

一、拼音分词器: 当用户在搜索框输入字符时,我们应该提示出与该字符有关的搜索项,如图: 这种根据用户输入的字母,提示完整词条的功能,就是自动补全了。 GET /_analyze {"text":"我爱螺蛳粉…

opencv图片绘制图形-------c++

绘制图形 #include <opencv2/opencv.hpp> #include <opencv2/core.hpp> #include <filesystem>bool opencvTool::drawPolygon(std::string image_p, std::vector<cv::Point> points) {cv::Mat ima cv::imread(image_p.c_str()); // 读取图像&#xf…

制造业智慧工厂

在信息化、智能化浪潮的推动下&#xff0c;制造业正迎来一场前所未有的变革。智慧工厂&#xff0c;作为这一变革的核心载体&#xff0c;正逐渐成为制造业发展的新引擎。HiWoo Cloud平台&#xff0c;以其卓越的物联网云技术&#xff0c;为制造业智慧工厂的构建提供了强有力的支持…

Linux逻辑方式合并物理磁盘

在日常生活中&#xff0c;我们总是遇到一个文件太大&#xff0c;以至于我们的两个磁盘都装不下&#xff0c;这时我们就需要将两块物理磁盘逻辑化的连接在一起&#xff0c;把物理磁盘使用逻辑化的方法合并在一起&#xff0c;形成卷组&#xff0c;使得磁盘空间可以公用&#xff1…

【 AIGC 研究最新方向(上)】面向平面、视觉、时尚设计的高可用 AIGC 研究方向总结

目前面向平面、视觉、时尚等设计领域的高可用 AIGC 方向有以下 4 种&#xff1a; 透明图层生成可控生成图像定制化SVG 生成 本篇&#xff08;上篇&#xff09;介绍 1、2&#xff0c;而下篇将介绍 3、4。 透明图层生成 LayerDiffuse 代表性论文&#xff1a;Transparent Imag…

请编写函数fun,该函数的功能是:实现B=A+A‘,即把矩阵A加上A的转置,存放在矩阵B中。计算结果在main函数中输出。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 请编…

redis基础(一)

启动与关闭 启动命令在/usr/local/bin目录 服务端后台启动&#xff1a;redis-server opt/redis-6.2.1/redis.conf 客户端连接&#xff1a;执行 redis-cli 关闭操作 ​ 方式1&#xff1a;进入终端后关闭 ​ 方式2&#xff1a;直接kill 掉进程 方式3&#xff1a;通过实例关闭 …