使用 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 应用程序 的相关文章

  • Python有条件求解时滞微分方程

    我在用dde23 of pydelay包来求解延迟微分方程 我的问题 如何有条件地编写方程 例如目标方程有两个选项 when x gt 1 dx dt 0 25 x t tau 1 0 pow x t tau 10 0 0 1 x othe
  • 查找模块中显式定义的函数 (python)

    好的 我知道您可以使用 dir 方法列出模块中的所有内容 但是有什么方法可以仅查看该模块中定义的函数吗 例如 假设我的模块如下所示 from datetime import date datetime def test return Thi
  • 当我在 Pandas 中使用 df.corr 时,我的一些列丢失了

    这是我的代码 import numpy as np import pandas as pd import seaborn as sns import matplotlib pyplot as plt data pd read csv dea
  • Python Pandas 根据另一列的总计从另一个数据帧中选择值

    我下面有一个 DataFrame 但我需要根据取消和订单列从每个代码中选择行 假设代码 xxx 的阶数为 6 1 5 1 阶数为 11 我需要一种算法 可以选择满足总共 11 行的行 阶数为 6 5 如果没有行匹配 则选择最接近的 id 并
  • 使用 scipy curve_fit 拟合噪声指数的建议?

    我正在尝试拟合通常按以下方式建模的数据 def fit eq x a b c d e return a 1 np exp x b c np exp x d e x np arange 0 100 0 001 y fit eq x 1 1 1
  • 动态 __init_subclass__ 方法的参数绑定

    我正在尝试让类装饰器工作 装饰器会添加一个 init subclass 方法到它所应用的类 但是 当该方法动态添加到类中时 第一个参数不会绑定到子类对象 为什么会发生这种情况 举个例子 这是可行的 下面的静态代码是我试图最终得到的示例 cl
  • 在Python中计算内存碎片

    我有一个长时间运行的进程 不断分配和释放对象 尽管正在释放对象 但 RSS 内存使用量会随着时间的推移而增加 如何计算发生了多少碎片 一种可能性是计算 RSS sum of allocations 并将其作为指标 即便如此 我该如何计算分母
  • django-admin.py makemessages 不起作用

    我正在尝试翻译一个字符串 load i18n trans Well Hello there how are you to Hola amigo que tal 我的 settings py 文件有这样的内容 LOCALE PATHS os
  • Python 惰性迭代器

    我试图了解迭代器表达式如何以及何时被求值 以下似乎是一个懒惰的表达 g i for i in range 1000 if i 3 i 2 然而 这个在构造上失败了 g line strip for line in open xxx r if
  • 如何使用 paramiko 查看(日志)文件传输进度?

    我正在使用 Paramiko 的 SFTPClient 在主机之间传输文件 我希望我的脚本打印文件传输进度 类似于使用 scp 看到的输出 scp my file user host user host password my file 1
  • 如何使用 sys.path.append 在 Python 中导入文件?

    我的桌面上有两个目录 DIR1 and DIR2其中包含以下文件 DIR1 file1 py DIR2 file2 py myfile txt 这些文件包含以下内容 file1 py import sys sys path append s
  • PyTorch DataLoader 对并行运行的批次使用相同的随机种子

    有一个bug https tanelp github io posts a bug that plagues thousands of open source ml projects 在 PyTorch Numpy 中 当并行加载批次时Da
  • 将文本注释到轴并对齐为圆

    我正在尝试在轴上绘制文本并将该文本与圆对齐 更准确地说 有一些具有不同坐标 x y 的点位于该圆内 并使用以下命令创建 ax scatter x y s 100 我想用圆圈连接并标记每个点 Cnameb 文本的坐标由 xp yp 定义 因此
  • Python 类型安全吗?

    根据维基百科 https en wikipedia org wiki Type system Type safety and memory safety 如果一种语言不允许违反类型系统规则的操作或转换 计算机科学家就认为该语言是 类型安全的
  • Python]将两个文本文件合并为一个(逐行)[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我是蟒蛇新手 我想做的是将文件 a 和文件 b 逐行合并到一个文件中 例如 text file a a n b n c text fi
  • 如何将回溯/sys.exc_info() 值保存在变量中?

    我想将错误名称和回溯详细信息保存到变量中 这是我的尝试 import sys try try print x except Exception ex raise NameError except Exception er print 0 s
  • 检测 IDLE 的存在/如何判断 __file__ 是否未设置

    我有一个脚本需要使用 file 所以我了解到 IDLE 没有设置这个 有没有办法从我的脚本中检测到 IDLE 的存在 if file not in globals file is not set 如果你想做一些特别的事情 file 未设置
  • 对数据帧的每 2 小时数据进行 Groupby

    我有一个数据框 Time T201FN1ST2010 T201FN1VT2010 1791 2017 12 26 00 00 00 854 69 0 87 1792 2017 12 26 00 20 00 855 76 0 87 1793
  • 更改 Python Cmd 模块处理自动完成的方式

    我有一个 Cmd 控制台 设置为自动完成 Magic the Gathering 收藏管理系统的卡牌名称 它使用文本参数在数据库中查询卡片 并使用结果自动完成 建议卡片 然而 这些卡片名称有多个单词 Cmd 会从last到行尾的空间 例如
  • 使用 urllib 编码时保持 url 参数有序

    我正在尝试用 python 模拟 get 请求 我有一个参数字典 并使用 urllib urlencode 对它们进行 urlencode 我注意到虽然字典的形式是 k1 v1 k2 v2 k3 v3 urlencoding 后参数的顺序切

随机推荐

  • 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 的应用 我多年来一直在