最近学💙深度学习,想要把小项目做成🌸网页化,第一次做python的网页开发,发现一个新大陆-✨Flask框架今天的学习内容,一起来吧~

注:参考B站上武沛齐老师的Flask课程老师讲的真的非常好,都去听!!!

目录

1 FLask介绍

1.1 Flask 特点

1.2 Flask 核心组成

1.3 Flask 应用场景

2 快速实现 Flask 网页-DIY  

2.1 简单实现

2.2 Request

(1) 获取请求参数(Quesry Parameters)

(2) 获取表单数据(Form Data)

(3) 获取JSON数据(JSON API)

(4) 获取文件上传(Files)

2.3 视图函数的返回值

(1) 常见的返回类型

A. 字符串(String/HTML)

B. 字典与列表(自动转JSON)

C. 元组(Tuple) — — 自定义状态码

(2) Flask API 简单实现


1 FLask介绍

Flask 是 一个使用Python编写的轻量级Web框架。由于使用简单,用扩展增加其他功能,因此被称为“微框架”(Microsoftframework)

2026年的Python生态中,Flask 依然是构建 中小型应用、微服务和AI模型接口 的首选工具之一。

⭐️Flask的设计基于两个核心库:

Werkzeug:一个强大的SWGL(Web Server Gateway Interface)工具箱,负责处理HTTP请求和路由。

Jinja2:一个功能丰富的模板引擎,负责渲染HTML。


😕Flask “微”在哪里?

Flask不强制使用特定的数据库(如Django必须用其内置ORM)或表单验证工具,它只提供核心功能,剩下的插件(Falsk-SQLAlchemy,Flask-Login等)由用户根据需求自行选择。

1.1 Flask 特点

轻量级与简约:核心代码库非常小,提供了最基本的功能,不强制要求特定的工具或库;

灵活性:Flask提供了基本的框架结构,但没有强制性的项目布局或组件,开发者可以根据自己的需求自定义;

可扩展性:允许用户通过插件扩展来添加功能,eg. 表单处理、数据库交互或用户认证等,都可以通过社区提供的扩展来实现按;

易于调试:内置非常优雅的交互式调试器,报错信息清晰直观。

RESTful支持:Falsk支持 RESTful HTTP 请求处理,非常适合前后端分离架构。

局限性:大型项目需要手动搭建目录和配置,不想Django那样“开箱即用”。

1.2 Flask 核心组成

应用实例(Flask App):每个Flask应用的核心,负责初始化、配置、路由映射、错误处理和请求处理上下文;

路由(Routing):使用装饰器(@app.route())将URL映射到特定的视图函数;

视图函数(View Functions):处理接收到的HTTP请求并返回相应(HTML、JSON等);

Jinja2(模板引擎):负责渲染HTML页面,支持将后端数据佛动态嵌入到前端模板中;

请求和响应:Flask处理HTTP请求,支持多种HTTP方法(如GET、POST);

扩展模块(Extensions):用于增强功能,如数据库操作(Flask-SQLAlchemy)、表单验证(Flask-WTF)等。 

// 这里列举一些常见扩展:

Flask-SQLAlchemy Fask-WTF Flask-Login Flask-RESTful Flask-Migrate Flask-CORS
数据库ORM 表单处理 用户认证 REST API 开发 数据迁移 跨域支持

1.3 Flask 应用场景

以下是 Flask 典型的四大应用场景:

(1) 快速项目开发:对于小型的个人项目或初创项目,当你有一个初创想法,需要快速做出一套能够运行的Web系统向客户展示时。

// 场景:做一个简单的网站雏形、内部办公流程审批系统或个人作品集等;

优势:① 无负担:没有Django那样庞大的预设目录和数据库要求; ② 生态丰富:按需取用。

(2) 机器学习与AI模型部署:目前Flask最火热的赛道,由于大部分AI框架(eg.pytorch、TensoFlow、Scikit-learn)都是Pytho原生支持,Flask成为将这些模型包装成API接口的首选;

//场景:将训练好的模型加载到Flask中,通过HTTP接受图片或文字输入,返回预测结果。

优势:冷启动快,资源占用低,能够轻松集成到Docker容器中进行扩展。

(3) 微服务架构:在大型企业级应用中,开发者倾向于将功能拆分为多个小型、独立地服务。

// 场景:一个电商平台可能由“订单服务”“用户服务”“库存服务”组成,每一个服务都可以是一个独立的Flask应用;

优势:① 独立部署:修改订单逻辑不需要重启整个商城;② 技术栈自由:不同的微服务可以使用不同的数据库,Flask的非侵入性使其完美契合这一点。

