21、flask-进阶-类视图和RESTful-前后端分离概念

news/2024/11/16 0:01:01/文章来源:https://www.cnblogs.com/littlecc/p/18328231

前后端分离与不分离概念

  • 前后端不分离:如 render_template('index.html', data=data) 这种就是前后端不分离前端和后端一起渲染

  • 前后端分离:

    • 后端返回json数据 - jsonify()
    • 前端使用ajax来请求数据: ajax
    • 各自处理各自的数据,代码不在一起

http请求方式:

  • GET:查询
  • POST:添加数据
  • PUT:更新修改数据
  • DELETE:删除数据

views.py

import requests
from flask import Blueprint, jsonify
from .models import *#创建蓝图(路由)
blue = Blueprint('user', __name__)@blue.route('/')
def index():return 'index'# 前后端不分离:如 render_template('index.html', data=data) 这种就是前后端不分离前端和后端一起渲染
# 前后端分离:
#           后端返回json数据 - jsonify()
#           前端使用ajax来请求数据: ajax# jsonify(): 序列化# http请求方式:
# GET:查询
# POST:添加数据
# PUT:更新修改数据
# DELETE:删除数据@blue.route('/users/', methods=['GET', 'POST', 'PUT', 'DELETE'])
def users():if requests.method == 'GET':return jsonify({'method', 'GET'})elif requests.method == 'POST':return jsonify({'method', 'POST'})elif requests.method == 'PUT':return jsonify({'method', 'PUT'})elif requests.method == 'DELETE':return jsonify({'method', 'DELETE'})

RESTful - 后端接口编写

基本使用

  1. 安装
pip install flask-restful
  1. 修改项目目录结构

apis.py

from flask import jsonify
from flask_restful import Resource# 类视图:CBV   Class Based View
# 函数视图:FBV  Function Based View# 类视图
class HelloResource(Resource):  # 继承Resourcedef get(self):      # get请求,内部提供的 GET 方法return jsonify({'msg': 'GET 请求'})def post(self):     # post请求,内部提供的 POST 方法return jsonify({'msg': 'POST 请求'})

exts.py

from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_restful import Api  #添加的#初始化插件
db = SQLAlchemy()
migrate = Migrate()
api = Api()    # 添加的#和app对象绑定
def init_exts(app):db.init_app(app)migrate.init_app(app,db)api.init_app(app)   # 添加的

urls.py

# 路由文件
from .exts import api
from .apis import *# 路由
# api.add_resource(类名, '路由名')
api.add_resource(HelloResource, '/hello/')

__init__.py

from flask import Flask
from .exts import init_exts
from .urls import *    # 添加的def create_app():app = Flask(__name__)   # 创建flask应用#配置数据库db_uri = 'sqlite:///sqlite3.db'     #sqlite的配置# db_uri = 'mysql+pymysql://root:123456@127.0.0.1:3306/flask_db?charset=utf8mb4'  #mysql的配置app.config['SQLALCHEMY_DATABASE_URI'] = db_uriapp.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False#初始化插件init_exts(app=app)return app

项目结构如下:

字段格式化 - user_fields={}

  1. fields 进行定义
  • marshal_with进行使用

特性:

1.显示我们设计的数据结构
2.默认返回的数据如果在预定义结构中不存在、数据会被自动过滤
3.如果返回的数据在预定义的结构中存在、数据会正常的返回
4.如果返回的数据比预定结构中的字段少,预定义的字段会呈现一个默认值

定义字段输出:

1.使用字典进行定义
2.常用都是基本类型:String, Integer

#格式化字段、返回的数据要遵循下面定义user_fields={}格式
user_fields = {
'msg': fields.String,
'status': fields.Integer,
'data': fields.String(attribute='private_data'),
'default_data': fields.String(default='1')
}

3.定义好的格式通过装饰器进行使用

  • @marshal_with(需要返回的数据格式), return返回字典就ok了
class Users(Resource):
@marshal_with(user_fields)
def get(self):return {'msg': '哈哈', 'data': '没有数据', 'age': '22', 'private_data': '表中数据'}

案例 - user_fields={}:

apis.py

