7 Flask 基本概念

7 Flask 基本概念

Flask 是一个用 Python 编写的轻量级 web 应用框架,它采用 Werkzeug 作为底层库,并使用 Jinja2 作为模板引擎。接下来,我们将探讨一些 Flask 的基本概念,并通过实际案例来加深理解。

创建第一个 Flask 应用

Flask 应用的创建非常简单。你只需要安装 Flask 并编写几行代码。

安装 Flask

1
pip install Flask

创建基本应用

首先,创建名为 app.py 的文件,内容如下:

1
2
3
4
5
6
7
8
9
10
from flask import Flask

app = Flask(__name__)

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

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

解释代码

  1. from flask import Flask:导入 Flask 类。
  2. app = Flask(__name__):创建一个 Flask 应用实例,__name__ 用于确定资源的根路径。
  3. @app.route('/'):使用装饰器定义 URL 路径,这里表示根路径 /
  4. def hello()::定义处理该路径请求的函数。
  5. app.run(debug=True):启动 Flask 开发服务器,开启调试模式。

运行应用

在终端中,进入包含 app.py 的目录,然后运行以下命令:

1
python app.py

在浏览器中访问 http://127.0.0.1:5000/,你将看到 Hello, Flask!

路由和视图

Flask 通过路由来将 URL 映射到 Python 函数(视图)。简而言之,路由就是告诉 Flask 如何响应特定的 URL。

定义多个路由

你可以定义多个路由,每个路由对应一个视图函数。例如:

1
2
3
@app.route('/about')
def about():
return 'This is the About page.'

当用户访问 http://127.0.0.1:5000/about 时,将显示 This is the About page.

模板渲染

Flask 使用 Jinja2 模板引擎来渲染HTML页面。这使得在网页中嵌入 Python 代码变得简单而高效。

使用模板

首先,创建一个名为 templates 的文件夹,在其中创建一个 index.html 文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ title }}</title>
</head>
<body>
<h1>{{ heading }}</h1>
<p>{{ message }}</p>
</body>
</html>

接下来,在 app.py 中修改视图函数以渲染模板:

1
2
3
4
5
from flask import render_template

@app.route('/')
def home():
return render_template('index.html', title='Home', heading='Welcome to Flask', message='This is a simple Flask application.')

结果

访问 http://127.0.0.1:5000/,你将看到渲染后的 HTML 页面,其中的内容由视图函数传递进来。

处理表单

Flask 允许轻松处理表单数据。你可以使用 Flask 的请求对象 request 来访问提交的数据。

创建表单

修改 index.html 添加一个表单:

1
2
3
4
<form action="/submit" method="post">
<input type="text" name="username" placeholder="Enter your username">
<input type="submit" value="Submit">
</form>

处理表单提交

app.py 中添加下面的代码来处理表单提交:

1
2
3
4
5
6
from flask import request

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

结果

当你在表单中输入用户名并提交时,访问 http://127.0.0.1:5000/submit,你将看到 Hello, [username]!

小结

Flask 是一个强大而灵活的框架,可以轻松构建 web 应用。通过掌握基本概念如路由、视图、模板渲染和表单处理,你可以快速入门并构建你自己的 Flask 应用。随着你对 Flask 的深入了解,可以探索更多的高级功能,如数据库集成、会话管理和 RESTful API 构建等。

8 Flask 请求与响应实战

8 Flask 请求与响应实战

Flask 是一个轻量级的 Python web 框架,处理 HTTP 请求和响应是其核心功能之一。本节将通过实例帮助你理解如何在 Flask 中处理请求和发送响应。

请求 (Request)

在 Flask 中,request 对象用于获取客户端发送的请求信息,如 URL、表单数据和请求头等。

获取请求数据

Flask 提供了多种方法来获取请求中的数据。

获取查询参数

查询参数通常包含在 URL 中,例如 /search?q=flask

1
2
3
4
5
6
7
8
9
10
11
from flask import Flask, request

app = Flask(__name__)

@app.route('/search')
def search():
query = request.args.get('q') # 获取查询参数 'q'
return f'You searched for: {query}'

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

在这个例子中,当访问 /search?q=flask 时,Flask 会返回 You searched for: flask

获取表单数据

使用 POST 方法提交的表单数据可以通过 request.form 访问。

1
2
3
4
5
6
7
8
9
10
11
from flask import Flask, request

app = Flask(__name__)

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

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

在 HTML 表单提交时,Flask 会提取 username 字段的值。

获取请求头

请求头包含有关请求的元数据,如用户代理、内容类型等。

