初始Flask框架

初始Flask框架

Flask 是一个轻量级的 Python Web 框架,它基于 WSGI 工具包 Werkzeug 和模板引擎 Jinja2 构建,被广泛用于快速开发 Web 应用和 API。Flask 的设计理念是 “微而不缺”(Micro but not lacking),它提供了核心功能(如路由、请求处理、会话管理),但不强制依赖特定的数据库或表单验证工具,开发者可以根据需求自由选择和集成第三方扩展。

核心特点

  1. 轻量级:无内置数据库、表单验证或用户认证系统,仅保留 Web 应用的核心功能。
  2. 灵活:支持各种数据库(SQLite、MySQL、PostgreSQL)、ORM(SQLAlchemy)、表单验证(WTForms)等。
  3. 可扩展:通过 Flask 扩展(如 Flask-RESTful、Flask-SQLAlchemy、Flask-Login)轻松添加功能。
  4. 学习曲线平缓:适合初学者快速上手 Web 开发。

Flask 与 Django 的对比

  • Flask:适合小型项目、API 开发、快速原型或需要高度定制的场景。
  • Django:内置 ORM、管理后台、表单验证等全套组件,适合大型、功能完整的 Web 应用。

基本工作流程

  1. 路由定义:通过装饰器(如 @app.route('/'))将 URL 映射到处理函数。
  2. 请求处理:接收 HTTP 请求,处理业务逻辑,返回响应(HTML、JSON 等)。
  3. 模板渲染:使用 Jinja2 模板引擎生成动态 HTML。
  4. 会话管理:通过 Cookie 或服务器端会话跟踪用户状态。

常用扩展

  • Flask-SQLAlchemy:数据库 ORM 工具,简化数据库操作。
  • Flask-RESTful:构建 RESTful API 的工具。
  • Flask-Login:处理用户认证和会话管理。
  • Flask-JWT-Extended:支持 JSON Web Token(JWT)认证。
  • Flask-CORS:处理跨域资源共享(CORS)问题。

实际应用场景

  • API 开发:构建轻量级后端服务(如 JSON API、GraphQL)。
  • Web 应用原型:快速验证想法,后期可扩展为大型项目。
  • 微服务:作为独立服务处理特定业务逻辑。
  • 数据可视化:结合前端框架(如 React、Vue)展示动态数据。

安装方法

通过 pip 安装 Flask:

pip3 install flask

示例Flask

创建一个简单flask

下面是一个简单的 Flask 应用示例,创建一个返回 “Hello, World!” 的 Web 服务:

from flask import Flask

# 创建 Flask 应用实例,__name__ 表示当前模块名称
app = Flask(__name__)

# 定义路由:当用户访问根路径 / 时,执行下方的函数
@app.route('/')
def hello_world():  # 视图函数,处理客户端请求并返回响应
    return 'Hello, world!'  # 返回字符串作为 HTTP 响应内容

# 主程序入口:确保应用只在直接运行脚本时启动,而非被导入时
if __name__ == '__main__':
    # 启动 Flask 开发服务器
    # host='0.0.0.0' 允许外部网络访问
    # port=5000 指定服务器端口
    # debug=True 开启调试模式,修改代码后自动重启并显示详细错误信息
    app.run(host='0.0.0.0', port=5000, debug=True)

运行站点

python3 aaa.py

访问该站点

[root@localhost ~]# curl 192.168.10.101:5000
Hello,world!
###!!!!成功
Flask路由与视图函数
from flask import Flask

# 创建 Flask 应用实例,__name__ 作为应用根路径的参考点
app = Flask(__name__)

# 定义根路径路由:当用户访问网站根目录时触发
@app.route('/')
def hello_world():
    # 返回静态字符串作为 HTTP 响应
    return 'Hello,world!'

# 定义动态路由:通过 URL 参数接收用户名
@app.route('/greet/<name>')
def greet(name):
    # 使用 f-string 格式化字符串,动态生成问候语
    return f'nihao, {name}'

# 主程序入口:确保应用作为脚本直接运行时才启动服务器
if __name__ == '__main__':
    # 启动 Flask 开发服务器
    # host='0.0.0.0': 允许外部网络访问
    # port=5000: 监听 5000 端口
    # debug=True: 开启调试模式(自动重载代码 + 详细错误信息)
    app.run(host='0.0.0.0', port=5000, debug=True)

代码解释:

  • <name> 是 URL 变量,会被捕获并传递给 name 参数
  • f'nihao, {name}' 使用 Python 3.6+ 的格式化字符串语法

