Flask
是一个使用 Python 编写的轻量级 Web 应用框架。它简单易学,同时具有高度的灵活性和可扩展性。
Flask
适用于构建从小型应用到复杂的 Web 应用的各种项目。
首先,你需要安装 Flask
包。可以通过 pip 来安装:
bashpip install Flask
static
目录中。以下是一些具体的示例,展示了如何使用 Flask
构建基本的 Web 应用程序。
pythonfrom flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(debug=True)
运行这个脚本后,打开浏览器并访问 http://127.0.0.1:5000/
,你将看到 "Hello, World!"。
你可以通过定义多个路由来处理不同的 URL 请求。
python@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}'
你可以指定视图函数处理特定的 HTTP 方法(如 GET、POST 等)。
pythonfrom flask import request
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return 'Processing Login'
else:
return 'Login Form'
Flask
提供了方便的方法来处理表单数据。
pythonfrom flask import request
@app.route('/submit', methods=['POST'])
def submit():
name = request.form['name']
email = request.form['email']
return f'Name: {name}, Email: {email}'
对应的 HTML 表单如下:
html<form action="/submit" method="post">
<label for="name">Name:</label>
<input type="text" id="name" name="name">
<label for="email">Email:</label>
<input type="email" id="email" name="email">
<button type="submit">Submit</button>
</form>
Flask
使用 Jinja2 作为模板引擎,可以方便地生成动态 HTML 页面。
在项目目录下创建一个名为 templates
的文件夹,并在其中创建一个名为 hello.html
的文件:
html<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello Page</title>
</head>
<body>
<h1>Hello, {{ name }}!</h1>
</body>
</html>
然后在你的 Flask 应用中渲染该模板:
pythonfrom flask import render_template
@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
return render_template('hello.html', name=name)
静态文件(如 CSS、JavaScript 文件)通常放在 static
目录中。你可以通过 /static/
路径访问这些文件。
例如,在 static/css/style.css
中定义样式:
cssbody {
background-color: lightblue;
}
在模板中引用该样式文件:
html<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
蓝图允许你组织大型应用,将不同的功能模块化。
在项目目录下创建一个名为 admin
的文件夹,并在其中创建一个名为 __init__.py
的文件:
pythonfrom flask import Blueprint
admin_bp = Blueprint('admin', __name__)
@admin_bp.route('/')
def admin_index():
return 'Admin Index'
# 导入蓝图
def init_app(app):
app.register_blueprint(admin_bp, url_prefix='/admin')
在主应用中注册蓝图:
pythonfrom admin import init_app
app = Flask(__name__)
init_app(app)
if __name__ == '__main__':
app.run(debug=True)
现在,你可以通过访问 http://127.0.0.1:5000/admin/
来查看 Admin Index
页面。
你可以为特定的 HTTP 错误码定义自定义错误页面。
python@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404
创建一个名为 404.html
的模板:
html<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Page Not Found</title>
</head>
<body>
<h1>Oops! Page Not Found.</h1>
</body>
</html>
Flask
提供了内置的支持来管理用户会话。
pythonfrom flask import session, redirect, url_for
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
session['username'] = request.form['username']
return redirect(url_for('index'))
return '''
<form method="post">
<p><input type=text name=username>
<p><input type=submit value=Login>
</form>
'''
@app.route('/logout')
def logout():
session.pop('username', None)
return redirect(url_for('index'))
@app.route('/')
def index():
if 'username' in session:
return f'Logged in as {session["username"]}'
return 'You are not logged in'
Flask
可以轻松集成多种数据库,如 SQLite、MySQL、PostgreSQL 等。常用的库是 SQLAlchemy
。
bashpip install flask-sqlalchemy
pythonfrom flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///site.db'
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
def __repr__(self):
return f"User('{self.username}', '{self.email}')"
if __name__ == '__main__':
with app.app_context():
db.create_all()
app.run(debug=True)
Flask-WTF
是一个方便的库,用于处理表单验证。
bashpip install flask-wtf
pythonfrom flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
class RegistrationForm(FlaskForm):
username = StringField('Username', validators=[DataRequired()])
email = StringField('Email', validators=[DataRequired()])
submit = SubmitField('Sign Up')
@app.route('/register', methods=['GET', 'POST'])
def register():
form = RegistrationForm()
if form.validate_on_submit():
user = User(username=form.username.data, email=form.email.data)
db.session.add(user)
db.session.commit()
return redirect(url_for('index'))
return render_template('register.html', form=form)
对应的 HTML 表单如下:
html<form method="POST">
{{ form.hidden_tag() }}
<div>
{{ form.username.label }}<br>
{{ form.username(size=32) }}<br>
{% for error in form.username.errors %}
<span style="color: red;">[{{ error }}]</span><br>
{% endfor %}
</div>
<div>
{{ form.email.label }}<br>
{{ form.email(size=64) }}<br>
{% for error in form.email.errors %}
<span style="color: red;">[{{ error }}]</span><br>
{% endfor %}
</div>
<div>{{ form.submit() }}</div>
</form>