from flask import jsonify
from flask_restful import Resource, fields, marshal_with# Flask-RESTful# 1.字段格式化: 定义返回给前端的数据格式
ret_fields = {'status': fields.Integer,   # 状态码:规定返回的是整型'msg': fields.String,       # 状态信息:规定返回的是字符串类型# 'data': fields.String       # 数据:规定返回的是字符串类型'like': fields.String(default='ball'),  #如果返回的函数中没有包含这里定义的字段,则返回的数据中也会有这个字段,值为默认值'like2': fields.String(),   # 如果没有定义默认值,则返回的数据显示为None'data2': fields.String(attribute='data')    # attribute:关联函数中返回数据的某个字段名、并返回被关联字段的数据
}class UserResource(Resource):# 装饰器,将返回的数据格式化,严格要求返回的字典格式要符合ret_fields中定义的数据类型和字段的值# 如果ret_fields={}中没有某个字段,则返回的数据中不会包含该字段、如没有`data`字段返回的数据就不会带`data`字段@marshal_with(ret_fields)def get(self):return {'status': 200,'msg': 'OK','data': '给前端返回的数据 python'}

路由urls.py

# 路由文件
from .exts import api
from .apis import *# 路由
# api.add_resource(类名, '路由名')
api.add_resource(UserResource, '/user/')


案例2 - 获取数据库中的表数据

fields.Nested(user_fields) 级联模式,嵌套其它的ret_fields数据格式
这里嵌套了user_fields={}数据格式
apis.py

from flask import jsonify
from flask_restful import Resource, fields, marshal_with
from .models import *# 类视图:CBV   Class Based View
# 函数视图:FBV  Function Based View# 返回数据库中的数据# 给数据库中表的字段定义字段格式
# 这里我新建了一个用户表,字段有:id、name、age、sex
user_fields = {'id': fields.Integer,'name': fields.String,'age': fields.Integer,'sex': fields.Boolean
}# 定义请求返回的数据格式
ret_fields2 = {'status': fields.Integer,'msg': fields.String,#使用user对象'data': fields.Nested(user_fields)
}# 类视图
class User2Resource(Resource):@marshal_with(ret_fields2)  # 装饰器,将返回的数据格式化def get(self):user = User.query.first()   # 查询数据库中的数据return {'status': 200,'msg': 'OK','data': user}

路由urls.py

# 路由文件
from .exts import api
from .apis import *# 路由
# api.add_resource(类名, '路由名')
api.add_resource(User2Resource, '/user2/')

返回URL路径

连接字段

  • 就是将当前的数据库的操作api暴露出来
  • 根据提供的url和唯一标识进行数据操作

endpoint=标记的字段

absolute=True 返回绝对路径

'url': fields.Url(endpoint='id', absolute=True) #打上标记

返回列表数据

apis.py

from flask import jsonify
from flask_restful import Resource, fields, marshal_with
from .models import *# 类视图:CBV   Class Based View
# 函数视图:FBV  Function Based View# --------------返回列表数据----------------------------
user_fields2 = {'id': fields.Integer,'name': fields.String,'age': fields.Integer,'sex': fields.Boolean,
}# 定义请求返回的数据格式
ret_fields3 = {'status': fields.Integer,'msg': fields.String,#使用user对象'data': fields.List(fields.Nested(user_fields2))    # List:列表
}# 类视图
class User3Resource(Resource):@marshal_with(ret_fields3)  # 装饰器,将返回的数据格式化def get(self):user = User.query.all()   # 查询数据库中的所有数据return {'status': 200,'msg': 'OK','data': user}

urls.py

# 路由文件
from .exts import api
from .apis import *# 路由
# api.add_resource(类名, '路由名')
api.add_resource(User3Resource, '/user3/')


前端参数解析

  • 参数解析:解析前端发过来的数据
  • 也是定义限制前端传过来的数据
  • 导入:from flask_restful import reqparse

apis.py

from flask import jsonify
from flask_restful import Resource, fields, marshal_with, reqparse
from .models import *# 参数解析:解析前端发过来的数据
# 也是定义限制前端传过来的数据
# 导入:from flask_restful import reqparse
parser = reqparse.RequestParser()   # 创建解析对象
parser.add_argument('name', type=str, required=True, help='用户名不能为空')    # 添加接收的参数, required=True:表示name一定要传过来
parser.add_argument('age', type=int, action='append')   #action='append' 表示可以传多个age,所以传过来的是一个列表,可以为空
parser.add_argument('key', type=str, location='cookies') #获取cookie
class User4Resource(Resource):def get(self):# 获取参数args = parser.parse_args()name = args.get('name')age = args.get('age')key = args.get('key')return jsonify({'msg': 'OK', 'name': name, 'age': age, 'key': key})

urls.py

# 路由文件
from .exts import api
from .apis import *# 路由
# api.add_resource(类名, '路由名')
api.add_resource(User4Resource, '/user4/')
  • 写一个爬虫去请求该路由并模仿前端传递参数
    spider.py
import requestsres = requests.get('http://127.0.0.1:5000/user4/', json={'name': 'lisi'}, headers={'Content-Type': 'application/json', 'Cookie': 'key=ABCDsdfaseadfasa'})print(res.text)

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

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

