Flask框架


一、Flask简介

1.1 什么是Flask?

Flask 是一个用 Python 编写的轻量级 Web 应用框架。它遵循 WSGI(Web Server Gateway Interface) 规范,并使用 Jinja2 模板引擎。Flask 的设计哲学是简单、灵活、可扩展,适用于从简单的原型开发到复杂的 Web 应用。

1.2 Flask 的特点

  • 轻量级:Flask 是一个微框架(Microframework),本身只提供核心功能,其他功能通过扩展实现,避免了不必要的功能加载。

  • 灵活性:Flask 不强制开发者遵循固定的目录结构或编程风格,开发者可以根据需要自由定制。

  • 内置开发服务器:提供一个简单的开发服务器,便于快速启动和调试。

  • 扩展性:支持丰富的扩展库,如数据库、认证、表单验证等,这些扩展可与 Flask 无缝集成。

  • Jinja2 模板引擎:支持动态 HTML 页面生成。

  • 路由管理:内置路由功能,便于 URL 映射到视图函数。

1.3 核心组件

  • Flask 核心对象Flask 类用于创建应用实例。

  • 路由(Routing):使用 @app.route 装饰器定义 URL 与视图函数的映射。

  • 模板引擎:使用 Jinja2 渲染 HTML 模板,并支持变量替换和控制结构(如循环、条件)。

  • 请求与响应request 对象用于处理 HTTP 请求,response 对象用于返回响应。

  • 错误处理:内置错误处理机制,可自定义错误页面。

1.4 Flask的主要扩展

  • Flask-SQLAlchemy:ORM(对象关系映射)工具,用于数据库操作。

  • Flask-WTF:处理表单和 CSRF 防护。

  • Flask-Login:用户认证与管理。

  • Flask-Migrate:数据库迁移管理。

  • Flask-Mail:处理邮件发送。

1.5 适用场景

  • 快速原型开发:Flask 轻量、灵活,非常适合快速验证产品概念。
  • API 开发:使用 Flask 可以快速构建 RESTful API 服务。
  • 小型 Web 应用:适合开发中小型网站或应用程序。
  • 微服务架构:由于其轻量和扩展性,Flask 是构建微服务的理想选择。

什么是RESTful API?

RESTful API是一种设计简洁、易于使用的网络接口风格,它通过HTTP方法(如GET、POST、PUT、DELETE)让客户端与服务器交换数据。这种接口风格遵循无状态、统一接口等原则,使得网络服务更直观、高效。

RESTful API通常使用以下HTTP方法:

  • GET:请求从服务器检索特定资源。GET请求应该是安全的,不会产生副作用。
  • POST:向服务器提交数据以创建新资源。
  • PUT:更新服务器上的现有资源或创建新资源。
  • DELETE:从服务器删除资源。
  • PATCH:对资源进行部分修改。

例子:

  1. GET /users:获取用户列表。
  2. POST /users:创建新用户。
  3. PUT /users/{id}:更新特定用户信息。
  4. DELETE /users/{id}:删除特定用户。

总的来说,RESTful API是一种设计简洁、易于理解和使用的API风格,它使得客户端和服务器之间的通信更加直观和高效。

1.6 与其他框架的对比

Flask vs Django vs FastAPI

Flask 是一个非常适合快速开发、轻量级 Web 应用的框架。如果你需要一个简单易用、灵活可扩展的 Python Web 框架,Flask 是一个很好的选择。

二、Flask 的基本应用结构

一个简单的 Flask 应用示例如下:

from flask import Flask, render_template, request

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

# 定义路由与视图函数
@app.route('/')
def home():
    return "Hello, Flask!"

@app.route('/greet/<name>')
def greet(name):
    return f"Hello, {name}!"

# 启动应用
if __name__ == '__main__':
    app.run(debug=True)

三、Flask常用模块

3.1 Flask

3.1.1 Flask类的基本使用

用途:核心模块,用于创建和管理 Flask 应用程序。

示例

from flask import Flask

app = Flask(__name__)
@app.route('/')
def home():
    return "Hello, Flask!"

app = Flask(__name__) 是 Flask 应用的基础代码,它用于创建一个 Flask 应用实例。

1. Flask

  • Flask 是 Flask 框架提供的核心类,负责处理 HTTP 请求、管理路由、加载配置等功能。
  • 通过实例化 Flask 类,可以生成一个应用对象,用于组织和运行整个 Web 应用。

