使用 MVC 架构构建 Flask CRUD 应用程序

2023-11-11

【转自 Felipe Silveira 的《Build a Flask CRUD Application with MVC Architecture》(翻译)】

如何用 Flask 的 Blueprint 实现一个 CRUD 的应用

我多年来一直在开发和生产应用程序中使用 Node.js,最近我开始专注于使用 Flask 的全栈 Web 开发。

我记得我的第一个实践 Node.js 项目,现在与 Flask 相比,它的开发速度要快得多。碰巧的是,在使用 Flask 时,我在实现一个简单的 CRUD 应用程序时被卡住了很多次,主要是在如何使用 Python 构建项目方面。

特别是,我已经使用 Python 实现了许多机器学习应用程序。在我看来,它是最好的语言。但是,在实现 CRUD 和/或 API 项目时,我仍然更喜欢 Node.js。

总的来说,请注意本教程的重点不是解释什么是 CRUD 应用程序,也不是它的方法。它只是关于如何按照 MVC 架构实现应用程序的指南。

我试图尽可能地将它与 NodeJS 应用程序相关联,希望你喜欢它。如有任何意见或建议,请随时与我联系。

为了构建这个应用程序,我们首先需要了解 CLIENT/SERVER 的基本思想。

  • 客户端向服务器发送请求。
  • 服务器接收客户端请求,向数据库发送请求,数据库发送回响应。
  • 在操作数据库响应之后,服务器然后向客户端发送响应。

在这种方法中,服务器响应返回客户端请求的整个页面。例如,请求页面会为此/users返回所有 HTML、CSS 和 JS。对它的实际理解是render_template来自烧瓶的方法。

请记住,此格式仅限于特定客户端。由于服务器呈现 HTML、CSS 和 JS,因此 Android 或 iOS 客户端无法处理它。作为一种解决方案,经常使用 RESTful API,从而消除了呈现模板的后端责任。

项目结构

本教程假设您已经在计算机上安装了 Python、PostgreSQL 和 Flask。之后,请在您的项目文件夹中创建以下结构。

project/
|
├── templates/
|   └── index.html
|
├── migrations/ **
|   └── ...
|
├── routes/
|   └── user_bp.py
|
├── models/
|   └── User.py
|
├── controllers/
|   └── UserController.py
|
├── app.py
└── config.py
  • * 从命令自动创建flask db init

如果你从另一个框架,你可能已经注意到了瓶CLI是用来设置的东西,如FLASK_APP=app.pyFLASK_ENV=development,但不会自动为我们创建这个结构。

现在,让我们开始编写代码。

在src/app.py中

from flask import Flask, render_template
from flask_migrate import Migrate

from models.User import db
from routes.user_bp import user_bp

app = Flask(__name__)
app.config.from_object('config')

db.init_app(app)
migrate = Migrate(app, db)
app.register_blueprint(user_bp, url_prefix='/users')

@app.route('/')
def index():
    return render_template('index.html')

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

在src/config.py中:

import os

SECRET_KEY = os.urandom(32)

# Grabs the folder where the script runs.
basedir = os.path.abspath(os.path.dirname(__file__))

# Enable debug mode.
DEBUG = True

# Connect to the database
SQLALCHEMY_DATABASE_URI = 'your psycopg2 URI connection'

# Turn off the Flask-SQLAlchemy event system and warning
SQLALCHEMY_TRACK_MODIFICATIONS = False

在 src/models/User.py中:

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class User(db.Model):
    __tablename__ = 'users'

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)
    age = db.Column(db.String(120))
    address = db.Column(db.String(120))

    @property
    def serialize(self):
        return {
            'id': self.id,
            'name': self.name,
            'city': self.city,
            'state': self.state,
            'address': self.address
        }

之后,您可以运行以下命令:

  • flask db init: 它将创建带有版本子文件夹的迁移文件夹。
  • flask db migrate: 它将通过升级和降级逻辑设置检测模型更改。
  • flask db upgrade: 它将应用您已实施的模型更改。
  • flask db downgrade: 如果出现问题,您可以使用此命令取消应用您对模型文件所做的更改。

路线:

如您所见,路由通常使用控制器功能编写

@app.route('/', methods =['GET']) 
def index(): 
    ...

@app.route('/create', methods =['POST']) 
def store(): 
    ...

...

