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

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 你可以在 Flask 中使用 ajax 和 JSON 来实现前后端分离。 首先,在 Flask 中创建一个视图函数,它会返回一个 JSON 响应,例如: ``` @app.route('/api/data') def get_data(): data = {'key': 'value'} return jsonify(data) ``` 然后,在前端 JavaScript 代码中使用 ajax 请求这个视图,例如: ``` $.get('/api/data', function(data) { console.log(data.key); // 'value' }); ``` 这样,前端 JavaScript 代码就可以通过 ajax 请求与 Flask 后端进行通信,从而实现前后端分离。 ### 回答2: Python Flask可以通过使用REST API来实现前后端分离。REST(Representational State Transfer)是一种软件架构风格,它使用轻量级的通信协议(如HTTP)来传输数据,并且将数据表示为资源。 要实现前后端分离,可以按照以下步骤进行: 1. 建立一个Flask应用程序,负责提供后端API接口。在这个应用程序中,可以使用Flask提供的路由装饰器来定义各种API接口。 2. 设计并实现后端API接口。这些接口应该按照REST原则来进行设计,使用不同的HTTP方法(如GET、POST、PUT、DELETE)来进行数据的读取、创建、更新和删除。 3. 使用Flask提供的JSON模块来处理API请求和响应。当后端收到API请求时,可以解析请求的JSON数据,并基于这些数据来进行业务逻辑的处理。然后将处理结果封装成JSON格式的响应返回给前端。 4. 在前端使用JavaScript框架(如AngularJS、ReactJS等)来发送API请求和处理响应。前端可以通过AJAX或Fetch等技术来发送请求,并使用JSON解析响应。 5. 前端根据后端提供的API接口来展示和处理数据。前端可以通过调用API接口来获取数据,并使用JavaScript来进行页面的渲染和交互。通过这种方式,前端和后端可以分别进行开发,彼此之间解耦,提高开发效率。 总结起来,通过Flask提供的REST API和前端的JavaScript框架,可以实现前后端分离的开发模式。后端提供API接口,前端通过调用这些接口来获取和处理数据,实现页面展示和交互。这种分离的方式可以方便地进行团队合作,各自独立开发,提高开发效率。 ### 回答3: Python Flask可以通过一些技术和方法来实现前后端分离。 首先,可以使用Flask提供的模板引擎来渲染前端页面。Flask的模板引擎可以使用Jinja2模板语言来生成HTML页面,通过模板中的控制语句和变量,可以将后端数据传递到前端页面进行渲染。这样前端页面可以直接通过HTTP请求来获取后端数据,实现前后端的分离。 其次,可以使用Flask提供的RESTful API来实现前后端分离。RESTful API是一种通过URL和HTTP方法来进行数据交互的规范。在Flask中,可以通过Flask-RESTful扩展来方便地定义和实现RESTful风格的API接口,前端可以通过HTTP请求发送数据和请求后端的API接口,后端可以根据请求的方法和URL来对数据进行处理和返回相应的结果。 另外,还可以使用Flask提供的蓝图(Blueprint)来实现前后端分离。蓝图可以将Flask应用划分成多个模块,每个模块可以负责不同的功能,从而方便地实现代码的组织和重用。可以将前后端的代码分别放在不同的蓝图中,前端代码可以通过HTTP请求来访问后端蓝图提供的API接口,实现前后端的分离。 综上所述,Python Flask可以通过模板引擎、RESTful API和蓝图等方式来实现前后端分离,提高代码的可维护性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值