后端开发入门笔记之 Flask 简介

一、前言 这一篇文章中主要讲解了为完成后端项目所使用的 Flask 框架。对于自己所使用的功能和特性进行了着重的讨论。当然说是着重讨论,其实还是皮毛罢了。想要更加系统地了解 Flask,还请查看官方文档 二、Flask (1)Flask 介绍 Flask 是一个 Python Web 框架,十分轻量灵活,可以用于开发小型 Web 应用。Flask 高度可扩展,可以通过添加不同的组件来实现定制化的功能。对于简单的后端任务来说,Flask 十分合适。 (2)Flask 用于后端 虽然 Flask 可以实现经典的 MVC 架构,但是本项目只进行后端开发,提供一些用于数据库操作的 RESTful 接口,并不涉及显示的部分。因此只讨论 Flask 用于后端开发的方面。 对于后端项目,我们希望其向下管理数据库,向上为前端提供接口。这就需要用到 ORM 来通过对象管理数据库关系;同时通过 Route 提供 api 接口。 另外,我们还需要对项目进行管理,以合理的结构组织项目。我们需要了解 Flask 的 BluePrint。 三、ORM (1)数据库设置 Flask 使用 Flask-SQLAlchemy 组件实现 ORM。SQLAlchemy 本是独立于 Flask 的 ORM 库,但在 Flask 中使用时,又针对 Flask 进行了一定封装。 我们希望创建到数据库的连接,这需要在后端项目中进行设置。对 Flask 来说,设置以字符串的形式保存于项目的配置变量 SQLALCHEMY_DATABASE_URI 中。 app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = f'mysql+pymysql://{username}:{password}@{host}:{port}/{name}?charset=utf8mb4' 配置存储于 app.config 中。其中 app 是一个 Flask 类型的对象,用于表示 Flask 项目这个整体。...

四月 22, 2023 · 3 分钟 · 604 字 · Wokron

后端开发入门笔记之准备工作

一、前言 当我第一次看到那份作业的时候,我绝想不到,这作业将牵扯出多少我还未曾学习过的知识;我更想不到,自己要以多久的时间涉猎完所有这些内容。当然现在这些都已经结束了,感慨不应该抒发太多,还是趁着自己没有忘记,做一下总结吧。 这一系列应该会有几篇文章。主要内容是回顾总结我的第一次较为系统的后端开发经历。在学习的过程中我参考了许多文章,其中一些我也会在文章中给出链接。这些文章或许在一些方面比本篇文章讲的更加深入,但是本篇文章综合了许多文章的不同信息,给出了系统的安装配置流程和自己的一些见解,因此我认为还是有一些价值的。 二、WSL,一切的起点 (1)WSL 简介 windows 系统虽然在个人电脑上常用,但是开发起后端来还是不方便,最好还是使用 linux。但是只有一台电脑的话,装双系统极其麻烦、虚拟机又太过笨重。那么有没有一种更加方便的方法呢?有的,那就是使用 WSL(Windows Subsystem for Linux),即 Windows 的 Linux 子系统。WSL 分为 WSL1 和 WSL2,此二者的实现原理并不相同。虽然有些跑题,但是还是介绍一下,毕竟是自己费力去查的结果。 WSL1 不是虚拟机,Hyper-V 或 VMware 等虚拟机会用软件模拟硬件的行为,其中装入的操作系统是和模拟的硬件进行交互;而 WSL1 则是通过 Windows 操作系统库模拟了一个 Linux 内核,用 Windows 的系统调用来处理 Linux 的系统调用。并且由于 WSL1 不需要模拟硬件这一中间过程,因此效率会比虚拟机高。而 WSL2 则可以看做虚拟机,但是与其他虚拟机相比更加轻量,Linux 系统运行在此虚拟机上资源占用更少、运行更快。问题是 WSL2 使用了虚拟化技术,可能与其他虚拟机冲突,不能同时使用。 在这里我们使用 WSL2。主要原因是 WSL2 运行了真正的 Linux 内核,和各种 Linux 程序的兼容性更好。 (2)WSL 安装 安装 WSL 很简单。这里的安装流程参考 使用 WSL 在 Windows 上安装 Linux。插一句,微软的技术文档真的很有用,如果对搜索得到的关于微软的技术问题的解决方案有不确定的地方,参考微软的技术文档有时会有很大帮助。就比如 WSL 的安装,搜到的经常已经是过时的教程了。 安装 WSL,只需要在 PowerShell 中以管理员模式运行如下命令即可。 wsl --install 注意网上的教程中,需要使用 dism....