1
2
3
4
@app.route('/headers')
def headers():
user_agent = request.headers.get('User-Agent')
return f'Your User-Agent is: {user_agent}'

使用浏览器访问 /headers 可以查看你当前的用户代理。

响应 (Response)

Flask 的 response 对象用于构建服务器端响应。

基本响应

最简单的响应是直接返回一个字符串。

1
2
3
@app.route('/hello')
def hello():
return 'Hello, World!'

使用 Response 对象

你可以创建一个更复杂的响应对象,通过 Flask 的 Response 类。

1
2
3
4
5
6
from flask import Response

@app.route('/json')
def json_response():
data = {'message': 'Hello, JSON!'}
return Response(response=json.dumps(data), status=200, mimetype='application/json')

这里我们返回的是 JSON 格式的数据,并指定了 mimetype

设置响应头

你可以通过 response.headers 设置自定义的响应头。

1
2
3
4
5
@app.route('/custom-header')
def custom_header():
response = Response('Check your headers!')
response.headers['X-Custom-Header'] = 'This is a custom header'
return response

状态码

你可以通过返回一个元组来指定状态码和响应内容。

1
2
3
@app.route('/status')
def status():
return 'Resource created', 201 # 201 Created 状态码

处理错误响应

你可以使用 abort 函数来返回错误代码。

1
2
3
4
5
from flask import abort

@app.route('/error')
def error():
abort(404) # 返回404 Not Found错误

通过这些基本的请求和响应操作,你可以开始处理客户端的请求并返回定制的响应。在后续的学习中,可以结合更复杂的路由和数据处理,进一步提升你对 Flask 的掌握。

9 Flask配置入门

9 Flask配置入门

在Flask项目中,合理的配置是构建应用程序的基础。配置管理可以通过设置不同的配置对象、使用环境变量以及应用自定义配置类来实现。以下是一些重要的配置内容和实例。

1. 基本配置

Flask应用的基本配置可以通过app.config字典来设置。一般来说,我们会在应用的开始阶段进行配置。

1
2
3
4
5
6
7
8
9
10
from flask import Flask

app = Flask(__name__)

# 基本配置
app.config['DEBUG'] = True # 开启调试模式
app.config['SECRET_KEY'] = 'your_secret_key' # 设置密钥

# 访问配置
print(app.config['SECRET_KEY'])

2. 配置文件

为了方便管理和修改配置,通常会将配置放在一个单独的文件中。可以通过from_pyfile方法加载配置。

config.py

1
2
3
4
5
6
7
8
9
10
11
import os

class Config:
DEBUG = False
SECRET_KEY = os.environ.get('SECRET_KEY') or 'default_secret_key'

class DevelopmentConfig(Config):
DEBUG = True

class ProductionConfig(Config):
DEBUG = False

app.py

1
2
3
4
5
from flask import Flask
from config import DevelopmentConfig

app = Flask(__name__)
app.config.from_object(DevelopmentConfig)

3. 环境变量配置

将敏感信息和配置放入环境变量是一个好的实践。使用os.environ.get来读取环境变量值。

1
2
3
4
5
6
7
8
9
import os
from flask import Flask

app = Flask(__name__)

# 从环境变量中获取配置
app.config['DATABASE_URI'] = os.environ.get('DATABASE_URI', 'sqlite:///default.db')

print(app.config['DATABASE_URI'])

4. 自定义配置参数

如果需要添加自定义的配置参数,可以直接在app.config中设置。例如,添加邮件相关的配置。

1
2
3
4
5
6
7
8
9
10
app.config['MAIL_SERVER'] = 'smtp.example.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME')
app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD')

# 使用配置发送邮件
def send_email(to, subject, template):
# 实现邮件发送逻辑
pass

5. 读取配置

在Flask应用的任何地方,你都可以用app.config读取配置参数。下面是一个获取配置并使用的示例。

1
2
3
4
@app.route('/')
def index():
secret_key = app.config['SECRET_KEY']
return f'Secret key is: {secret_key}'

6. 多环境配置

在实际开发中,我们通常有多种环境(开发、测试、生产)。可以根据环境设置不同的配置。

1
2
3
4
5
6
7
8
9
10
import os
from flask import Flask

app = Flask(__name__)

config_type = os.environ.get('FLASK_ENV', 'development')
if config_type == 'development':
app.config.from_object('config.DevelopmentConfig')
elif config_type == 'production':
app.config.from_object('config.ProductionConfig')

通过上述示例,您可以轻松配置和管理Flask应用程序的不同环境与参数。确保在每个项目中根据需求设置合适的配置,提升应用的安全性和灵活性。