零基础学习 Python Flask Web 开发 – wiki基地


零基础学习 Python Flask Web 开发:从入门到实践

欢迎来到 Web 开发的世界!如果你是一位 Python 爱好者,并且渴望构建自己的网站或 Web 应用,那么 Flask 无疑是一个绝佳的起点。作为 Python 中著名的微框架,Flask 以其轻量、灵活、易学易用的特点赢得了无数开发者的青睐。

本文将作为你的零基础入门指南,带你一步步揭开 Flask 的神秘面纱,从环境搭建到构建一个简单的 Web 应用,让你对 Flask Web 开发有一个全面而深入的认识。

第一步:认识 Flask – 为什么选择它?

在深入学习之前,我们先来了解一下 Flask。

什么是 Flask?

Flask 是一个使用 Python 编写的轻量级 Web 应用框架。它被称为“微框架”是因为它不强制要求使用特定的工具或库,例如,它没有内置数据库抽象层、表单验证组件等。相反,Flask 只提供 Web 开发最核心的功能:请求处理和路由。

为什么选择 Flask?

  • 轻量与灵活: Flask 核心精简,不预设过多条条框框,开发者可以自由选择合适的数据库、模板引擎、ORM 等第三方库,构建高度定制化的应用。
  • 易学易用: 对于 Python 开发者而言,Flask 的学习曲线非常平缓。它的 API 设计直观简洁,代码量少,很快就能上手开发。
  • 强大的生态系统: 尽管 Flask 核心精简,但围绕它有大量优秀的第三方扩展(Flask Extensions),可以方便地集成各种功能,如用户认证、数据库操作、表单处理、RESTful API 构建等。
  • 活跃的社区: Flask 拥有庞大且活跃的社区,遇到问题时很容易找到帮助和资源。
  • 非常适合小型项目和 API: Flask 特别适合构建小型网站、微服务或 Web API,可以快速启动项目原型。

如果你是零基础入门 Web 开发,或者想快速用 Python 构建一个 Web 应用,Flask 是一个非常值得考虑的选择。

第二步:准备就绪 – 环境搭建