2. __name__ 参数

  • __name__是 Python 的特殊变量,用于标识当前模块的名字。
    • 如果该模块是直接运行的脚本,__name__ 的值为 '__main__'
    • 如果该模块是被导入的,__name__ 的值为模块的名称。
  • 在 Flask 中,__name__的作用
    • 确定应用的根路径:Flask 使用它定位应用所在的目录,这对加载静态文件(如 CSS、JS)和模板文件(如 HTML)至关重要。

3. app 变量

  • app 是通过 Flask 类实例化得到的对象,它代表了整个 Flask 应用实例。

  • 它是 Web 应用的核心,用于注册路由、处理请求、配置应用、管理扩展等。

  • 常见用法:

    定义路由

@app.route('/')
def home():
    return "Hello, Flask!"

运行应用:

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

总结:app = Flask(__name__) 是 Flask 应用开发的起点,用来初始化一个 Web 应用对象。Flask 类负责提供应用的功能,而 __name__ 帮助框架定位资源路径和运行环境。

3.1.2 监听0.0.0.0和127.0.0.1的区别

app.run(host=‘0.0.0.0’,port=5001) 和app.run(host=‘127.0.0.1’,port=5001)

app.run(host='0.0.0.0', port=5001)app.run(host='127.0.0.1', port=5001) 都是启动 Flask 应用的方法,但它们在 监听地址访问方式 上存在差异。以下是详细解释:

1. 共同点

  • 功能:两者都用于启动 Flask 开发服务器,监听指定的主机地址和端口。
  • 端口号:两者都监听 5001 端口,可以通过浏览器或 HTTP 客户端访问。

2. 差异:监听地址(host 参数)

host='0.0.0.0'

  • 含义:
    • 0.0.0.0 是一个特殊的 IP 地址,表示监听所有网络接口(包括本地接口和外部接口)。
  • 结果
    • 应用可以被本机(localhost)和同一局域网中的其他设备访问。
    • 示例:
      • 本地访问:http://127.0.0.1:5001
      • 局域网访问:http://<你的局域网 IP>:5001(如 http://192.168.1.100:5001

host='127.0.0.1'

  • 含义:
    • 127.0.0.1 是本地回环地址(localhost),只监听本地接口。
  • 结果:
    • 应用只能被本机访问,无法被其他设备访问。
    • 示例:
      • 本地访问:http://127.0.0.1:5001
      • 局域网设备无法访问。

3.实际用途

实际用途

4. 安全性注意事项

  • 开发环境:
    • Flask 自带的开发服务器不适合生产环境,host='0.0.0.0' 时需特别小心,避免暴露到公网。
  • 生产环境:
    • 使用专业的 WSGI 服务器(如 gunicornuWSGI)配合反向代理服务器(如 Nginx)运行应用,提供更高的性能和安全性。

总结

  • **host='127.0.0.1'**:仅限本机访问,适合安全性要求较高的开发场景。
  • **host='0.0.0.0'**:允许外部设备访问,适合局域网测试或需要共享的场景,但需注意潜在的安全风险。

3.2 jsonify

用途:将 Python 数据结构(如字典、列表等)转换为 JSON 格式并返回 HTTP 响应。

特点:自动设置响应的 Content-Typeapplication/json

示例

from flask import jsonify

@app.route('/data')
def data():
    return jsonify({'name': 'Alice', 'age': 30})

3.3 request

用途:获取客户端发送的 HTTP 请求信息,包括数据、头部、方法等。

常用方法

  • request.args:获取查询参数(GET 请求)。
  • request.form:获取表单数据(POST 请求)。
  • request.json:获取 JSON 格式的数据。

示例

from flask import request

@app.route('/form', methods=['POST'])
def form():
    name = request.form['name']
    return f"Hello, {name}!"

3.4 redirect

用途:重定向到指定的 URL。

特点:通常与 HTTP 状态码 302 或 301 一起使用。

示例

from flask import redirect

@app.route('/old')
def old():
    return redirect('/new')

3.5 render_template

  • 用途:渲染模板文件(如 HTML),动态生成网页内容。
  • 特点:使用 Jinja2 模板引擎,支持变量替换和逻辑控制。
  • 示例
from flask import render_template

@app.route('/profile/<name>')
def profile(name):
    return render_template('profile.html', username=name)

文章作者: 司晓凯
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 司晓凯 !
  目录