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




My Flask App

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




My Flask App

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"]): 我们修改了路由,使其同时处理 GETPOST 请求。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




My Flask App

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 项目吧!

THE END