(4) 数据分析与数据可视化:可以与科学计算库(如Numpy、Pandas)结合,用于开发数据分析和科学计算的Web应用。

//场景:结合Plotly Dash 或ECharts,展示公司业务指标、服务器监控状态或金融市场走势;

优势:开发周期短,能够快速将复杂的后台数据转化为直观的前端图表。

😆😆 了解了Flask的基本架构之后,继续学习吧!

2 快速实现 Flask 网页-DIY  

在此之前需要安装Flask的依赖包,在终端执行:(开发环境推荐:Pycharm、VS Code)

pip install Flask

2.1 简单实现

下面快速实现一个简单的网页:

首先创建一个app实例对象,通过 @app.route()-def fun() 的形式绑定指定url与对应的视图函数;

from flask import Flask

# 创建按一个Flask实例对象
app = Flask(__name__)

''' user在网站上访问类了下面的地址,后端将自动执行相应的函数,函数的返回值将在浏览器渲染 '''
# http://127.0.0.1:5000       -> 执行index
@app.route("/")
def index():
    return "Hello World!"

# http://127.0.0.1:5000/login -> 执行login
@app.route("/login")
def login():
    return "Please Login in!"

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

// 运行效果:

terminal 会显示网页地址及端口号,访问指定网址以及前面定义好的路径,可以看到函数的返回值就显示在浏览器当中。

  

另外,可以在代码 app.run() 中自行指定访问地址以及端口号:

// 运行效果:

2.2 Request

🌴request 对象 是一个全局上下文对象,它包含了客户端发送给服务器的所有HTTP请求信息 。

要使用它,需要先从flask模块中导入:

from flask import request

下面是request对象中最常用的属性及其应用场景详解:

(1) 获取请求参数(Quesry Parameters)

通常我们在访问页面会看到这样的情况:.../index?age=21&pwd=123

后半部分实际上是用户传递的参数,在用户登录成功界面通常会如此显示。

在Flask当中通过 request 完成这种功能,通常用于GET请求,即URL中 ?后面的部分。

# http://127.0.0.1:5000/search                            -> 执行search
# http://127.0.0.1:5000/search?keyword=flask框架&pwd=1    -> 执行search
@app.route('/search')
def search():
    keyword = request.args.get('q')  # 获取 'q' 的值
    page = request.args.get('page', default=1, type=int) # 带默认值和类型转换
    print(f"Searching for {keyword} on page {page}")
    return f"Searching for {keyword} on page {page}"

//运行效果:

   

(2) 获取表单数据(Form Data)

用于处理HTML<form> 提交的POST请求。

🎥补充:GET VS POST

GET和POST是HTTP协议中最常用的两种方法,决定了数据如何从客户端(浏览器/APP)传递到我们的Python后端。

— — 核心区别对照表:

特性 GET (获取数据) POST (提交数据)
数据位置 放在 URL 后面(查询字符串) 放在 HTTP 请求体(Body)中
数据大小 受 URL 长度限制(通常 2KB 左右) 理论上无限制(可传大文件)
安全性 :参数直接暴露在地址栏和日志中

相对高

数据不可见(但仍需 HTTPS 加密)

缓存/书签 可被浏览器缓存,可收藏为书签 不会被缓存,不可收藏为书签
幂等性

幂等

多次请求结果相同,不改变服务器状态

非幂等:多次提交可能创建多个记录

— — 🌾🌾🌾 更加形象的理解:信封与明信片

GET- 明信片:信息写在背面,所有人(路由器、浏览器历史、中间代理)都能看到,它适合传递不敏感的小信息,比如“我要看第5页的内容”;

POST - 信封:信息封装在信封里面。虽然看不见内容,但如果不给信封加密(使用HTTPS),坏人还是可以拆开看。它适合传递敏感信息(如密码)或大宗信息(如上传文件)。

由于POST传递的数据形式是请求体,无法在代码中模拟出来,下面借助一个调试API的行业标准工具 — —🌵 Postman,可以用它模拟POST请求,并对应到代码逻辑。

Postman下载地址:https://www.postman.com/downloads/

@app.route('/login', methods=['POST'])
def login():
    # 从请求体中获取表单字段
    username = request.form.get('username')
    password = request.form.get('password')
    return f"用户 {username} 尝试登录"

//运行效果:


🌗 混合模式:一个函数处理两种请求

在Flask实际开发中,我们通常把“显示页面(GET)”和“提交数据(POST)”写在同一个路由里:

@app.route('/contact', methods=['GET', 'POST'])
def contact():
    if request.method == 'POST':
        # 处理提交的表单
        msg = request.form.get('message')
        return "感谢您的反馈!"
    
    # 如果是 GET,则渲染并返回联系表单页面
    return render_template('contact_form.html')