在开始编写 Flask 代码之前,你需要搭建好开发环境。这主要包括安装 Python 和创建虚拟环境。

  1. 安装 Python:
    确保你的电脑上安装了 Python 3.6 或更高版本。你可以访问 Python 官方网站 (python.org) 下载适合你操作系统的安装包。安装过程中,请务必勾选“Add Python to PATH”(将 Python 添加到环境变量)选项,这样你才能在命令行中直接运行 pythonpython3 命令。安装完成后,打开命令行工具(Windows 是 CMD 或 PowerShell,macOS/Linux 是终端),输入 python --versionpython3 --version,如果能正确显示 Python 版本号,说明安装成功。

  2. 理解虚拟环境(Virtual Environment):
    虚拟环境是 Python 开发中一个非常重要的概念。它可以为每个项目创建一个独立的 Python 环境,使得项目之间的依赖包互不影响。这就像为每个项目单独创建一个隔离的“工具箱”,避免了不同项目使用不同版本库时可能出现的冲突。强烈建议在开发任何 Python 项目时都使用虚拟环境。

  3. 创建和激活虚拟环境:
    Python 3.3+ 内置了 venv 模块,非常方便创建虚拟环境。

    • 首先,在你的项目根目录创建一个文件夹(例如 my_flask_app),进入该文件夹。
    • 打开命令行工具,切换到这个文件夹下。
    • 运行以下命令创建虚拟环境(env 是虚拟环境文件夹的名称,你可以自定义):
      bash
      python3 -m venv env

      (在 Windows 上可能是 python -m venv env
    • 激活虚拟环境:
      • macOS / Linux:
        bash
        source env/bin/activate
      • Windows:
        bash
        .\env\Scripts\activate

        激活成功后,你的命令行前会出现虚拟环境的名称(例如 (env)),表示你现在处于这个独立的 Python 环境中。
  4. 在虚拟环境中安装 Flask:
    虚拟环境激活后,使用 pip 命令安装 Flask:
    bash
    pip install Flask

    这会将 Flask 及其依赖安装到当前激活的虚拟环境中。

至此,你的开发环境就搭建好了。你可以开始编写 Flask 代码了!

第三步:你的第一个 Flask 应用 – “Hello, World!”

按照传统,我们的第一个程序总是从打印 “Hello, World!” 开始。在 Web 开发中,这意味着让浏览器访问你的应用时显示 “Hello, World!”。

在你的项目根目录(与 env 文件夹同级)创建一个 Python 文件,命名为 app.py

“`python

app.py

from flask import Flask # 从 flask 库中导入 Flask 类

创建一个 Flask 应用实例

name 是一个特殊变量,代表当前模块的名称

Flask 用它来确定应用根路径,以便找到静态文件和模板文件

app = Flask(name)

定义一个路由(Route)和视图函数(View Function)

@app.route(‘/’) 是一个装饰器,它将 URL 路径 ‘/’ 与下面的函数关联起来

当用户访问应用的根 URL (例如 http://127.0.0.1:5000/) 时,会触发 hello_world 函数

@app.route(‘/’)
def hello_world():
# 视图函数的返回值就是发送给用户浏览器的内容
return ‘Hello, World!’

运行应用

只有当直接运行这个脚本时,才会执行 app.run()

if name == ‘main‘:
# debug=True 开启调试模式,开发过程中非常有用,代码修改后会自动重启服务器,并提供详细的错误信息
app.run(debug=True)
“`

运行你的第一个应用:

确保你的虚拟环境是激活状态。在命令行中,切换到你的项目根目录,然后运行:

bash
python app.py

你会在命令行看到类似以下的输出:

* Serving Flask app 'app' (lazy loading)
* Environment: development
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: XXX-XXX-XXX

打开你的 Web 浏览器,访问地址 http://127.0.0.1:5000/。你应该能看到页面上显示着 “Hello, World!”。

恭喜你!你已经成功运行了你的第一个 Flask Web 应用。

代码解释:

  • from flask import Flask: 导入 Flask 类,它是所有 Flask 应用的核心。
  • app = Flask(__name__): 创建一个 Flask 应用实例。__name__ 告诉 Flask 在哪里寻找资源(如模板和静态文件)。
  • @app.route('/'): 这是一个装饰器。它注册了一个 URL 规则(/ 表示网站根目录)和一个视图函数 (hello_world)。当有人访问 / 路径时,hello_world 函数就会被调用。
  • def hello_world():: 这是一个视图函数。它负责处理来自特定 URL 的请求,并返回一个响应。在这里,它只是简单地返回一个字符串 “Hello, World!”。
  • if __name__ == '__main__':: 这是 Python 的标准写法,确保只有直接运行 app.py 文件时,app.run() 才会被执行。
  • app.run(debug=True): 启动 Flask 开发服务器。debug=True 开启调试模式,这对于开发非常有帮助,因为它会在代码修改时自动重启服务器,并在出现错误时在浏览器中显示详细的调试信息。在生产环境中部署时,应该关闭调试模式。

第四步:深入核心概念

“Hello, World!” 只是一个开始。要构建更复杂的 Web 应用,你需要了解 Flask 的更多核心概念。

1. 路由(Routing)

路由是将 URL 映射到视图函数的过程。你已经使用了 @app.route('/')。你可以定义更多路由来处理不同的 URL 请求。

“`python

在 app.py 中添加

@app.route(‘/about’)
def about():
return ‘This is the About page.’

@app.route(‘/user/‘)
def show_user_profile(username):
# username 是从 URL 中捕获的变量
return f’User: {username}’

@app.route(‘/post/‘)
def show_post(post_id):
# post_id 是从 URL 中捕获的变量,指定类型为 int(整数)
return f’Post ID: {post_id}’
“`

  • 访问 http://127.0.0.1:5000/about 会显示 “This is the About page.”。
  • 访问 http://127.0.0.1:5000/user/Alice 会显示 “User: Alice”。
  • 访问 http://127.0.0.1:5000/post/123 会显示 “Post ID: 123″。

你可以通过在 URL 规则中使用 <variable_name> 来捕获 URL 中的变量,并在视图函数的参数中接收它们。<converter:variable_name> 可以指定变量的类型,例如 intfloatpath(包含斜杠的路径)等。

你还可以限制路由只接受特定的 HTTP 方法(GET, POST, PUT, DELETE 等):

“`python
from flask import request # 需要导入 request 对象

@app.route(‘/login’, methods=[‘GET’, ‘POST’])
def login():
if request.method == ‘POST’:
# 处理 POST 请求的逻辑,例如获取表单数据
username = request.form[‘username’] # 获取表单中名为 username 的字段值
return f’Processing login for {username}’
else:
# 处理 GET 请求的逻辑,例如显示登录页面
return ‘Please log in (GET request)’
``
当你需要获取用户提交的数据(如表单数据、查询参数等)时,可以使用
request` 对象。

2. 模板(Templates)

直接在视图函数中返回 HTML 字符串非常不便,特别是当页面结构复杂或需要动态生成内容时。Flask 使用 Jinja2 模板引擎来渲染 HTML 页面。

  1. 创建 templates 文件夹: 在你的项目根目录(与 app.py 同级)创建一个名为 templates 的文件夹。Flask 会默认在这里寻找模板文件。
  2. 创建 HTML 模板文件:templates 文件夹中创建一个 HTML 文件,例如 index.html

    “`html

    <!DOCTYPE html>


    Flask Demo

    Hello, {{ name }}!

    This is a simple Flask template example.

    {% if items %}
        <h2>Items:</h2>
        <ul>
        {% for item in items %}
            <li>{{ item }}</li>
        {% endfor %}
        </ul>
    {% else %}
        <p>No items to display.</p>
    {% endif %}
    



    ``
    3. **在视图函数中渲染模板:** 修改
    app.py中的视图函数,使用render_template` 函数来渲染这个模板。

    “`python

    app.py

    from flask import Flask, render_template # 导入 render_template 函数

    app = Flask(name)

    @app.route(‘/’)
    def index():
    # 定义一些变量传递给模板
    user_name = “Guest”
    my_items = [“Apple”, “Banana”, “Cherry”]
    # 使用 render_template 渲染模板
    # 第一个参数是模板文件名,后面的参数是以键值对形式传递给模板的变量
    return render_template(‘index.html’, name=user_name, items=my_items)

    … 其他路由 …

    if name == ‘main‘:
    app.run(debug=True)
    “`

Jinja2 模板语法简介:

  • {{ variable }}: 用于输出变量的值。
  • {% control_structure %}: 用于执行控制结构,如 if/elsefor 循环等。
  • {# comment #}: 用于添加模板注释。

刷新浏览器访问 http://127.0.0.1:5000/,你会看到由 index.html 模板渲染出的页面,并且 {{ name }}{% for item in items %} 部分已经被 Python 代码中的变量值替换。

3. 静态文件(Static Files)

网站通常需要引用 CSS 文件来控制样式,JavaScript 文件来实现交互,以及图片等资源。这些文件被称为静态文件。

  1. 创建 static 文件夹: 在你的项目根目录(与 app.pytemplates 同级)创建一个名为 static 的文件夹。Flask 会默认在这里寻找静态文件。
  2. 创建静态文件:static 文件夹中创建子文件夹(例如 css),并在其中创建一个 CSS 文件(例如 style.css):

    css
    /* static/css/style.css */
    body {
    font-family: sans-serif;
    background-color: #f0f0f0;
    margin: 20px;
    }
    h1 {
    color: #333;
    }

    3. 在模板中引用静态文件:templates/index.html 中引用这个 CSS 文件。Flask 提供了 url_for() 函数来动态生成 URL,这是一种推荐的做法,可以避免硬编码路径带来的问题。

    “`html

    <!DOCTYPE html>


    Flask Demo

    Hello, {{ name }}!

    This is a simple Flask template example.

    {% if items %}
        <h2>Items:</h2>
        <ul>
        {% for item in items %}
            <li>{{ item }}</li>
        {% endfor %}
        </ul>
    {% else %}
        <p>No items to display.</p>
    {% endif %}
    



    “`

修改 app.py 中的 index 函数(实际上不需要修改 Python 代码,只需要修改模板),然后刷新浏览器。你会看到页面已经应用了 style.css 中的样式。

url_for() 函数:

url_for() 函数是 Flask 中非常有用的一个函数。它接受视图函数的名称(或者蓝图名称和函数名称)作为第一个参数,以及其他参数(例如路由变量或查询参数),然后根据你的 URL 规则动态生成相应的 URL。

  • url_for('index'): 生成根 URL / (假设 index 是处理 / 的函数名)。
  • url_for('show_user_profile', username='Bob'): 生成 /user/Bob
  • url_for('static', filename='css/style.css'): 特殊用法,第一个参数 static 指向处理静态文件的内置函数,filename 指定静态文件在 static 文件夹中的相对路径,它会生成 /static/css/style.css 这样的 URL。

使用 url_for 的好处是,即使你改变了 URL 规则,只要函数名不变,所有使用 url_for 生成的链接都会自动更新,提高了代码的可维护性。

4. 请求上下文与应用上下文

Flask 在处理请求时,会在后台维护两种上下文:请求上下文 (RequestContext) 和应用上下文 (AppContext)。

  • 请求上下文: 在处理每个 Web 请求期间激活。它使得你可以在视图函数中访问与当前请求相关的数据,例如 request 对象(包含请求方法、表单数据、查询参数等)和 session 对象(用于存储跨请求的用户特定信息)。
  • 应用上下文: 在应用生命周期内激活。它使得你可以在没有请求的情况下访问应用相关的资源,例如 current_app 对象(表示当前的 Flask 应用实例)和 g 对象(一个用于存储临时数据的特殊对象,其生命周期与请求相同)。

这些上下文是 Flask “魔法”的一部分,它们使得你可以在应用的任何地方(只要处于正确的上下文下)访问 requestsession 等全局对象,而无需显式地将它们作为参数传递。

5. Session(会话)

HTTP 是无状态协议,服务器无法记住用户的身份或在不同请求之间保持状态。Session 机制允许服务器在用户访问期间存储少量与该用户相关的数据,从而实现状态的维持。

Flask 提供了一个 session 对象,它是一个类似字典的接口,用于存储会话数据。Session 数据通常存储在客户端的 Cookie 中,经过加密签名,因此需要设置一个秘钥(Secret Key)来确保数据安全。

“`python

app.py

from flask import Flask, render_template, request, session, redirect, url_for

app = Flask(name)

设置一个秘钥,用于加密 session 数据

在实际应用中,这个秘钥应该是复杂的随机字符串,并且保存在安全的地方

app.config[‘SECRET_KEY’] = ‘your_super_secret_key_here’

@app.route(‘/set_session’)
def set_session():
session[‘username’] = ‘Alice’
session[‘user_id’] = 123
return ‘Session data set.’

@app.route(‘/get_session’)
def get_session():
username = session.get(‘username’) # 使用 .get() 避免 key 不存在时报错
user_id = session.get(‘user_id’)
if username:
return f’Username: {username}, User ID: {user_id}’
else:
return ‘Session data not found.’

@app.route(‘/clear_session’)
def clear_session():
session.pop(‘username’, None) # 删除特定的 session 项
session.pop(‘user_id’, None)
# 或者清空所有 session 数据:session.clear()
return ‘Session data cleared.’
“`

访问 /set_session,然后访问 /get_session,你会看到存储的会话数据。访问 /clear_session 后再访问 /get_session,数据就会消失。

重要: SECRET_KEY 在生产环境中必须是一个足够随机和复杂的字符串,并且不应直接写在代码中,可以通过环境变量等方式配置。

第五步:下一步去哪里?

你已经掌握了 Flask 的基本概念:环境搭建、路由、模板、静态文件和会话。这足以让你构建一个简单但完整的 Web 应用。接下来,你可以进一步深入学习:

  1. 数据库集成: 绝大多数 Web 应用都需要与数据库交互来存储和检索数据。你可以学习如何将 Flask 与数据库集成,常用的选择包括:
    • SQLAlchemy: 一个强大的 Python ORM(对象关系映射)库,可以方便地操作关系型数据库(如 SQLite, PostgreSQL, MySQL)。
    • Flask-SQLAlchemy: SQLAlchemy 的 Flask 扩展,简化了在 Flask 应用中使用 SQLAlchemy 的过程。
    • MongoDB: 一个流行的 NoSQL 数据库,可以使用 PyMongoFlask-PyMongo 库进行集成。
  2. 表单处理: 网站通常需要处理用户提交的表单数据(如注册、登录)。
    • WTForms: 一个灵活的表单处理库。
    • Flask-WTF: WTForms 的 Flask 扩展,提供了 CSRF 保护等功能。
  3. 用户认证和授权: 实现用户注册、登录、注销以及控制用户访问权限。
    • Flask-Login: 一个管理用户会话的 Flask 扩展。
    • Flask-Security / Flask-Security-Too: 提供更全面的认证和授权功能。
  4. 构建 RESTful API: 如果你想用 Flask 构建后端服务而不是传统的网站,可以学习如何构建 RESTful API 来与前端应用(如 React, Vue, Angular)或移动应用交互。
    • Flask-RESTful: 简化构建 RESTful API 的过程。
    • Flask-RESTx: 提供了 Swagger UI 等文档生成功能。
  5. 应用结构组织: 随着项目变大,你需要学习如何组织你的 Flask 应用代码,使其更具模块化和可维护性。可以了解蓝图(Blueprints)的使用。
  6. 错误处理: 学习如何优雅地处理 404(未找到)、500(服务器内部错误)等 HTTP 错误。
  7. 测试: 学习如何为你的 Flask 应用编写单元测试和集成测试。
  8. 部署: 当你的应用开发完成后,你需要将其部署到生产服务器上,让全世界都能访问。了解 WSGI 服务器(如 Gunicorn, uWSGI)、Web 服务器(如 Nginx, Apache)以及云平台(如 Heroku, Render, AWS, Azure, GCP)上的部署流程。

学习资源推荐

  • Flask 官方文档: 最权威的学习资料,详细介绍了 Flask 的各个功能和 API。 (https://flask.palletsprojects.com/)
  • The Flask Mega-Tutorial by Miguel Grinberg: 一个非常经典的 Flask 入门到进阶教程,通过构建一个完整的博客应用来讲解 Flask 的方方面面。 (https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-1)
  • Real Python: 提供大量高质量的 Python 和 Flask 教程。 (https://realpython.com/)
  • 在线课程平台: Coursera, Udemy, Codecademy 等平台都有关于 Flask 的课程。
  • GitHub: 查看其他开源的 Flask 项目,学习它们的结构和实现方式。

学习建议

  • 多动手实践: 理论结合实践是最好的学习方式。边看教程边自己敲代码,修改代码,观察结果,理解概念。
  • 从简单项目开始: 不要一开始就尝试构建一个复杂的应用。可以从简单的博客、待办事项列表、问答网站等开始,逐步增加功能。
  • 理解错误信息: 当程序报错时,认真阅读错误信息(Traceback),它会告诉你错误发生在哪个文件、哪一行,以及错误类型。这是调试的关键。
  • 善用搜索引擎: 遇到问题时,在 Google 或百度上搜索你的问题和错误信息,很可能有人已经遇到并解决了相同的问题。
  • 参与社区: 在 Stack Overflow、Python 社区论坛或相关的技术交流群中提问和交流,也能学到很多。

总结

恭喜你踏出了 Flask Web 开发的第一步!本文带你了解了 Flask 的基本概念、环境搭建、以及构建一个简单应用所需的路由、模板和静态文件知识。

Flask 是一个强大而灵活的工具,它可以帮助你快速地将 Python 技能转化为 Web 应用。记住,学习是一个循序渐进的过程,不断实践、探索和解决问题是掌握任何技术的关键。

希望这篇详细的文章能帮助你更好地开启 Flask 学习之旅。祝你在 Web 开发的世界里探索愉快!

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部