Flask入门教程(视频教程笔记)

news2025/1/8 11:43:53

初始化flask项目

前面的python环境之类的就不说了。
该博客是看 Flask 入门 这个视频教程写的笔记,如果你想入门一下Flask,可以看看这个课,虽然简短,但是入门部分讲的很好,同时可以利用这篇博客复习复习。如果你想了解一下Flask、回顾基础知识点,也可以看一看本篇博客。

文章目录

    • 初始化flask项目
      • 一、安装flask
      • 二、Hello World
          • 1. 首先创建一个项目:
          • 2. 最简单的flask代码
      • 三、一些项目设置
          • 1. debug模式
          • 2. 修改host
          • 3. 修改port端口号
    • 路由
      • 一、配置路由
      • 二、传参
          • 可以这样传参
          • 还可以规定参数类型
          • 还可以这样传参
    • 模板渲染
      • 一、基础
      • 二、传参
    • Flask 连接 MySQL 数据库
      • 一、ORM模型
      • 二、连接数据库
      • 三、增删改查
      • 四、外键
      • 五、将类映射到数据库

一、安装flask

只需要使用pip下载即可:

pip install flask

自动下载最新版

二、Hello World

编辑器使用的是pycharm

1. 首先创建一个项目:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2L0jvw6S-1674033772289)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230115133810807.png)]

关于环境,非常建议选择“先前配置的解释器”,如果选择上面的Virtualenv,会新创建一个局部的虚拟环境,那么全局安装的模块在这里是用不了的,必须要重新下载,而有些模块是很多项目都可以共用的,不必要这样。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eE1tckPf-1674033736776)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230115134120298.png)]

将目录修改成这样,这是一个标准的flask初始化目录。

如果没有文件夹,新建;初始化入口叫main.py,可以修改成app.py

2. 最简单的flask代码

app.py中写:

# 导入flask
from flask import Flask

# 使用flask类创建一个app对象
# __name__: 代表当前app.py这个模块
# 1. 以后出现bug可以通过这个快速定位
# 2. 对于寻找模块文件,可提供一个相对路径
app = Flask(__name__)

# 创建一个路由和视图函数的映射
@app.route('/')
def hello_world():
    return "hello world"

# 如果当前模块作为入口
if __name__ == '__main__':
    # 跑flask
    app.run()

三、一些项目设置

1. debug模式
  • 开始debug模式的话,修改代码之后,会自动检测代码的更改并且重新加载,不需要手动停止程序并重启
  • 开发的时候出现bug,会在浏览器上输出错误信息
2. 修改host

项目默认运行在127.0.0.1:5000,如果想要局域网中的人可以访问该项目,可以修改host为0.0.0.0,之后局域网中的设备就可以通过你的电脑在局域网中的ip进行访问,可以通过设置修改。

3. 修改port端口号

项目默认是监听5000端口号,如果端口被占用之类的需要修改,可以通过设置修改。

路由

对接口地址的请求是通过路由来实现不同服务的:

http://localhost:5000/home => 首页
http://localhost:5000/user => 用户中心
http://localhost:5000/block/data => 博客数据中心

这里说的是基础,高级的路由功能后面再说。

一、配置路由

根据不同的路由配置对应的响应函数:

@app.route('/home')
def home():
	return "This is home"

二、传参

可以这样传参

/blog/123456

那么在代码中这样管理123456这样的参数:

@app.route("/blog/<blog_id>")
def getID(blog_id):
	return "访问的博客ID是" + blog_id
还可以规定参数类型
@app.route('/blog/<int:blog_id>')

这样就是规定参数必须是整型

还可以这样传参

/blog?id=123456

那么代码中需要这样拿到参数:

from flask import Flask, request
...
@app.route('/blog')
def getid():
	# request.args: 类字典类型,存放`?`之后的参数
	# "id" 就是参数的名字
	return "获取到博客id为" + request.args.get("id", defalut=1, type=int)

模板渲染

可以在服务器上配置好需要渲染的html页面,当访问到对应路径时进行服务端渲染。

一、基础

首先需要建立这样的目录:

app.py是项目入口,同级建立一个目录templates,名字固定,不可更改。

在引入Flask的时候同时引入render_template这个函数。

app.py:

from flask import Flask, render_template

app = Flask(__name__)


@app.route('/')
def hello():
    return render_template("test.html")


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

test.heml:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模板渲染</title>
</head>
<body>
    <h1>Hello Flask</h1>