相关文章

使用bom统一管理maven项目中的依赖版本

背景 最近在做一个文件导入的功能时,领导觉得这个功能可以作为一个通用的组件给其他项目使用,让我将这个模块封装成一个组件上传到私服。 在进行过程中,我发现了问题:在我的模块中是要使用到spring-boot,lombok,easyexcel这些依赖,为了防止版本依赖冲突,我必须保持项目中依…

BUUCTF 6.[第五空间2019 决赛]PWN5 1

拿到题目,先运行一下很明显地出现了一个重复我们的输入,以及一个判断的过程,那么我们可以猜测可能会有栈溢出漏洞,让我们继续保护是开了一个canary 以及nx ,大概率就不是栈溢出漏洞了,因为canary的存在会使栈溢出非常麻烦。 我们看一下IDA存在栈溢出漏洞,但是由于长度不…

虚幻五学习 (三)

因为多人游戏需要多个客户端实现测试 所有我选择在虚拟机中配置win11 在学习hadoop中,已经安装好了VM虚拟机,现在只需要下载安装win11镜像 1.win 11官网下载:Download Windows 11 (microsoft.com)2.win11 (ISO)镜像文件百度网盘下载:链接:https://pan.baidu.com/s/1H800xw…

深度学习中常用损失函数介绍

选择正确的损失函数对于训练机器学习模型非常重要。不同的损失函数适用于不同类型的问题。本文将总结一些常见的损失函数,并附有易于理解的解释、用法和示例 https://avoid.overfit.cn/post/1435dd9dc90e420e965b3ab939363216

STM32F103 SPI详解及示例代码

SPI是嵌入式中使用比较广泛的协议之一,本文从该协议的原理入手对其进行了详细介绍,并结合STM32F103ZET主控芯片对其进行了说明,最后给出了两个实例代码demo供大家做参考。1 SPI协议详解SPI是串行外设接口(Serial Peripheral Interface)的缩写,是美国摩托罗拉公司(Motoro…

DBeaver连接mysql时,报错Public Key Retrieval is not allowed

解决 在新建连接的时候,驱动属性里设置 allowPublicKeyRetrieval 的值为 true。

JNI Functions

function:https://docs.oracle.com/en/java/javase/21/docs/specs/jni/functions.html jdk_down:https://www.oracle.com/java/technologies/downloads/archive/

Blender 4.2 LTS (macOS, Linux, Windows) - 开源 3D 创意软件 (渲染 建模 雕刻)

Blender 4.2 LTS (macOS, Linux, Windows) - 开源 3D 创意软件 (渲染 建模 雕刻)Blender 4.2 LTS (macOS, Linux, Windows) - 开源 3D 创意软件 (渲染 建模 雕刻) 创造的自由 Blender 获得 GNU GPL 许可,由其贡献者拥有。 因此,Blender 永远是免费和开源软件。 使命 以免费 /…

macOS Sequoia 15 beta 4 (24A5298h) Boot ISO 原版可引导镜像下载

macOS Sequoia 15 beta 4 (24A5298h) Boot ISO 原版可引导镜像下载macOS Sequoia 15 beta 4 (24A5298h) Boot ISO 原版可引导镜像下载 iPhone 镜像、Safari 浏览器重大更新、备受瞩目的游戏和 Apple Intelligence 等众多全新功能令 Mac 使用体验再升级 请访问原文链接:https:/…

基于 token 的登陆系统的实现

这是一段防爬代码块,我不介意文章被爬取,但请注明出处 console.log("作者主页:https://www.cnblogs.com/w-blogg"); console.log("原文地址:https://www.cnblogs.com/w-blogg/p/18328093");最近公司搞新项目,有个需求登陆,简单记录一下:app 端实现一…

【HW系列】战后收尾(2):复盘提升

本章为该系列的第18篇,也是事后收尾阶段的第2篇。有些防守单位会以演习结束作为整个防守项目的结束,甚至会专门定制倒计时大屏,当时钟走到0秒的那一刻,所有人欢呼雀跃,组织庆功宴,和庆祝春节有一拼了,朋友圈里都开始有了年味。 但是,演练真的结束了吗?能与国家顶级攻击…

个人工作述职报告模板PPT转正述职报告通用工作总结汇报范文免费

不知道怎么写述职报告的同学,可以下载PPT模板,改一改就能用。模板文件一共有几个G,下载可能比较慢,建议选择转存,几秒就能保存全部文件,而且几乎不消耗数据流量。不需要开会员,文件可以免费保存,建议一次选择一个文件夹转存。手机APP保存的文件,可以同步在电脑端查看。…