访问

[root@localhost ~]# curl 192.168.10.101:5000/greet/zhangsan
nihao, zhangsan
[root@localhost ~]# 

多种http请求方法

在上面原有的基础上增加一个route

@app.route('/submit',methods=['POST'])
def submit():
    return '提交成功'

代码功能

创建一个接收 POST 请求 的 API 端点 /submit,当客户端通过 POST 方法访问该路径时,返回固定文本 提交成功

  • @app.route:Flask

  • 的路由装饰器,将 URL 路径映射到视图函数。

  • /submit:定义访问路径,客户端需请求 http://域名/submit

  • methods=['POST']
    

    限制请求方法

    为 POST(默认仅支持 GET)。

    ✅ 常见 HTTP 方法:

    • GET:获取资源(如查询数据)。
    • POST:提交数据(如表单、文件上传)。
    • PUT:更新资源。
    • DELETE:删除资源。

访问

[root@localhost ~]# curl  -XPOST 192.168.10.101:5000/submit
提交成功[root@localhost ~]# 

使用Jinjia2模版渲染HTMl示例

什么是Jinjia?

Jinja2 是 Python 生态中最流行的 模板引擎,由 Flask 框架的开发者 Armin Ronacher 创建,用于将 Python 变量和逻辑嵌入到 HTML、XML 或其他文本格式中,广泛应用于 Web 开发、邮件模板、配置文件生成等场景。

核心特点

  1. 安全:默认自动转义 HTML,防止 XSS 攻击。
  2. 灵活:支持变量渲染、条件判断、循环、过滤器等。
  3. 可扩展:自定义过滤器、标签和测试函数。
  4. 高性能:编译模板为 Python 字节码,执行速度快。
  5. 集成友好:与 Flask、Django 等框架无缝集成。
与其他模板引擎对比
特性Jinja2Django 模板Mako
安全性中等
性能中等极高
灵活性中等极高
语法复杂度中等简单复杂
语法示例

使用jinjia2模版渲染html

[root@localhost ~]# mkdir templates   ###创建templates 目录 (flask默认模版存放位置)
[root@localhost ~]# cd templates ###进入目录
[root@localhost templates]# vim index.html
<html>
<head>
<meta charset='UTF-8'>
<title>你好,杜甫</title>

</head>
<body>
<h1> hello, {{ name }} </h1>

</body>



</html>


代码功能解析

  1. HTML 基础结构

    • 标准的 HTML5 文档结构,包含 headbody 标签。
    • charset='UTF-8' 确保中文等非 ASCII 字符正常显示。
  2. Jinja2 模板语法

    <h1> hello, {{ name }} </h1>
    
    • {{ name }} 是 Jinja2 的 变量占位符,会在渲染时被替换为 Python 传递的数据。
    • 例如,若 Python 代码传递 name='李白',则最终页面会显示 hello, 李白
  3. 静态与动态内容结合

    • <title>你好,杜甫</title> 是静态文本,始终显示 “你好,杜甫”。
    • <h1> hello, {{ name }} </h1> 是动态内容,name 会被替换。
from flask import Flask, render_template

# 创建 Flask 应用实例
app = Flask(__name__)

# 定义动态路由:接收 URL 中的 name 参数
@app.route('/greet/<name>')
def greet(name):
    # 渲染 templates/index.html 模板,并将 name 参数传递给模板
    # 模板中的 {{ name }} 会被替换为实际传入的值
    return render_template('index.html', name=name)

# 主程序入口:确保应用作为脚本直接运行时才启动服务器
if __name__ == '__main__':
    # 启动 Flask 开发服务器
    # host='0.0.0.0': 允许外部网络访问
    # port=5000: 监听 5000 端口
    # debug=True: 开启调试模式(自动重载代码 + 详细错误信息)
    app.run(host='0.0.0.0', port=5000, debug=True)

  

这里站点的name值会传参给网页中的name值

访问验证
[root@localhost ~]# curl 192.168.10.101:5000/greet/lisi  ##这里我们输入lisi name参数传参给下方网页中的name
<html>
<head>
<meta charset='UTF-8'>
<title>你好,杜甫</title>

</head>
<body>
<h1> hello, lisi </h1>   ###这里的lisi参数是有站点中name传参

</body>

</html>

模板的继承与块

什么是模版的继承