</body>
</html>

当请求到达的时候,根据路径,发现根路径/返回一个模板渲染函数render_template,这个函数将自动通过传入的文件名,在templates这个目录中寻找对应的文件作为模板进行返回渲染。

二、传参

在渲染html页面的时候还可以进行传参:

@app.route('/')
def renderTemplate():
    return render_template("test.html", username="我是测试用例")

这样在test.html中就可以通过双括号直接拿到了:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模板渲染</title>
</head>
<body>
    <h1>username: {{ username }}</h1>
</body>
</html>

Flask 连接 MySQL 数据库

可以使用一些封装库去连接,接下来将使用:

  • pymysql:纯python写的驱动
  • Flask-SQLAlchemy:一般不直接写元素SQL语句去执行操作,而是通过SQLAlchemy提供的ORM技术,和操作普通python对象一样实现数据库的增删改查。而Flask-SQLAlchemy是对SQLAlchemy的封装。

一、ORM模型

一个ORM模型中:

  • 模型与数据库的表对应
  • 模型属性对应表的字段
  • 模型的实例对象对应表中的每条记录

二、连接数据库

  • 表单类需要继承一个db.Model

  • db.Column该方法用于将类属性映射成为表单字段

  • db.create_all()提交所有表单类到数据库

from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

# 数据库配置
HOSTNAME = '127.0.0.1'
PORT = 3306
USERNAME = 'root'
PASSWORD = ''
DATABASE = 'clflask'

# 将配置信息综合
app.config[
    'SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charset=utf8"

# 在app.config中设置数据库信息
# 使用SQLAlchemy创建一个db对象
# SQLAlchemy会自动读取配置中的数据库信息
db = SQLAlchemy(app)

# 测试连接的代码
# with app.app_context():
#     with db.engine.connect() as conn:
#         rs = conn.execute("select 1")
#         print(rs.fetchone)


# 创建一个User表单,通过定义属性来映射字段
class User(db.Model):
    # 表单名
    __tablename__ = "user"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    username = db.Column(db.String(100), nullable=False)
    password = db.Column(db.String(100), nullable=False)


with app.app_context():
    db.create_all()

@app.route('/')
def demo4():
    return "hello world"


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

三、增删改查

  • 所有操作都不是直接对数据库操作,而是通过session,先对缓存进行操作,之后在db.session.commit()到数据库
  • 增:db.session.add()
  • 删:先查询出要删除的数据,再调用db.session.delete(),进行删除
  • 改:先查询出要修改的数据,在该对象上进行修改即可
  • 查:有两种方式进行查找 1. db.query.get(), 2. db.query.filter_by()
@app.route('/user/add')
def add_user():
    # 创建数据实例
    user = User(username='arui', password='123456')
    # 添加数据到数据库连接会话
    db.session.add(user)
    # 提交操作
    db.session.commit()
    return '用户创建成功'


@app.route('/user/info')
def get_user():
    # 1. 根据主键查找,一次只能查找一个
    # user = User.query.get(1)
    # 2. 使用filter查找,传入查询条件,返回一个类数组
    users = User.query.filter_by(username='arui')
    for user in users:
        print(user.username)
    return "查找成功"


@app.route('/user/update')
def update_user():
    # 先查询出需要修改的数据
    user = User.query.filter_by(username='arui').first()
    user.password = 111111
    db.session.commit()
    return "修改完成"


@app.route('/user/delete')
def delete_user():
    # 先查询出需要删除的数据
    user = User.query.filter_by(id=2).first()
    # 在会话中删除
    db.session.delete(user)
    # 提交动态
    db.session.commit()
    return "删除成功"

四、外键

关系型数据库中,可以在一个数据表里,通过外键链接另一个数据库,而不用把所有东西维护在一个表中。

所以接下来创建一个文章表,使用外键将作者信息和用户信息绑定。

多表联动有点儿难,可以看看第17节课。

class Article(db.Model):
    __tablename__ = "Article"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(200), nullable=False)
    content = db.Column(db.text, nullable=False)
    # 添加作者外键
    auther_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    # 将作者链接到用户表
    auther = db.relationship('User')
    # 通过上面两步操作,这样也可以拿到作者信息:article.auther
    # 其过程为:因为auther字段已经和外表进行链接,那么这个属性会自动通过外键,在外表中进行查找


article = Article(title="学一学flask", content="学一学flask学一学flask")

