PythonFlask实战:开发Web应用教程
Python Flask 实战:开发 Web 应用教程
Flask 是一个轻量级的 Web 框架,使用 Python 编写。它被称为“微框架”,因为它使用简单的核心,用扩展增加其他功能。Flask 没有默认使用的数据库、窗体验证工具。然而,Flask 保留了扩增的弹性,可以用 Flask 扩展加入这些功能:ORM、窗体验证工具、文件上传、各种开放式身份验证技术。
本教程将引导你使用 Flask 开发一个简单的 Web 应用。我们将从安装 Flask 开始,然后创建一个基本的“Hello, World!”应用。接下来,我们将学习如何使用模板、处理表单数据、使用数据库以及处理静态文件。最后,我们将学习如何部署 Flask 应用。
1. 安装 Flask
首先,我们需要安装 Flask。推荐使用虚拟环境来管理项目依赖,这样可以避免不同项目之间的包版本冲突。
创建虚拟环境 (可选但强烈推荐):
```bash
使用 Python 3 内置的 venv 模块
python3 -m venv .venv
或者使用 virtualenv (需要先安装:pip install virtualenv)
virtualenv .venv
```
激活虚拟环境:
- Linux/macOS:
bash
source .venv/bin/activate
- Windows:
bash
.venv\Scripts\activate
安装 Flask:
在虚拟环境激活的情况下,使用 pip
安装 Flask:
bash
pip install Flask
安装完成后,你可以通过以下命令验证 Flask 是否安装成功:
bash
python -c "import flask; print(flask.__version__)"
如果输出了 Flask 的版本号,则说明安装成功。
2. 创建一个基本的“Hello, World!”应用
现在我们已经安装了 Flask,让我们创建一个最简单的 Flask 应用。
创建一个名为 app.py
的文件,并在其中输入以下代码:
```python
from flask import Flask
app = Flask(name)
@app.route("/")
def hello_world():
return "
Hello, World!
"
if name == "main":
app.run(debug=True)
```
这段代码做了以下几件事情:
from flask import Flask
: 导入Flask
类。app = Flask(__name__)
: 创建一个Flask
应用实例。__name__
变量是一个特殊的 Python 变量,表示当前模块的名称。Flask 使用这个变量来确定应用的根路径,以便能够找到模板和静态文件等资源。@app.route("/")
: 这是一个装饰器,它告诉 Flask 哪个 URL 应该触发我们的函数。在这个例子中,/
表示根 URL。def hello_world():
: 这是视图函数,当用户访问根 URL 时,它会被调用。它返回一个简单的 HTML 字符串 "Hello, World!"。if __name__ == "__main__":
: 这段代码确保只有当脚本直接运行时,服务器才会运行。如果我们从另一个脚本导入这个脚本,服务器将不会运行。app.run(debug=True)
: 这行代码启动了开发服务器。debug=True
启用调试模式,当代码更改时,服务器会自动重新加载,并提供更详细的错误信息。
运行应用:
在终端中,导航到 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
* Debugger is active!
* Debugger PIN: xxx-xxx-xxx
现在,在你的浏览器中访问 http://127.0.0.1:5000
,你将看到 "Hello, World!"。
3. 使用模板
在实际应用中,我们通常不会直接在 Python 代码中编写 HTML。相反,我们会使用模板。模板引擎允许我们分离应用的逻辑和表现层。
Flask 使用 Jinja2 作为其模板引擎。
创建模板:
在你的项目目录下创建一个名为 templates
的文件夹。在 templates
文件夹中,创建一个名为 index.html
的文件,并输入以下内容:
```html
Hello, {{ name }}!
```
在这个模板中,{{ name }}
是一个占位符,它将被我们传递给模板的数据所替换。
修改 app.py
:
修改 app.py
文件,使用 render_template
函数渲染模板:
```python
from flask import Flask, render_template
app = Flask(name)
@app.route("/")
def index():
return render_template("index.html", name="World")
if name == "main":
app.run(debug=True)
```
在这个修改后的代码中:
from flask import render_template
: 我们导入了render_template
函数。def index():
: 我们将视图函数重命名为index
。return render_template("index.html", name="World")
: 我们使用render_template
函数渲染index.html
模板,并将一个名为name
的变量传递给模板,其值为 "World"。
现在,重新启动应用并刷新浏览器。你将看到 "Hello, World!",其中 "World" 是通过模板变量传递的。
4. 处理表单数据
Web 应用通常需要处理用户提交的表单数据。让我们创建一个简单的表单,并学习如何使用 Flask 处理表单数据。
创建表单:
修改 templates/index.html
文件,添加一个表单:
```html
Hello, {{ name }}!
```
这个表单使用 POST
方法提交数据。它包含一个文本输入框和一个提交按钮。
处理表单数据:
修改 app.py
文件,添加一个处理表单数据的路由:
```python
from flask import Flask, render_template, request
app = Flask(name)
@app.route("/", methods=["GET", "POST"])
def index():
if request.method == "POST":
name = request.form["name"]
return render_template("index.html", name=name)
else:
return render_template("index.html", name="World")
if name == "main":
app.run(debug=True)
```
在这个修改后的代码中:
from flask import request
: 我们导入了request
对象,它包含了客户端发送的 HTTP 请求的数据。@app.route("/", methods=["GET", "POST"])
: 我们修改了路由,使其同时处理GET
和POST
请求。GET
请求用于初始页面加载,POST
请求用于表单提交。if request.method == "POST":
: 我们检查请求方法是否为POST
。如果是,则说明用户提交了表单。name = request.form["name"]
: 我们从request.form
字典中获取名为name
的表单字段的值。return render_template("index.html", name=name)
: 我们将用户输入的名字传递给模板。else:
: 如果请求方法不是POST
,则说明是GET
请求,我们渲染初始页面。
现在,重新启动应用并刷新浏览器。在表单中输入你的名字并提交。你将看到 "Hello, [你的名字]!"。
5. 使用数据库 (SQLite)
大多数 Web 应用都需要使用数据库来存储数据。在这个例子中,我们将使用 SQLite,一个轻量级的、基于文件的数据库。
安装 SQLite:
大多数操作系统都预装了 SQLite。如果没有,你可以从 SQLite 官网下载并安装。
添加数据库交互:
修改 app.py
文件,添加数据库交互的代码:
```python
import sqlite3
from flask import Flask, render_template, request, g
app = Flask(name)
DATABASE = 'database.db'
def get_db():
db = getattr(g, '_database', None)
if db is None:
db = g._database = sqlite3.connect(DATABASE)
return db
@app.teardown_appcontext
def close_connection(exception):
db = getattr(g, '_database', None)
if db is not None:
db.close()
def init_db():
with app.app_context():
db = get_db()
with app.open_resource('schema.sql', mode='r') as f:
db.cursor().executescript(f.read())
db.commit()
@app.route("/", methods=["GET", "POST"])
def index():
db = get_db()
if request.method == "POST":
name = request.form["name"]
db.execute("INSERT INTO users (name) VALUES (?)", [name])
db.commit()
cur = db.execute("SELECT name FROM users ORDER BY id DESC LIMIT 1")
name = cur.fetchone()[0]
return render_template("index.html", name=name)
else:
cur = db.execute("SELECT name FROM users ORDER BY id DESC")
names = [row[0] for row in cur.fetchall()]
return render_template("index.html", name="World", names=names)
if name == "main":
init_db() # 初始化数据库
app.run(debug=True)
```
创建 schema.sql
:
在项目目录下创建名为 schema.sql
的文件, 用于创建数据库表结构,内容如下:
sql
DROP TABLE IF EXISTS users;
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL
);
在这个修改后的代码中:
DATABASE = 'database.db'
: 定义了数据库文件的名称。get_db()
: 这个函数获取一个数据库连接。如果当前应用上下文中没有数据库连接,它会创建一个新的连接并将其存储在应用上下文中。close_connection()
: 这个函数在应用上下文结束时关闭数据库连接。init_db()
: 这个函数初始化数据库。它会执行schema.sql
文件中的 SQL 语句来创建数据库表。@app.route("/", methods=["GET", "POST"])
:- 在
POST
请求中,我们将用户输入的名字插入到users
表中,并查询最后插入的数据并显示 - 在
GET
请求中,我们从users
表中查询所有的名字,并将它们传递给模板。
- 在
if __name__ == "__main__":
中调用了init_db()
函数
修改 index.html
:
修改 templates/index.html
,循环显示所有用户的名字:
```html
Hello, {{ name }}!
Users:
-
{% for name in names %}
- {{ name }}
{% endfor %}
```
现在,重新启动应用。每次提交表单,都会将新的名字添加到数据库中,并在页面上显示所有用户的名字。
6. 处理静态文件
Web 应用通常需要提供静态文件,例如 CSS、JavaScript 和图片。
创建静态文件夹:
在你的项目目录下创建一个名为 static
的文件夹。
创建 CSS 文件:
在 static
文件夹中,创建一个名为 style.css
的文件,并输入以下内容:
```css
body {
font-family: sans-serif;
background-color: #f0f0f0;
}
h1 {
color: blue;
}
```
在模板中链接 CSS 文件:
修改 templates/index.html
,在 <head>
标签中添加以下代码来链接 CSS 文件:
html
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
url_for('static', filename='style.css')
会生成一个指向 static/style.css
的 URL。
现在,重新启动应用并刷新浏览器。你将看到页面样式发生了变化。
7. 部署 Flask 应用
当你准备好部署你的 Flask 应用时,你需要使用一个 WSGI 服务器,例如 Gunicorn 或 uWSGI。
安装 Gunicorn:
bash
pip install gunicorn
使用 Gunicorn 运行应用:
bash
gunicorn app:app
这个命令将使用 Gunicorn 启动你的 Flask 应用。app:app
表示 app.py
文件中的 app
变量。
生产环境部署建议
- 使用反向代理服务器 (如 Nginx 或 Apache): 将 Gunicorn 或 uWSGI 放在反向代理服务器后面,可以提高性能和安全性。反向代理服务器可以处理静态文件请求、负载均衡和 SSL 加密等任务。
- 禁用调试模式: 在生产环境中,务必将
app.run(debug=True)
中的debug
设置为False
。 - 使用进程管理器 (如 Supervisor): 进程管理器可以确保你的应用在崩溃后自动重启。
- 日志记录: 配置应用的日志记录,以便跟踪错误和监控应用性能。
总结
本教程介绍了使用 Flask 开发 Web 应用的基础知识。我们学习了如何安装 Flask、创建基本的应用、使用模板、处理表单数据、使用数据库以及处理静态文件。最后,我们还学习了如何使用 Gunicorn 部署 Flask 应用。
这只是 Flask 的入门教程,Flask 还有许多其他强大的功能,例如:
- 蓝图 (Blueprints): 用于构建大型应用,将应用分解成多个模块。
- Flask 扩展: 提供了许多常用的功能,例如数据库集成、用户认证、表单验证等。
- RESTful API 开发: 使用 Flask 可以轻松地开发 RESTful API。
希望本教程能够帮助你入门 Flask 开发。你可以继续学习 Flask 的高级特性,并使用 Flask 构建更复杂的 Web 应用。 记住,实践是最好的学习方法,所以尝试构建你自己的 Flask 项目吧!