(3) 获取JSON数据(JSON API)

表单数据也可以以 json 形式传递,在现代前后端分离开发(如Vue/React)或AI接口调用中常见。

//Postman操作方式:点击红框的位置:raw-JSON,输入JSON格式的数据。

点击Send,后台数据并login函数没有似乎没有接收到这个信息?

No,接收到了,但需要用匹配的形式-request.json.get() 获取:

(4) 获取文件上传(Files)

处理用户上传的图片、音频等。

@app.route('/upload', methods=['POST'])
def upload_file():
    f = request.files['photo']
    f.save('./uploads/' + f.filename)
    return "File uploaded!"

2.3 视图函数的返回值

🎋 在前面的练习中我们返回的都是一个字符串,实际上,它们最终都会被Flask转换成一个

响应对象(Response Object)。Flask非常灵活,它允许返回多种格式的数据。

(1) 常见的返回类型

A. 字符串(String/HTML)

最简单的返回方式,Flask会将其自动包装成一个状态码为200、内容类型为text/html的响应。

@app.route('/')
def index():
    # return "Hello Flask!"  
    return "<h1>Hello Flask!</h1>"  # 浏览器会直接渲染 HTML

B. 字典与列表(自动转JSON)

有时候我们返回的虽然是字符串的形式,在Flask开发中,json.dumps() jsonif() 都能把Python对象转成JSON格式。

🌟区别在于前者是Python标准库提供的序列化工具,而后者是Flask框架特有的响应工具。

 a) json.dumps() ——“转换器”

负责把Python的字典/列表变成一个符合JSON格式的字符串。

@app.route('/dumps')
def use_dumps():
    data = {"name": "Gemini", "status": "active"}
    json_str = json.dumps(data)
    # 报错风险:如果你直接返回这个字符串,浏览器会把它当成普通的 HTML 文本
    return json_str

b) jsonif — — “打包员”

Flask专门为Web开发设计,不仅做了序列化,还帮用户把“货”装进符合HTTP规范的“箱子”。

@app.route('/jsonify')
def use_jsonify():
    # 方式 1:传入字典
    data = {"name": "Gemini", "status": "active"}
    return jsonify(data)

    # 方式 2:直接传键值对 (json.dumps 做不到)
    # return jsonify(name="Gemini", status="active")

实际开发中,jsonify() 更为推荐,因为它支持直接传入多个命名参数,具有更强兼容性,并自动处理一些安全漏洞(如JSON注入攻击)。

在Flask 2.0+版本中,如果返回一个 dict 或 list,Flask会自动调用jsonify()。并将其Content-Type 设置为 application/json,这是编写API接口最常用的方式。


C. 元组(Tuple) — — 自定义状态码

如果用户想控制HTTP状态码(例如返回404或201),可以使用元组格式:

(响应体,状态码,响应头)

@app.route('/error')
def error_demo():
    # 返回内容, 状态码
    return "页面未找到", 404

@app.route('/created')
def create_data():
    # 返回内容, 状态码, 响应头字典
    return {"msg": "创建成功"}, 201, {"X-Custom-Header": "Flask-Demo"}

(2) Flask API 简单实现

在前面学习的基础上,我们可以简单实现一个Flask API开发的小案例,逻辑简单:

案例说明:这是一个典型的API签名生成服务——接收Client传来的字符串,通过特定的算法进行加密后(MD5 + 盐),返回结果。

import hashlib
import json

from flask import Flask, request, jsonify

# 创建按一个Flask实例对象
app = Flask(__name__)

@app.route("/bili", methods=["POST"])
def bili():
    ordered_string = request.json.get('ordered_string')
    if not ordered_string:
        return jsonify({"status":False, "error":"参数错误1"})

    # 调用算法,处理接收到的数据
    encrypt_string = ordered_string + "123456789"
    obj = hashlib.md5(encrypt_string.encode('utf-8'))
    sign = obj.hexdigest()
    return jsonify({"status": True, 'data':sign})

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

// 运行效果:

😎 加密算法:

a) 加盐(Salting):在原始字符串后拼接一个固定字符串。在计算机安全领域中称作“加盐”,目的是防止彩虹表攻击(即简单的MD5被破解)。

b) MD5 哈希:

  • .encode('utf-8'):将字符串转为字节流,因为 hashlib 处理的是二进制数据。

  • hashlib.md5(...):创建 MD5 对象。

  • .hexdigest():将哈希结果转为常用的 32 位十六进制字符串

先学这一部分,今天就这样啦~~~

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