五、将类映射到数据库

之前是使用db.create_all()这个方法去将创建好的数据表类映射到数据库,但是这个方法有局限性,即他只能将新增的类同步到数据库,但是对字段的修改无法同步。

所以可以使用flask-migrate这个库来实现更好的映射。

下载:

pip install flask-migrate

ORM模型映射成表的步骤:

  1. 代码:

    from flask_migrate import Migrate
    
    ...
    
    migrate = Migrate(app, db)
    
  2. flask db init:只许执行一次,命令行下当前项目目录中执行

  3. flask db migrate:识别ORM模型的改变,生成迁移脚本

  4. flask db upgrade:运行迁移脚本,同步到数据库

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二、MES的生态链

1、MES功能模块图1、 符合MESA/ISA-95标准&#xff0c;基于SOA架构&#xff0c;技术架构与业务架构分离&#xff0c;实现多厂分布式部署具备标准化模型组件&#xff0c;可根据客户需求选取标准组件、或调整业务对象脚本&#xff0c;组合成全新的业务组件&#xff0c;实现企业ME…

电动汽车热管理方案

热管理技术作为汽车节能、提高经济性和保障安全性的重要措施&#xff0c;在汽车研发过程中具有重要作用。传统燃油汽车的热管理系统主要包括发动机、变速器散热系统和汽车空调&#xff0c;而电动汽车的热管理系统在燃油汽车热管理架构的基础之上&#xff0c;又增加了电机电控热…

【Python百日进阶-数据分析】Day228 - plotly的图表的变换

文章目录一、过滤二、分组三、聚合四、多重转换4.1 Filter and Group By4.2 Filter and Aggregate4.3 所有变换4.4 Dash中的应用一、过滤 如何通过 Plotly 在 Python 中使用过滤器。 注意 transforms在 v5 中已弃用&#xff0c;plotly将在未来版本中删除 import plotly.io as…

分享97个PHP源码,总有一款适合您

PHP源码 分享97个PHP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 97个PHP源码下载链接&#xff1a;https://pan.baidu.com/s/1OUa-rpzDK6CG8oj6BLZSTw?pwdxdt2 提取码&#xff…

上传ipa到appstore的步骤说明

上传ipa到appstore&#xff0c;首先你要有苹果开发者账号&#xff0c;一定要使用你自己的苹果开发者账号的证书打包&#xff0c;才能将ipa上传到你自己的苹果账号&#xff0c;才能提交到app store里。假如你还没有苹果开发者账号&#xff0c;或者你有证书但不是你自己账号生成的…

ES6ES6

ES8-ES8 新特性 4.1.async 和 await async和await 两种语法结合可以让异步代码像同步代码一样 4.1.1.async函数 async函数的返回值为 promise 对象&#xff0c; 2.promise 对象的结果由 asynt函数执行的返回值决定 4.1.2await表达式awaity必须写在 async 函数中 2.await 右侧…

Rockchip开发系列 - 3.2.引脚配置默认上拉下拉

By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! 目录 返回总目录:Rockchip开发系列 - 总目录 开发过程中发现rk3568-linux.dtsi中耳机监测应急一直是处于低电平状态: 这个gpio表格也说…

【MyBatis】| 在WEB中应⽤MyBatis(使⽤MVC架构模式)

目录 一&#xff1a;在WEB中应⽤MyBatis&#xff08;使⽤MVC架构模式&#xff09; 1. 前期准备 2. 核心代码实现 3. 事务控制 4. 三大对象的作用域 一&#xff1a;在WEB中应⽤MyBatis&#xff08;使⽤MVC架构模式&#xff09; 目标&#xff1a; ①掌握mybatis在web应⽤中怎…

【闪电侠学netty】第9章 实现客户端登录

【Netty】读书笔记 - 跟闪电侠学 1. 内容概要 1.1 总结 1.1.1 逻辑处理器 ChannelHandler&#xff08;详见 第11章 Pipeline与ChannelHandler&#xff09; 1.1.2 编程小技巧 public class PacketCodeC {...public static final PacketCodeC INSTANCE new PacketCodeC();.…

spring学习-第一讲-beanFactory与ApplicationContext

BeanFactory与ApplicationContext区别 创建一个springboot项目&#xff0c;对这个函数的main函数来进行执行。 ConfigurableApplicationContext context SpringApplication.run(BeanFactoryApplicationContextStudyApplication.class, args); 很明显&#xff0c;Configurabl…