但是,由于我们希望按照 MVC 架构来组织它,因此需要进行一些更改。为此,Blueprint可以用作解决方案。它负责将代码拆分为不同的模块,从而更好地维护并提高可扩展性。

在src/routes/user_bp.py 中:

from flask import Blueprint

from controllers.UserController import index, store, show, update, destroy

user_bp = Blueprint('user_bp', __name__)

user_bp.route('/', methods=['GET'])(index)
user_bp.route('/create', methods=['POST'])(store)
user_bp.route('/<int:user_id>', methods=['GET'])(show)
user_bp.route('/<int:user_id>/edit', methods=['POST'])(update)
user_bp.route('/<int:user_id>', methods=['DELETE'])(destroy)

回到app.py,你可能注意到在app.register_blueprint(user_bp, url_prefix='/users')中蓝图正被注册

在src/controllers/UserController.py中

# pseudo code

import sys
from flask import render_template, redirect, url_for, request, abort

from models.User import User
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()

def index():
    ...

def store():
    ...

def show(userId):
    ...

def update(userId):
    ...

def delete(userId):
    ...

编写完所有必要的方法后,您可以使用命令flask run或运行项目python app.py。最后,您可以检查您的项目是否在http://localhost:5000/正确运行

本教程侧重于指导您进行后端实现,如果您想了解前端部分的详细信息,请为第二个教程发表评论。

