Python Flask 入门教程
欢迎来到 Python Flask 的世界!Flask 是一个轻量级的 Python Web 框架,以其简洁、灵活和易于上手而受到开发者的喜爱。它不包含 ORM(对象关系映射器)或特定验证工具等功能,而是让你自由选择适合项目的组件。这使得 Flask 成为构建小型应用程序、API 或学习 Web 开发的绝佳选择。
1. 什么是 Flask?
Flask 是一个微型 Web 框架,意味着它旨在保持核心简单且可扩展。它基于 Werkzeug WSGI 工具包和 Jinja2 模板引擎。
为什么选择 Flask?
* 轻量级: 核心功能精简,易于理解和使用。
* 灵活性: 不强制使用特定工具或库,你可以根据项目需求自由选择。
* 易于上手: 对于初学者友好,可以快速搭建起一个 Web 应用。
* 强大的社区和生态: 有大量的扩展和插件可供选择。
2. 环境准备
在开始之前,请确保你的系统上安装了 Python 和 pip(Python 包管理器)。通常,安装 Python 时 pip 也会一并安装。
你可以通过以下命令检查 Python 和 pip 的版本:
bash
python --version
pip --version
推荐使用虚拟环境来管理项目依赖,以避免不同项目间的包冲突:
“`bash
创建虚拟环境
python -m venv venv
激活虚拟环境 (Windows)
.\venv\Scripts\activate
激活虚拟环境 (macOS/Linux)
source venv/bin/activate
``(venv)` 字样。
激活虚拟环境后,你会看到命令行前缀有
3. 安装 Flask
在激活的虚拟环境中,使用 pip 安装 Flask:
bash
pip install Flask
4. 第一个 Flask 应用:Hello, World!
现在,让我们来创建一个最简单的 Flask 应用程序。在你的项目目录下创建一个名为 app.py 的文件,并添加以下代码:
“`python
from flask import Flask
创建 Flask 应用程序实例
app = Flask(name)
定义一个路由(URL 路径)
@app.route(‘/’)
def hello_world():
return ‘Hello, World!’
当直接运行此脚本时,启动开发服务器
if name == ‘main‘:
# debug=True 会在代码修改后自动重载服务器,并提供调试信息
app.run(debug=True)
“`
代码解释:
* from flask import Flask: 从 flask 库导入 Flask 类。
* app = Flask(__name__): 创建一个 Flask 应用程序实例。__name__ 是一个特殊的 Python 变量,在这里用于帮助 Flask 找到资源文件。
* @app.route('/'): 这是一个装饰器,将 hello_world 函数绑定到 URL 路径 /。当用户访问应用程序的根 URL 时,就会执行这个函数。
* def hello_world():: 这是一个视图函数,它返回一个字符串。这个字符串将作为 HTTP 响应发送给浏览器。
* if __name__ == '__main__':: 这是一个标准的 Python 惯用法,确保 app.run() 只在直接运行 app.py 文件时执行,而不是在它被导入为模块时执行。
* app.run(debug=True): 启动 Flask 的开发服务器。debug=True 开启调试模式,这在开发过程中非常有用,因为它会在代码更改时自动重启服务器,并在出现错误时提供详细的错误信息。
5. 运行你的第一个 Flask 应用
在命令行中,确保你处于虚拟环境且在 app.py 所在的目录下,然后运行:
bash
python app.py
你会在命令行中看到类似这样的输出:
* Serving Flask app 'app'
* Debug mode: on
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
* Running on http://127.0.0.1:5000
Press CTRL+C to quit
* Restarting with stat
* Viewer running on http://127.0.0.1:5000
打开你的浏览器,访问 http://127.0.0.1:5000,你将看到 “Hello, World!”。
6. 使用 HTML 模板 (Jinja2)
直接在视图函数中返回 HTML 字符串会变得非常笨重。Flask 使用 Jinja2 作为其默认模板引擎,允许你将 HTML 结构与 Python 逻辑分离。
-
创建
templates文件夹:
在app.py同级目录下,创建一个名为templates的文件夹。Flask 会自动在这个文件夹中寻找模板文件。 -
创建模板文件
index.html:
在templates文件夹中创建index.html,并添加以下内容:html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ title }}</title>
</head>
<body>
<h1>欢迎, {{ name }}!</h1>
<p>这是一个 Flask 应用程序。</p>
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
</body>
</html>Jinja2 语法解释:
*{{ variable }}: 用于显示变量的值。
*{% statement %}: 用于执行控制结构,如for循环、if语句等。 -
修改
app.py使用模板:
“`python
from flask import Flask, render_templateapp = Flask(name)
@app.route(‘/’)
def index():
page_title = “我的 Flask 首页”
user_name = “访客”
my_items = [“苹果”, “香蕉”, “橘子”]
# render_template 用于渲染 templates 文件夹中的模板文件
# 可以通过关键字参数将数据传递给模板
return render_template(‘index.html’, title=page_title, name=user_name, items=my_items)@app.route(‘/about’)
def about():
return render_template(‘about.html’, title=”关于我们”)if name == ‘main‘:
app.run(debug=True)
“`你还需要在
templates文件夹中创建一个about.html文件:
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ title }}</title>
</head>
<body>
<h1>关于我们</h1>
<p>我们致力于构建简单而强大的 Web 应用程序。</p>
<a href="/">返回首页</a>
</body>
</html>
现在访问 http://127.0.0.1:5000 和 http://127.0.0.1:5000/about,看看效果。
7. 静态文件(CSS, JavaScript, 图片)
Web 应用通常需要加载 CSS 样式表、JavaScript 脚本和图片。Flask 会自动在名为 static 的文件夹中寻找这些静态文件。
-
创建
static文件夹:
在app.py同级目录下,创建一个名为static的文件夹。你可以在其中再创建css,js,images等子文件夹。 -
创建
static/css/style.css:
css
body {
font-family: Arial, sans-serif;
margin: 20px;
background-color: #f4f4f4;
color: #333;
}
h1 {
color: #0056b3;
}
ul {
list-style-type: disc;
margin-left: 20px;
} -
修改
index.html链接 CSS:
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ title }}</title>
{# 使用 url_for 函数引用静态文件 #}
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body>
<h1>欢迎, {{ name }}!</h1>
<p>这是一个 Flask 应用程序。</p>
<ul>
{% for item in items %}
<li>{{ item }}</li>
{% endfor %}
</ul>
</body>
</html>
url_for('static', filename='css/style.css')是 Flask 提供的一个非常实用的函数,用于生成静态文件的 URL。它会考虑到你的应用部署路径,避免硬编码路径的问题。
8. 处理表单数据
Web 应用经常需要接收用户提交的表单数据。Flask 提供了 request 对象来访问这些数据。
-
修改
app.py处理表单:
“`python
from flask import Flask, render_template, request, redirect, url_forapp = Flask(name)
@app.route(‘/’)
def index():
page_title = “我的 Flask 首页”
user_name = “访客”
my_items = [“苹果”, “香蕉”, “橘子”]
return render_template(‘index.html’, title=page_title, name=user_name, items=my_items)@app.route(‘/submit’, methods=[‘GET’, ‘POST’])
def submit_form():
if request.method == ‘POST’:
# 从表单数据中获取 ‘username’ 和 ‘message’ 字段
username = request.form[‘username’]
message = request.form[‘message’]
print(f”用户: {username}, 消息: {message}”)
# 处理完数据后,重定向到首页
return redirect(url_for(‘index’))
# 如果是 GET 请求,显示表单页面
return render_template(‘form.html’, title=”提交表单”)if name == ‘main‘:
app.run(debug=True)
“` -
创建
templates/form.html:
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ title }}</title>
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body>
<h1>提交你的信息</h1>
{# action 指定表单提交的 URL,method 指定请求方法 #}
<form method="POST" action="{{ url_for('submit_form') }}">
<label for="username">用户名:</label><br>
<input type="text" id="username" name="username" required><br><br>
<label for="message">你的消息:</label><br>
<textarea id="message" name="message" rows="4" cols="50"></textarea><br><br>
<input type="submit" value="提交">
</form>
<a href="/">返回首页</a>
</body>
</html>
注意: 在submit_form路由中,我们指定了methods=['GET', 'POST']。GET用于加载表单页面,POST用于接收表单提交的数据。request.form是一个字典,包含所有 POST 请求的表单数据。redirect(url_for('index'))用于在处理完表单后将用户重定向回首页,这是一个良好的实践,可以防止重复提交。
现在访问 http://127.0.0.1:5000/submit,填写并提交表单,观察服务器日志和页面跳转。
9. 总结与展望
恭喜你!你已经掌握了 Flask 的基本用法,包括:
* 创建 Flask 应用程序。
* 定义路由和视图函数。
* 使用 Jinja2 模板渲染 HTML 页面。
* 传递数据到模板。
* 集成静态文件(CSS)。
* 处理简单的表单提交。
这只是 Flask 世界的冰山一角。接下来,你可以继续探索:
* 数据库集成: 使用 SQLAlchemy 或 Flask-SQLAlchemy 扩展来与数据库(如 SQLite, PostgreSQL, MySQL)交互。
* 蓝图 (Blueprints): 用于大型应用程序的模块化结构。
* 会话 (Sessions): 存储用户特定数据。
* 表单验证: 使用 Flask-WTF 等扩展。
* 用户认证: 实现注册、登录、注销功能。
* RESTful API: 构建 Web 服务。
* 部署: 将你的 Flask 应用部署到生产环境(例如使用 Gunicorn + Nginx)。
Flask 的简洁性意味着你可以根据自己的需求逐步添加功能和扩展。祝你在 Flask 的学习旅程中愉快!