“互联网+”六年,云徙科技打造数字化经营增长“头牌”

2022年底的全面开放结束了三年疫情&#xff0c;三年来以消费零售为代表的商业领域发生了深刻变局。根据2022年8月的第50次中国互联网络发展状况统计报告&#xff0c;互联网推动网民消费模式变迁&#xff1a;在消费场景方面&#xff0c;从线上消费逐步转变为线上线下融合消费&am…

软件安装教程-Vivado2018.3/ISE14.7/Modelsim10.5/Keil5/AD18/Cadence17.2/CAD2016

硬件工程师软件安装教程 1.Vivado2018.3安装教程 本文的主要内容是介绍 Vivado 2018.3 版本(提取码&#xff1a;ebdx)的安装步骤及其 license(提取码: 6xkh) 的获取与加载。 本文学习自《【ALINX】FPGA ZYNQ视频教程——AX7010/AX7020教程——基础部分》 首先下载安装包&…

【Unity3D】基于模板测试和顶点膨胀的描边方法

1 前言 选中物体描边特效 中介绍了基于模板纹理模糊膨胀的描边方法&#xff0c;该方法实现了软描边&#xff0c;效果较好&#xff0c;但是为了得到模糊纹理&#xff0c;对屏幕像素进行了多次二次渲染&#xff0c;效率欠佳。本文将介绍另一种描边方法&#xff1a;基于模板测试和…

简单使用tomcat查看版本信息等·

Tomcat 是什么 &#xff1f;1.Apache Tomcat 是由 Apache Software Foundation&#xff08;ASF&#xff09;开发的一个开源 Java WEB 应用服务器。2.由于 Tomcat 是由 Java 语言实现的&#xff0c;因此需要运行在 Java 虚拟机上&#xff0c;所以使用前要先安装 JDK&#xff0c;…

JNPF Java3.4.5 .NET6 3.4.5 框架源码 JeeSite快速开发平台

JeeSite JeeSite 快速开发平台的主要目的是能够让初级的研发人员快速的开发出复杂的业务功能&#xff0c;中高级人员有时间做一些更有用的事情。让开发者注重专注业务&#xff0c;其余有平台来封装技术细节&#xff0c;降低技术难度&#xff0c;从而节省人力成本&#xff0c;缩…

电商控价,为什么要找控价公司

刚刚做控价的时候&#xff0c;相信我们心中都有一个疑问&#xff1a;控价嘛&#xff0c;很简单&#xff0c;把标准价格发给低价店铺&#xff0c;让他调价不就行了&#xff1f;不配合&#xff0c;我就投诉&#xff0c;要么我就断货&#xff0c;自己产品自己说了还不算吗&#xf…

《大话数据结构》读书笔记---第一章 数据结构绪论

数据结构&#xff1a;是相互之间存在一种或多种特定关系的数据元素的集合。数据结构是一门研究非数值计算的程序设计问题中的操作对象&#xff0c;以及它们之间关系和操作等相关问题的学科。程序设计数据结构算法数据&#xff1a;是描述客观事物的符号&#xff0c;是计算机中可…

C++复数类——运算符重载和类的传递

复数&#xff1a;我们把形如abi&#xff08;a,b均为实数&#xff09;的数称为复数&#xff0c;其中a称为实部&#xff0c;b称为虚部&#xff0c;i称为虚数单位。当虚部等于零时&#xff0c;这个复数可以视为实数&#xff1b;当z的虚部不等于零时&#xff0c;实部等于零时&#…

【Kotlin】类的继承 ② ( 使用 is 运算符进行类型检测 | 使用 as 运算符进行类型转换 | 智能类型转换 | Any 超类 )

文章目录一、使用 is 运算符进行类型检测二、使用 as 运算符进行类型转换 ( 智能类型转换 )三、Any 超类一、使用 is 运算符进行类型检测 在 Kotlin 中 , 如果不确定一个 实例对象的类型 , 可以 使用 is 运算符进行判定 , 使用方法 实例对象 is 判定类型上述用法可以判定 实例…

Windows11快速入门

1、如何快速上手Win11 Win11官网&#xff1a;https://www.microsoft.com/zh-cn/windows/windows-11?r1 Windows 帮助和学习&#xff1a;https://support.microsoft.com/zh-cn/windows?uizh-CN&rszh-CN&adCN) 2、Win11常用快捷键 2.1、文本编辑快捷键 功能描述快捷键…