我希望我已经向您展示了使用 Flask 实现 CRUD 应用程序是多么容易,就像使用 Node.js 一样。谢谢阅读!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 MVC 架构构建 Flask CRUD 应用程序 的相关文章

  • 在函数内的 for 循环上使用 tqdm 来检查进度

    我正在使用 for 循环迭代目录树内的一大组文件 这样做时 我想通过控制台中的进度条来监视进度 因此 我决定使用 tqdm 来实现此目的 目前 我的代码如下所示 for dirPath subdirList fileList in tqdm
  • 从所有数据帧列中删除子字符串

    我有一个单词列表 大约 1000 个单词 我称之为负面单词 CAST ARTICLES SANITARY JAN CLAUSES SPECIAL ENDORSEMENT 我很快就会用这个单词列表制作一个数据框 我还有一个数据框 看起来像 F
  • App Engine 上的 Django 与 webapp2 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • DynamodB:如何更新排序键?

    该表有两个键 filename 分区键 和eventTime 排序键 我要更新eventTime对于某些filename Tried put item and update item 发送相同的filename与新的eventTime但这些
  • 使用管理员权限打开cmd(Windows 10)

    我有自己的 python 脚本来管理我的计算机上的 IP 地址 它主要在命令行 Windows 10 中执行netsh命令 您必须具有管理员权限 这是我自己的计算机 我是管理员 运行脚本时我已经使用管理员类型的用户 Adrian 登录 我无
  • 使用 Pandas 从 csv 文件读取标题信息

    我有一个包含 14 行标题的数据文件 在标头中 有经纬度坐标和时间的元数据 我目前正在使用 pandas read csv filename delimiter header 14 读取文件 但这只是获取数据 我似乎无法获取元数据 有人知道
  • 使用 Tkinter 打开网页

    因此 我的应用程序需要能够打开其中的单个网页 并且它必须来自互联网并且未保存 特别是我想使用 Tkinter GUI 工具包 因为它是我最熟悉的工具包 最重要的是 我希望能够在窗口中生成事件 例如单击鼠标 但无需实际使用鼠标 有什么好的方法
  • Python speedtest.net,或等效的[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 是否有一个 Python 库可以实现 SpeedTest net 测试或等效的互联网连接速度测试 GitHub上有一个项目叫速度检查 https gi
  • 如何找到多个 pandas 数据框中一对列与任意顺序对的交集?

    我有多个 pandas 数据框 为了简单起见 假设我有三个 gt gt df1 col1 col2 id1 A B id2 C D id3 B A id4 E F gt gt df2 col1 col2 id1 B A id2 D C id
  • 使用 scikit 时 scipy.sparse 矩阵的缩放问题

    在使用 scikit learn 解决机器学习问题时 我需要在使用 SVM 进行训练之前对 scipy sparse 矩阵进行缩放 但在文档 http scikit learn org stable modules preprocessin
  • 无法通过 Android 应用程序访问我的笔记本电脑的本地主机

    因此 我在发布此内容之前做了一项研究 我发现的解决方案不起作用 更准确地说 连接到我的笔记本电脑的 IPv4192 168 XXX XXX 没用 连接到10 0 2 2 加上端口 不起作用 我需要测试使用 Django Rest 框架构建的
  • Python 在哪些系统上不使用 IEEE-754 双精度浮点数

    Python 对 IEEE 754 浮点运算进行了各种引用 但不保证1 https docs python org 3 tutorial floatingpoint html 2 https pythondev readthedocs io
  • 将图与热图(可能是对数)配对?

    How to create a pair plot in Python like the following but with heat maps instead of points or instead of a hex bin plot
  • Python:导入模块一次然后与多个文件共享

    我有如下文件 file1 py file2 py file3 py 假设这三个都使用 lib7 py lib8 py lib9 py 目前 这三个文件中的每一个都有以下行 import lib7 import lib8 import lib
  • 如何创建增量加载网页

    我正在编写一个处理大量数据的页面 它会永远持续到我的结果页面加载 几乎无限 因为返回的数据太大了 因此 我需要实现一个增量加载页面 例如 url 中的页面 http docs python org http docs python org
  • 如何在引发异常时将变量传递给异常并在异常时检索它?

    现在我只有一个空白的异常类 我想知道如何在引发变量时给它一个变量 然后在 try except 中处理它时检索该变量 class ExampleException Exception pass 为其构造函数提供一个参数 将其存储为属性 然后
  • 用 pandas DataFrame 替换 mysql 数据库表中的行

    Python 版本 2 7 6 熊猫版本 0 17 1 MySQLdb 版本 1 2 5 在我的数据库中 PRODUCT 我有一张桌子 XML FEED 表 XML FEED 很大 数百万条记录 我有一个 pandas DataFrame
  • PyQt5按钮lambda变量变成布尔值[重复]

    这个问题在这里已经有答案了 当我运行下面的代码时 它显示如下 为什么 x 不是 x 而是变成布尔值 这种情况仅发生在传递到用 lambda 调用的函数中的第一个参数上 错误的 y home me model some file from P
  • 检查 IP 地址是否在给定范围内

    我想检查一下是否有IP180 179 77 11位于特定范围之间 例如180 179 0 0 180 179 255 255 我编写了一个函数 它将每个 IP 八位字节与其他八位字节进行比较 def match mask IP min ip
  • 超过两个点的Python相对导入

    是否可以使用路径中包含两个以上点的模块引用 就像这个例子一样 Project structure sound init py codecs init py echo init py nix init py way1 py way2 py w

随机推荐

  • jdb 调试

    目录 1 代码 2 编译代码 3 调试 3 1 jdb 3 2 stop 3 3 list 3 4 run 3 5 list 3 6 step 3 7 print dump eval 3 8 set 3 9 locals 3 10 next
  • 目标检测之网络篇(2)【STN-空间变换网络】

    文章目录 1 STN是什么 2 问题的提出 CNN的平移不变性 3 STN基本结构 3 1 Localisation network 参数预测 3 2 Grid generator 坐标映射 3 3 Sampler 像素采集 4 总结 5
  • 发展,管理,前辈,名人等有用的文章链接

    专访李智勇 一个老程序员的哲学思考与勇猛精进的人生 http www csdn net article 2014 09 24 2821834 程序员生存定律 目录 http blog csdn net leezy 2000 article
  • 无限计算力:探索云计算的无限可能性

    这里写目录标题 前言 云计算介绍 服务模型 应用领域 云计算主要体现在生活中的地方 云计算未来发展的方向 前言 云计算是一种基于互联网的计算模型 通过它可以实现资源的共享 存储 管理和处理 它已经成为许多个人 企业和组织的重要技术基础 具有
  • 源码安装Apache2,报错:Cannot use an external APR with the bundled APR-util

    一般在第一次源码安装是没有问题的 在版本变化情况下在次源码安装可能会遇到此问题 apache2 0 x与apache2 2 x在apr有很大区别 前者为依赖公用apr 后者依赖于自身的apr 一般前者也就是2 0 x的编译基本上没有apr方
  • 什么是冒烟测试?

    In computer programming and software testing smoke testing also confidence testing sanity testing build verification tes
  • k8s部署微服务项目

    之前用docker compose部署微服务项目 但是只能单节点的 那你用微服务架构干啥 所以想搞一下k8s集群 网上找了下资料没有视频专门讲这一块 自己找了很多资料 搞了蛮长时间的 所以记录一下 1 安装k8s和管理界面kuboard 高
  • IndexFile实现原理

    摘要 rocketmq作为转发数据的中间件 其特点就是快字当头 那么如何做到快 rocketmq从各个角度都进行了优化 今天我们来看下它的索引文件 观察其组织文件的格式 使用的方式 一 组织文件的格式 Indexfile是mq索引文件的主要
  • uni-app 系列之(五)—— 路由

    简介 uni app 页面路由为框架统一管理 需要在 pages json 里配置每个路由页面的路径和页面样式 类似的小程序在 app json 中配置页面路由相同 uni app 的路由用法与 Vue Router 不同 路由跳转 uni
  • 初始C语言-2.C语言程序的四种基本结构

    学习C语言二 C语言的四大基本结构 还有下的视频在我B站主页找 概要 C语言的四种基本结构是很重要的 程序主要是由这些结构组成 学完这些结构 便可以写一些基本的程序 一 四种基本结构 二 四种基本结构精析 一 分支结构 if else if
  • JSTL自定义标签的使用

    由于dwr的js和jquery冲突 导致不得不换解决方案 记得以前写过一个OA项目 里面有一个jstl的权限标签 今天根据管理员ID那管理员名字的时候可以使用这个技术 于是记个简单的步骤 以免以后再次使用 1 先写一个标签的处理类 pack
  • 《银行法律法规》二、银行业务——6、银行卡业务

    第六章 银行卡业务 第一节 银行卡业务概述 考点1 银行卡定义和分类 定义 银行卡是由商业银行 或者发卡机构 发行的具有消费信用 转账结算 存取现金等全部或部分功能的信用支付工具 银行卡功能包括 支付结算 汇兑转账 储蓄 循环信贷 个人信用
  • DTO、VO、Entity、Condition使用习惯,以及对于多映射关系字段的处理

    POJO 的定义是无规则简单的对象 在日常的代码分层中 pojo 会被分为VO BO PO DTO 一 定义和使用情景 Entity 对象实体类 一般就是和数据库表字段一一对应的那个类 DTO Data Transfer Object 数据
  • 基于D11的教程一个向量缩放、旋转、位移示例

    D11学习心得第二章 一个向量缩放 旋转 位移示例 xnamath h原本是位于DirectX SDK的一个数学库 但是现在Windows SDK包含的数学库已经抛弃掉原来的xnamath h 并演变成了现在的DirectXMath h 其
  • 三相三线制逆变器的dq解耦控制

    1 三相三线制逆变器拓扑 三相三线制逆变器的拓扑如下图所示 其中开关变换器的端口线电压是 U A B U AB UAB
  • 二进制之补码与小数

    牛逼的二进制 1 前言 计算机使用二进制来表示所有形式的数据 颜色 文字 图像等 当前辈们想方设法要造一台计算机时都会遇到一个问题 怎么用电来表示数 显然他们发现开关的开和关正好对应二进制的0和1 然后计算机就使用二进制直到如今 那计算机怎
  • php实例——用户注册与登录

    这周做了个php的简单实例 算是学了这么久php语法的一次综合应用吧 感觉前面学的东西都不知道怎么用 不看教程还真做不出来 本来想把它写在网页弹出层上的 这样看起来更像是一个用户登录框 但是看了弹出层的代码后发现太麻烦了 所有的登录框代码都
  • Ubuntu安装Nvidia Container Toolkit

    文章目录 前言 一 基本概念 二 操作步骤 1 添加源 2 安装重启 总结 前言 NVIDIA Container Toolkit 可用于各种 Linux 发行版并支持不同的容器引擎 在开始之前 请确保您已经为您的 Linux 发行版安装了
  • 【微信小程序】 tabs切换时自动定位到点击的元素

    重点是设置 scroll into view 值为点击时元素的ID id不能以数字开头
  • 使用 MVC 架构构建 Flask CRUD 应用程序

    转自 Felipe Silveira 的 Build a Flask CRUD Application with MVC Architecture 翻译 如何用 Flask 的 Blueprint 实现一个 CRUD 的应用 我多年来一直在