Flask 是一个轻量级的 Python Web 框架,它简单易用却功能强大,非常适合快速开发 Web 应用程序。无论你是刚接触 Web 开发的新手,还是经验丰富的开发者,Flask 都能为你提供灵活的开发体验。
在开始之前,确保你已经安装了 Python(建议 3.6+版本)。然后通过 pip 安装 Flask:
pip install flask
建议使用虚拟环境来管理依赖:
python -m venv venv
source venv/bin/activate # Linux/Mac
venv\Scripts\activate # Windows
pip install flask
创建一个名为 app.py
的文件,输入以下代码:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(debug=True)
运行这个应用:
python app.py
访问 http://127.0.0.1:5000/
,你将看到 “Hello, World!” 的欢迎信息。
路由是将 URL 映射到特定函数的方式。Flask 使用 @app.route()
装饰器来定义路由。
@app.route('/about')
def about():
return '关于我们页面'
# 动态路由
@app.route('/user/' )
def show_user(username):
return f'用户: {username}'
# 指定HTTP方法
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return do_login()
else:
return show_login_form()
Flask 使用 Jinja2 模板引擎。创建一个 templates
文件夹,然后在其中创建 HTML 模板。
示例模板 templates/user.html
:
DOCTYPE html>
<html>
<head>
<title>用户页面title>
head>
<body>
<h1>你好, {{ name }}!h1>
body>
html>
在视图函数中使用模板:
from flask import render_template
@app.route('/user/' )
def show_user_profile(username):
return render_template('user.html', name=username)
Flask 可以轻松处理各种 HTTP 请求:
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'用户 {username} 登录成功'
else:
return '''
'''
在项目根目录下创建 static
文件夹,用于存放 CSS、JavaScript 和图片等静态文件。
<link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}">
Flask 的强大之处在于其丰富的扩展生态系统:
安装扩展示例:
pip install flask-sqlalchemy flask-wtf flask-login
下面是一个简单的待办事项应用示例:
/todo-app
/templates
base.html
app.py
app.py
内容:from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///todo.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SECRET_KEY'] = 'your-secret-key'
db = SQLAlchemy(app)
class Todo(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable=False)
complete = db.Column(db.Boolean, default=False)
@app.route('/')
def index():
todo_list = Todo.query.all()
return render_template('base.html', todo_list=todo_list)
@app.route('/add', methods=['POST'])
def add():
title = request.form.get('title')
if title: # 简单的验证
new_todo = Todo(title=title, complete=False)
db.session.add(new_todo)
db.session.commit()
return redirect(url_for('index'))
@app.route('/update/' )
def update(todo_id):
todo = Todo.query.get_or_404(todo_id)
todo.complete = not todo.complete
db.session.commit()
return redirect(url_for('index'))
@app.route('/delete/' )
def delete(todo_id):
todo = Todo.query.get_or_404(todo_id)
db.session.delete(todo)
db.session.commit()
return redirect(url_for('index'))
if __name__ == '__main__':
with app.app_context():
db.create_all()
app.run(debug=True)
templates/base.html
内容:DOCTYPE html>
<html>
<head>
<title>待办事项title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css">
head>
<body>
<div class="container mt-4">
<h1 class="text-center mb-4">待办事项列表h1>
<form method="POST" action="{{ url_for('add') }}" class="mb-4">
<div class="input-group">
<input type="text" name="title" class="form-control" placeholder="添加新任务" required>
<button type="submit" class="btn btn-primary">添加button>
div>
form>
<ul class="list-group">
{% for todo in todo_list %}
<li class="list-group-item d-flex justify-content-between align-items-center">
<span {% if todo.complete %}style="text-decoration: line-through"{% endif %}>
{{ todo.title }}
span>
<div>
<a href="{{ url_for('update', todo_id=todo.id) }}" class="btn btn-sm {% if todo.complete %}btn-warning{% else %}btn-success{% endif %} me-2">
{% if todo.complete %}未完成{% else %}完成{% endif %}
a>
<a href="{{ url_for('delete', todo_id=todo.id) }}" class="btn btn-sm btn-danger">删除a>
div>
li>
{% endfor %}
ul>
div>
body>
html>
开发完成后,你可以选择多种方式部署 Flask 应用:
使用内置服务器(仅适合开发)
python app.py
使用 Gunicorn + Nginx(生产环境推荐)
pip install gunicorn
gunicorn -w 4 -b 0.0.0.0:8000 app:app
然后配置 Nginx 作为反向代理
使用 Waitress(Windows 环境推荐)
pip install waitress
waitress-serve --port=8000 app:app
部署到云平台:
项目结构:
/project
/app
/templates
/static
/models
/routes
__init__.py
config.py
requirements.txt
run.py
配置管理:
class Config:
SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard-to-guess-string'
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
'sqlite:///' + os.path.join(basedir, 'app.db')
SQLALCHEMY_TRACK_MODIFICATIONS = False
错误处理:
@app.errorhandler(404)
def not_found_error(error):
return render_template('404.html'), 404
@app.errorhandler(500)
def internal_error(error):
db.session.rollback()
return render_template('500.html'), 500
Flask 以其简洁和灵活的特性,成为 Python Web 开发的热门选择。通过本文的介绍,你应该已经掌握了 Flask 的基本使用方法。接下来,你可以尝试开发自己的项目,或者深入学习 Flask 的高级特性和扩展。
记住,最好的学习方式是实践。从简单的博客系统、REST API 开始,逐步挑战更复杂的项目。Flask 社区有丰富的资源和扩展,遇到问题时不要犹豫寻求帮助。
祝你 Flask 开发愉快!
. - . .