Flask - 轻量级 Web 应用框架
Flask 是一个使用 Python 编写的轻量级 Web 应用框架。它被广泛用于快速开发简单且易于扩展的 web 应用。Flask 的设计哲学是“微内核”,意味着它本身只提供核心功能,如请求响应处理和路由,而其他功能则通过扩展来添加。
一、Flask 的主要特性
- 轻量级和简单:Flask 本身非常小巧,易于理解和使用,非常适合快速开发小型应用。
- 灵活:Flask 不强加任何依赖或项目布局。你可以根据自己的需求和喜好来组织你的应用。
- 可扩展:虽然 Flask 核心很小,但有大量的扩展可用于添加功能,如表单验证、用户认证、数据库集成等。
- 基于 WSGI:Flask 基于 WSGI(Web Server Gateway Interface) 标准,意味着它可以与 WSGI 兼容的多种 Web 服务器一起工作。
- 集成 Jinja2 模板引擎:Flask 内置了 Jinja2 模板引擎,使得在 Python 应用中生成 HTML 更为方便。
- 开发服务器和调试器:Flask 自带了一个内置的开发服务器和一个调试器,使得开发过程中的调试和测试更为方便。
二、基本用法
安装 Flask:
pip install Flask
案例1、一个简单的 Flask 应用示例:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(debug=True)
在这个例子中:
- 我们首先导入
Flask
类。 - 实例化一个 Flask 对象。
- 使用
@app.route
装饰器定义路由。当用户访问根 URL/
时,hello_world
函数会被调用。 - 应用运行在开发服务器上,
debug=True
表示开启调试模式。
案例2、运行一个应用并让它在特定的地址和端口上可用,
你需要在调用 app.run()
时指定 host
和 port
参数。例如,如果你想让你的 Flask 应用运行在 192.168.100.200
地址的 6000
端口上,你可以这样设置:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(host='192.168.100.200', port=6000)
在这个例子中:
app.run(host='192.168.100.200', port=6000)
告诉 Flask 应用在 IP 地址192.168.100.200
的6000
端口上监听请求。- 这样设置后,你的应用将可以通过
http://192.168.100.200:6000/
访问。
注意事项
-
网络配置:确保
192.168.100.200
是服务器的 IP 地址,并且服务器的6000
端口没有被其他服务占用。 -
防火墙设置:如果有防火墙,确保
6000
端口是开放的,以便外部请求可以到达 Flask 应用。 -
调试模式:在生产环境中运行 Flask 时,应关闭调试模式。在上面的例子中,你可以去掉
debug=True
或将其设置为False
。 -
生产部署:Flask 自带的服务器主要用于开发和测试。在生产环境中,建议使用更健壮的 WSGI 服务器,如 Gunicorn 或 uWSGI。
-
安全性:如果你的应用是面向公网的,确保考虑安全性,比如使用 HTTPS、安全的编码实践、数据验证等。
案例3、 路由和视图函数
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return "Hello, Flask!"
from flask import Flask
:从flask
模块导入Flask
类。app = Flask(__name__)
:创建一个Flask
应用实例。__name__
是当前模块的名称,Flask 用它来确定程序的根目录,以便稍后能找到相对于程序根目录的资源文件位置。@app.route('/')
:一个装饰器,定义了路由规则。这里'/'
表示应用的根 URL。def home()
:定义一个视图函数,它与上面定义的路由相关联。return "Hello, Flask!"
:这个视图函数返回的字符串将会被显示在客户端(例如浏览器)。
案例4、动态路由
@app.route('/user/<username>')
def show_user_profile(username):
return f"User: {username}"
'user/<username>'
:定义一个动态路由,<username>
是一个变量部分,可以接收来自 URL 的任意文本。def show_user_profile(username):
:定义的视图函数接收username
作为参数。
案例5、请求数据处理
from flask import request
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
return f"Logging in {username} with password {password}"
else:
return "Login Page"
- 从 flask 导入
request
对象,用于访问请求数据。 - 定义一个接受 GET 和 POST 请求的路由。对于 POST 请求,通常用于提交表单数据。
- 如果请求方法是 POST,从表单中提取用户名和密码。
- 返回一个包含用户名和密码的字符串作为响应。
- 如果请求方法不是 POST(比如 GET),返回一个表示登录页面的字符串。
案例6、使用模板
from flask import render_template
@app.route('/hello/<name>')
def hello(name=None):
return render_template('hello.html', name=name)
- 导入
render_template
函数,用于渲染模板。 - 定义一个路由,动态接收 URL 中的
name
参数。 render_template
渲染一个名为hello.html
的模板文件,并传递name
变量。
案例7、重定向和错误处理
from flask import redirect, url_for, abort
@app.route('/redirect')
def go_home():
return redirect(url_for('home'))
@app.errorhandler(404)
def page_not_found(error):
return "This page does not exist", 404
- 导入
redirect
和url_for
函数用于重定向,abort
用于错误处理。 - 定义一个路由,当访问这个路由时,使用
redirect
函数重定向到home
视图函数对应的 URL。 - 使用
errorhandler
装饰器来自定义错误处理。这里定义了一个自定义的 404 错误处理视图。
案例8、使用静态文件
HTML 示例(不是 Python 代码):
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
- 在 HTML 模板中,使用
url_for
函数生成静态文件的 URL。这里假设有一个名为style.css
的 CSS 文件在 Flask 应用的static
目录下。
案例9、Flask 扩展
from flask_sqlalchemy import SQLAlchemy
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
- 导入 Flask 的 SQLAlchemy 扩展,用于数据库操作。
- 设置数据库 URI,并初始化
SQLAlchemy
对象。 - 定义一个模型
User
,映射到数据库表。
案例10、Flask Blueprints
from flask import Blueprint
mod = Blueprint('auth', __name__, url_prefix='/auth')
@mod.route('/login')
def login():
return "Login Page"
- 导入
Blueprint
类,用于创建蓝图。 - 创建一个名为
auth
的 Blueprint 对象,所有路由都将以/auth
作为前缀。 - 为蓝图定义路由。这里的路由是
/auth/login
。
三、部署
虽然 Flask 自带的服务器方便开发测试,但不建议在生产环境中使用。在生产环境中,应该将 Flask 应用部署在一个更加健壮的 Web 服务器上,如 Gunicorn 或 uWSGI。
Flask 扩展
Flask 社区提供了大量扩展来增加额外的功能,如:
- Flask-SQLAlchemy:用于数据库集成。
- Flask-WTF:用于表单处理和验证。
- Flask-Login:用于处理用户认证。
Flask 的简洁和灵活性使其成为 Python Web 开发的流行选择,特别是对于小型项目或作为微服务架构中的一个组成部分。