Python Flask 框架学习笔记
Python Flask 框架学习笔记
一、Flask 框架简介
Flask 是一个使用 Python 编写的轻量级 Web 应用框架,它被称为 “微框架”,因为它不强制使用特定的数据库、模板引擎或其他工具,开发者可以根据项目需求自由选择和集成外部库。Flask 框架基于 Werkzeug(WSGI 工具集)和 Jinja2(模板引擎),具有简洁灵活、易于扩展、上手快等特点,非常适合快速开发小型 Web 应用和 API,也常用于构建大型项目的原型。
二、安装 Flask
在使用 Flask 之前,需要先安装它。可以通过 Python 的包管理工具pip进行安装,在命令行中执行以下命令:
pip install flask
三、Flask 基础应用实例
创建一个最简单的 Flask 应用,在 Python 文件中输入以下代码:
from flask import Flask# 创建Flask应用实例
app = Flask(__name__)# 定义路由和视图函数
@app.route('/')
def hello_world():return 'Hello, World!'if __name__ == '__main__':# 运行应用,默认在本地5000端口app.run()
在上述代码中:
-
首先从flask模块导入Flask类,用于创建应用实例。
-
使用Flask(name)创建应用对象,__name__是 Python 的内置变量,它的值取决于模块的导入方式,这样 Flask 就能知道在哪里寻找模板、静态文件等。
-
使用@app.route(‘/’)装饰器定义路由,当用户访问网站根路径/时,就会执行hello_world函数,该函数返回的字符串会作为响应内容发送给客户端。
-
if name == ‘main’:确保只有在直接运行该脚本时才启动 Flask 应用,在生产环境中,通常会使用更专业的 Web 服务器来运行应用。
运行该 Python 脚本后,在浏览器中访问http://127.0.0.1:5000/,就能看到Hello, World!的页面。
四、路由与 URL 变量
1. 基本路由
除了根路径路由,还可以定义其他路径的路由,示例如下:
from flask import Flaskapp = Flask(__name__)@app.route('/about')
def about_page():return 'This is the about page.'@app.route('/contact')
def contact_page():return 'This is the contact page.'if __name__ == '__main__':app.run()
此时访问http://127.0.0.1:5000/about会显示This is the about page.,访问http://127.0.0.1:5000/contact会显示This is the contact page.。
2. URL 变量
有时候需要在 URL 中传递参数,Flask 可以通过<变量名>的形式定义 URL 变量,示例如下:
from flask import Flaskapp = Flask(__name__)@app.route('/user/<username>')
def show_user_profile(username):return f'User {username}'@app.route('/post/<int:post_id>')
def show_post(post_id):return f'Post {post_id}'if __name__ == '__main__':app.run()
在上述代码中:
-
@app.route(‘/user/’)定义了一个接受字符串类型变量username的路由,访问http://127.0.0.1:5000/user/john,会显示User john。
-
@app.route(‘/post/int:post_id’)定义了一个接受整数类型变量post_id的路由,访问http://127.0.0.1:5000/post/123,会显示Post 123。
五、请求处理
Flask 可以处理不同类型的 HTTP 请求,如GET、POST等。下面是一个处理表单提交(POST请求)的实例:
from flask import Flask, requestapp = Flask(__name__)@app.route('/', methods=['GET', 'POST'])
def index():if request.method == 'POST':username = request.form.get('username')password = request.form.get('password')return f'You submitted username: {username} and password: {password}'return '''<form method="post"><input type="text" name="username" placeholder="Username"><input type="password" name="password" placeholder="Password"><input type="submit" value="Submit"></form>'''if __name__ == '__main__':app.run()
在这个例子中:
-
@app.route(‘/’, methods=[‘GET’, ‘POST’])指定该路由可以处理GET和POST请求。
-
当接收到GET请求时,返回一个包含表单的 HTML 字符串。
-
当接收到POST请求时,通过request.form.get(‘username’)和request.form.get(‘password’)获取表单中提交的数据,并返回相应的信息。
六、模板引擎(Jinja2)
Flask 默认使用 Jinja2 作为模板引擎,它可以将 Python 数据动态地渲染到 HTML 页面中。下面是一个简单的模板使用示例:
-
在项目根目录下创建一个名为templates的文件夹(Flask 会默认在这个文件夹中寻找模板文件)。
-
在templates文件夹中创建一个index.html文件,内容如下:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>Flask Template Example</title>
</head><body><h1>Hello, {{ name }}!</h1><ul>{% for item in items %}<li>{{ item }}</li>{% endfor %}</ul>
</body></html>
- 修改 Python 代码:
from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')
def index():name = 'Flask User'items = ['Apple', 'Banana', 'Cherry']return render_template('index.html', name=name, items=items)if __name__ == '__main__':app.run()
在上述代码中:
-
render_template函数用于渲染模板文件,它会自动在templates文件夹中寻找指定的模板文件。
-
可以将 Python 变量传递给模板,在模板中使用{{ 变量名 }}来显示变量的值,使用{% %}来编写控制语句,如for循环。
七、静态文件处理
在 Web 应用中,通常需要处理 CSS、JavaScript、图片等静态文件。Flask 默认会在项目根目录下的static文件夹中寻找静态文件。
-
在项目根目录下创建static文件夹。
-
在static文件夹中放入静态文件,例如styles.css。
-
修改模板文件(如templates/index.html)来引用静态文件:
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>Flask Static Example</title><link rel="stylesheet" href="{{ url_for('static', filename='styles.css') }}">
</head><body><h1>Static File Example</h1>
</body></html>
在上述模板中,url_for(‘static’, filename=‘styles.css’)用于生成静态文件的 URL,static是 Flask 中静态文件的端点名称,filename指定具体的文件名。
八、Flask 扩展
Flask 有丰富的扩展,可以方便地集成各种功能,如数据库操作、用户认证、邮件发送等。例如,使用Flask-SQLAlchemy扩展进行数据库操作,使用Flask-Login进行用户认证等。安装和使用扩展的方式通常如下:
- 使用pip安装扩展,例如安装Flask-SQLAlchemy:
pip install flask-sqlalchemy
- 在 Flask 应用中初始化扩展,示例代码如下:
from flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
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)email = db.Column(db.String(120), unique=True, nullable=False)def __repr__(self):return f'<User {self.username}>'if __name__ == '__main__':with app.app_context():db.create_all()app.run()
在上述代码中:
-
首先导入Flask和SQLAlchemy类。
-
通过app.config[‘SQLALCHEMY_DATABASE_URI’]配置数据库连接字符串,这里使用 SQLite 数据库。
-
定义User模型类,继承自db.Model,用于表示数据库中的用户表结构。
-
with app.app_context():确保在创建数据库表时,应用上下文处于激活状态。