模板继承是 Jinja2(以及许多其他模板引擎)提供的一种强大机制,用于创建可复用的模板结构。它允许你定义一个基础模板(包含通用布局),然后通过子模板继承并覆盖特定部分,从而避免代码重复。

核心概念
  • 基础模板:定义网站的整体结构(如头部、导航栏、页脚),包含可被子模板替换的 块(block)
  • 子模板:继承基础模板,并通过 {% block %} 标签覆盖特定区域的内容。
  • 基础模版一定写入到子模版内
示例

站点文件

# 导入 Flask 框架和模板渲染函数
from flask import Flask, render_template

# 创建 Flask 应用实例,__name__ 表示当前模块名称
app = Flask(__name__)

# 定义根路径 '/' 的路由处理函数
@app.route('/')
def aaa():
    # 渲染并返回 templates 目录下的 base.html 模板
    # 注意:需要确保 templates 目录存在且包含 base.html 文件
    return render_template('base.html')

# 应用程序入口点
if __name__ == '__main__':
    # 启动 Flask 开发服务器
    # host='0.0.0.0' 允许外部访问服务器
    # port=5000 指定服务器端口为 5000
    # debug=True 开启调试模式,代码修改后自动重启服务器
    app.run(host='0.0.0.0', port=5000, debug=True)

关键注释说明:

  1. Flask 实例创建:通过 Flask(__name__) 创建应用实例

  2. 路由定义:使用 @app.route 装饰器定义 URL 路由

  3. 模板渲染render_template 函数会在 templates 目录中查找指定的模板文件

  4. 开发服务器配置

    • host='0.0.0.0' 使服务器可通过网络访问
    • debug=True 仅用于开发环境,生产环境应禁用
  5. 应用入口if __name__ == '__main__' 确保代码作为脚本直接运行时才启动服务器

基础模版 base.html

<!DOCTYPE html>
<!-- 设置页面语言为简体中文 -->
<html lang="zh-CN">
<head>
    <!-- 设置字符编码为 UTF-8 -->
    <meta charset="UTF-8">
    <!-- 配置响应式布局,确保在移动设备上正确显示 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 使用 Jinja2 模板引擎的块标签,允许子模板覆盖页面标题 -->
    <title>{% block title %}My website{% endblock %}</title>
    <!-- 引入 Font Awesome 图标库 -->
    <link href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" rel="stylesheet">
</head>
<body>
    <!-- 页面头部区域,通常包含导航栏 -->
    <header>
        <h1>nihao</h1>
        <!-- 导航菜单,使用无序列表实现 -->
        <nav>
            <ul>
                <li><a href="/">首页</a></li>
                <li><a href="/about">关于</a></li>
                <li><a href="/contact">联系我们</a></li>
            </ul>
        </nav>
    </header>

    <!-- 主内容区域,使用 Tailwind CSS 类实现居中布局和内边距 -->
    <!-- container mx-auto 使内容居中,px-4 提供水平内边距,py-8 提供垂直内边距 -->
    <main class="container mx-auto px-4 py-8">
        <!-- Jinja2 块标签,子模板将在这里插入具体内容 -->
        {% block content %}{% endblock %}
    </main>

    <!-- 页脚区域,使用深灰色背景和白色文字 -->
    <footer class="bg-gray-800 text-white py-8">
        <div class="container mx-auto px-4">
            <p>© 2025 版权所有</p>
        </div>
    </footer>
</body>
</html>

代码结构说明

  1. 文档类型与语言设置
    • <!DOCTYPE html> 声明使用 HTML5 标准
    • lang="zh-CN" 指定页面语言为简体中文
  2. 头部元信息
    • 字符编码设置
    • 响应式布局配置
    • 动态标题块(可被子模板覆盖)
    • 外部资源引入
  3. 页面结构
    • <header>:页面头部区域,包含网站标题和导航
    • <main>:主要内容区域,使用 Tailwind CSS 类实现响应式布局
    • <footer>:页脚区域,显示版权信息
  4. 模板继承机制
    • {% block title %}:允许子模板自定义页面标题
    • {% block content %}:子模板的主要内容将插入此处

验证

用浏览器访问更加直观

http://192.168.10.101:5000/
CTYPE html>
nihao
首页
关于
联系我们
© 2025 版权所有

总结

Flask 的 “微框架” 特性使其成为灵活、高效的开发工具,尤其适合追求简洁性和自由度的开发者。无论是个人项目、企业级应用,还是 API 服务,Flask 都能以最小的学习成本实现强大功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值