简单聊聊
Flask 是一个轻量级的 Web 应用框架,以其简单易用而闻名。作为一个灵活的微框架,它允许开发者自由地选择和整合各种第三方库。无论你是 Web 开发的新手,还是有丰富经验的老手,Flask 都能为你提供强大的支持。今天,我们将从 Flask 的基础入门开始,一步步深入探讨它的高级特性,并通过丰富的代码示例来展示如何高效地使用它。
入门:Hello Flask!
在开始我们的 Flask 之旅之前,确保你已经安装了 Flask。你可以通过以下命令安装:
代码语言:javascript复制pip install flask
安装完成后,让我们来写一个最简单的 Flask 应用:
代码语言:javascript复制from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, 简说Python!'
if __name__ == '__main__':
app.run(debug=True)
保存上述代码到一个名为 app.py
的文件中,然后在命令行中运行:
python app.py
打开浏览器,访问 http://127.0.0.1:5000/
,你将看到“Hello, 简说Python!”的字样。这就是你第一个 Flask 应用程序!
路由和视图函数
在 Flask 中,路由用于将 URL 与函数绑定在一起。通过装饰器 @app.route
,你可以定义不同的 URL 路径,并指定相应的处理函数。
动态 URL
有时,我们需要处理动态 URL。例如,处理用户 ID:
代码语言:javascript复制@app.route('/user/<username>')
def show_user_profile(username):
return f'User {username}'
当访问 http://127.0.0.1:5000/user/pythonbrief
时,页面会显示 “User pythonbrief”。
URL 变量类型
你还可以指定 URL 变量的类型,例如整数类型:
代码语言:javascript复制@app.route('/post/<int:post_id>')
def show_post(post_id):
return f'Post {post_id}'
访问 http://127.0.0.1:5000/post/123
,页面会显示 “Post 123”。
模板渲染
对于更复杂的页面,仅返回简单的字符串是不够的。Flask 使用 Jinja2 模板引擎来渲染动态 HTML。
基础模板
首先,创建一个名为 templates
的目录,并在其中创建一个文件 index.html
:
<!doctype html>
<html>
<head>
<title>{{ title }}</title>
</head>
<body>
<h1>{{ heading }}</h1>
<p>{{ content }}</p>
</body>
</html>
然后,在 app.py
中使用 render_template
函数渲染该模板:
from flask import render_template
@app.route('/')
def index():
return render_template('index.html', title='和老表学Python', heading='Python Flask', content='Flask 是一个超级好用的 web 库')
这样,你就可以将动态数据传递给 HTML 模板,实现动态网页的展示,是不是超级简单的。
表单处理
处理表单是 Web 开发的常见任务。Flask 提供了简洁的方式来处理表单数据。
创建表单
在模板文件 form.html
中创建一个简单的表单:
<!doctype html>
<html>
<head>
<title>Form Example</title>
</head>
<body>
<h1>Submit a Form</h1>
<form method="POST">
<label for="name">Name:</label>
<input type="text" name="name" id="name">
<input type="submit" value="Submit">
</form>
</body>
</html>
处理表单数据
在 app.py
中添加处理表单提交的视图函数:
from flask import request
@app.route('/submit', methods=['GET', 'POST'])
def submit():
if request.method == 'POST':
name = request.form['name']
return f'Hello, {name}!'
return render_template('form.html')
访问 http://127.0.0.1:5000/submit
,提交表单后页面会显示输入的名字。
数据库集成
大多数 Web 应用都需要与数据库交互。Flask 支持多种数据库,包括 SQLite、MySQL 和 PostgreSQL。这里我们将介绍如何使用 Flask-SQLAlchemy 集成 SQLite 数据库。
安装 Flask-SQLAlchemy
代码语言:javascript复制pip install flask-sqlalchemy
配置数据库
在 app.py
中配置数据库连接:
from flask_sqlalchemy import SQLAlchemy
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'
db = SQLAlchemy(app)
创建模型
定义一个用户模型:
代码语言:javascript复制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}>'
初始化数据库
在首次运行应用时,创建数据库表:
代码语言:javascript复制with app.app_context():
db.create_all()
数据库操作
添加用户:
代码语言:javascript复制@app.route('/add_user/<username>/<email>')
def add_user(username, email):
user = User(username=username, email=email)
db.session.add(user)
db.session.commit()
return f'Added user {username}'
查询用户:
代码语言:javascript复制@app.route('/get_user/<username>')
def get_user(username):
user = User.query.filter_by(username=username).first()
if user:
return f'User {user.username}, Email {user.email}'
return 'User not found'
用户认证
在现实世界的应用中,用户认证是必不可少的。Flask 提供了 Flask-Login 库来简化用户认证过程。
安装 Flask-Login
代码语言:javascript复制pip install flask-login
配置 Flask-Login
在 app.py
中进行配置:
from flask_login importLoginManager,UserMixin, login_user, login_required, logout_user, current_user
login_manager =LoginManager()
login_manager.init_app(app)
classUser(UserMixin, db.Model):
id= db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
password = db.Column(db.String(120), nullable=False)
@login_manager.user_loader
defload_user(user_id):
returnUser.query.get(int(user_id))
登录视图
代码语言:javascript复制@app.route('/login', methods=['GET', 'POST'])
deflogin():
if request.method =='POST':
username = request.form['username']
password = request.form['password']
user =User.query.filter_by(username=username).first()
if user and user.password == password:
login_user(user)
return'Logged in successfully'
return render_template('login.html')
受保护的视图
代码语言:javascript复制@app.route('/protected')
@login_required
def protected():
return f'Hello, {current_user.username}! This is a protected page.'
登出视图
代码语言:javascript复制@app.route('/logout')
@login_required
def logout():
logout_user()
return 'Logged out successfully'
高级功能
中间件
中间件是在每个请求之前或之后运行的函数。你可以使用中间件来执行日志记录、处理会话等任务。
代码语言:javascript复制@app.before_request
def before_request_func():
print("Before request")
@app.after_request
def after_request_func(response):
print("After request")
return response
蓝图
蓝图允许你将应用程序分割成多个模块,使其更易于管理和维护。
代码语言:javascript复制from flask import Blueprint
bp = Blueprint('main', __name__)
@bp.route('/')
def index():
return 'Hello from the main blueprint!'
app.register_blueprint(bp)
RESTful API
Flask 非常适合构建 RESTful API。使用 Flask-RESTful 库可以简化这一过程。
代码语言:javascript复制pip install flask-restful
创建一个简单的 RESTful API:
代码语言:javascript复制from flask_restful importResource,Api
api =Api(app)
classHelloWorld(Resource):
defget(self):
return{'hello':'world'}
api.add_resource(HelloWorld,'/api')
访问 http://127.0.0.1:5000/api
,你将看到 {"hello": "world"}
。
部署
开发完应用后,部署是最后一步。你可以将 Flask 应用部署到各种平台上,如 Heroku、AWS、GCP 等。
部署到 Heroku
1. 安装 Heroku CLI 并登录:
代码语言:javascript复制heroku login
2. 创建一个 Heroku 应用:
代码语言:javascript复制heroku create
3. 推送代码到 Heroku:
代码语言:javascript复制git push heroku master
4. 访问你的应用:
代码语言:javascript复制heroku open
结论
Flask 是一个强大且灵活的框架,适合从简单到复杂的各种 Web 应用开发。通过本文的介绍,你应该对 Flask 的基础和高级特性有了全面的了解。实践是最好的老师,动手尝试吧!希望你在使用 Flask 的过程中能找到乐趣,并创造出精彩的 Web 应用。
Happy Coding!