四月 22, 2023 · 5 分钟 · 1037 字 · Wokron

BUAA-OS 实验笔记之 Lab4

一、Lab4 前言 Lab4 主要实现了系统调用,并通过系统调用实现了进程的创建和通信等操作。按照提示编写代码的难度应该不大(除非你的 Lab3 schedule 函数有 bug,很可惜我就是这样 :(),所以本次的笔记更多的讨论了一些和实验无关的代码。希望不会显得太啰嗦。 二、系统调用 (1)从一个用户程序引入 在之前的几篇文章中,我们大致循着内核初始化的过程进行分析。可是在这 Lab4 中这一思路就不适用了。因为在本次实验中我们所要实现的,不过是一些由内核提供的,可供用户程序调用的接口而已。这种调用被称为系统调用。 但是为了保持文章行文的一致性,我们还是希望确定一个入口开始讲解。正好在 mips_init 中有这样的语句,那我们就从被创建的这个用户程序开始。 // lab4: // ENV_CREATE(user_tltest); 这里需要插一嘴,在 Lab3 中我们就已经使用 ENV_CREATE 完成了一些程序的加载,可你有没有仔细看过被加载的程序的源代码是什么样的?代码在 user/bare 路径下。我们查看其中的 put_a.c 程序 void _start() { for (unsigned i = 0;; ++i) { if ((i & ((1 << 16) - 1)) == 0) { // Requires `e->env_tf.cp0_status &= ~STATUS_KUp;` in kernel to work *(volatile char *)0xb0000000 = 'a'; *(volatile char *)0xb0000000 = ' '; } } } 你会发现这些所谓的程序并没有 main 函数,而是 _start。实际上和内核一样,我们同样在用于用户程序编译的链接器脚本中将程序入口设定为 _start。该脚本为 user/user....

四月 13, 2023 · 18 分钟 · 3782 字 · Wokron

BUAA-OS 实验笔记之 Lab3

一、Lab3 前言 不知道为什么,虽然写 Lab3 所用的时间比 Lab2 少,但这次的笔记居然比 Lab2 长。我认为可能是因为自己在本篇文章中讲了更多和实验本身无关的东西。不过既然讲了,应该也会对进一步认识操作系统起到一些作用吧。希望本篇文章不会显得太啰嗦。 二、内核初始化(再续) Lab2 中,我们在内核初始化阶段初始化了虚拟内存的相关信息,Lab3 中我们要继续这一过程。本次实验中我们会完成进程控制的初始化。 (1)再度 mips_init 我们查看 Lab3 中 init/init.c 的 mips_init 函数的内容变化。与 Lab2 相比,其中多调用了如下的方法 env_init、ENV_CREATE_PRIORITY、kclock_init 和 enable_irq。 void mips_init() { printk("init.c:\tmips_init() is called\n"); // lab2: mips_detect_memory(); mips_vm_init(); page_init(); // lab3: env_init(); // lab3: ENV_CREATE_PRIORITY(user_bare_loop, 1); ENV_CREATE_PRIORITY(user_bare_loop, 2); // lab3: kclock_init(); enable_irq(); while (1) { } } 其中 env_init 用于进程控制的初始化,ENV_CREATE_PRIORITY 手工创建了两个进程,kclock_init 和 enable_irq 设置了时钟中断并启用了中断。后两者将分别在第三和四节介绍。本届只介绍前者。 (2)进程管理的数据结构 让我们深入在 kern/env.c 中的 env_init,在该函数中,首先初始化了两个列表 void env_init(void) { int i; /* Step 1: Initialize 'env_free_list' with 'LIST_INIT' and 'env_sched_list' with * 'TAILQ_INIT'....

三月 30, 2023 · 14 分钟 · 2901 字 · Wokron

BUAA-OS 实验笔记之 Lab2

一、Lab2 前言 这篇文章应该是我目前写过的文章中长度排行前几的了。Lab2 的内容着实繁多,不仅是分页内存管理本身的理论和实现细节颇多;操作系统的基本知识和注意事项也占据了很大的篇幅。后者在不理解的情况下实在会对本次实验产生许多困惑。本人也是在逐步地探索之后才得以有了较多的认识——当然,这一认识或许也只是片面的。 本文逐函数、逐代码地讲解了 Lab2 中新增的内容。主要在于内核初始化中关于内存的部分以及分页内存管理的实现。在本文中,关于链表宏和虚拟/物理内存的辨析也占据了比较多的内容。 二、内核初始化(续) 在 Lab1 中,我们的内核初始化过程只进行了一部分。因为 Lab1 中 mips_init 函数几乎没有任何功能。在 Lab2 中,我们会继续推进这一过程。 在 Lab2 中,我们会建立操作系统的内存管理机制。具体来说,我们会在 mips_init 中调用三个函数 mips_detect_memory、mips_vm_init 和 page_init。这三个函数会分别完成探测内存、初始化虚拟地址和初始化页的工作。接下来我们会分别介绍这三个函数。 Lab2 中 mips_init 的结构如下: void mips_init() { printk("init.c:\tmips_init() is called\n"); // lab2: mips_detect_memory(); mips_vm_init(); page_init(); while (1) { } } (1)探测内存 mips_detect_memory 的作用是获取总物理内存大小,并根据物理内存计算分页数。 注意!是物理内存 void mips_detect_memory() { /* Step 1: Initialize memsize. */ memsize = *(volatile u_int *)(KSEG1 | DEV_MP_ADDRESS | DEV_MP_MEMORY) 第一步中的这条语句似乎使人困惑。为什么这样就可以获得物理内存大小了呢?我们可以查看一下 DEV_MP_ADDRESS 和 DEV_MP_MEMORY 所在的头文件。它们定义在 include/driver/dev_mp....

三月 20, 2023 · 11 分钟 · 2267 字 · Wokron

基于概率模型的蘑菇菌丝规模分析

摘要: 本文提出了一种将菌丝体结构与地面上蘑菇子实体的位置联系起来的概率模型,用于分析蘑菇菌丝体的规模。我们假设地形平坦,菌丝体以恒定速率扩散。同时假设地面上蘑菇子实体的位置遵循菌丝体形状决定的均匀分布。基于这些假设,我们将菌丝体定义为以初始孢子位置 (m n) 为中心,半径为 r 的圆形区域。蘑菇子实体位置的分布服从该圆形区域内的均匀分布。 对于圆心位置和半径大小,我们分别提出了三种模型。对圆心位置来说:样本点平均值模型通过直接计算所有蘑菇子实体位置的平均值来估计圆心位置;最远点平均值模型通过计算横纵坐标投影上的最远点的平均值作为对圆心的估计;中位数模型通过分别计算横纵坐标轴上的中位数进行估计。 对半径大小来说:平均值模型通过计算所有样本点距已求得的圆心距离的平均值估计半径;第二种模型中采用了极大似然法对半径进行估计;两端间隔模型则通过考虑半径取值中两端间隔的比例关系计算半径大小。 我们将这些模型结合起来求解原问题。为了选择出更优的模型,我们采用了计算机数值模拟的方法。通过多次的随机模拟试验,考察模型预测结果的平均值、相对平均值的误差和标准差,对模型进行了评价,并据此选出了更好的求解结果。 Keywords: 概率论,数值模拟 简介 背景 蘑菇作为一种广泛存在于自然界的真菌,为人们所熟知。但其除了裸露在地表的子实体部分以外,在地下还拥有着极其庞大的菌丝结构。为了完成对蘑菇的全面详细研究,有必要对菌丝结构这一蘑菇的重要组成部分进行分析和度量。其中尤为重要的,就是确定菌丝结构的位置和范围。但是由于菌丝处于地下且规模巨大,难以通过直接测量得出结果。 问题重述 蘑菇的孢子落到土壤中,不断生长出菌丝。菌丝以相同的速度向外辐射,构成庞大的菌丝菌丝。当环境条件合适时,这些菌丝会生长成裸露在地面的“蘑菇”。现在我们已知地面上属于同一菌丝结构的所有蘑菇的位置,如表 1 和图 1 所示: 序号 横坐标 纵坐标 序号 横坐标 纵坐标 1 21.12 29.84 11 24.81 17.16 2 20.39 11.50 12 41.31 31.77 3 38.52 13.34 13 20.24 15.50 4 33.85 15.47 14 34.63 26.43 5 44.24 21.49 15 42.67 20.42 6 24.87 22.42 16 18.52 14.49 7 46.32 26.41 17 17.09 25.83 8 20....

三月 17, 2023 · 6 分钟 · 1105 字 · Wokron