1. Flask 简介
Flask 是一个轻量级的 Python Web 应用框架,被称为"微框架"(micro-framework)。它基于 Werkzeug WSGI 工具包和 Jinja2 模板引擎,提供了 Web 开发所需的核心功能,同时保持了高度的灵活性和扩展性。
1.1 Flask 的特点
1.2 安装 Flask
pip install flask
2. Flask 基础
2.1 第一个 Flask 应用
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run(debug=True)
2.2 路由系统
2.2.1 基本路由
@app.route('/user')
def user_page():
return 'User Page'
2.2.2 动态路由
@app.route('/user/')
def show_user_profile(username):
return f'User {username}'
@app.route('/post/')
def show_post(post_id):
return f'Post {post_id}'
2.2.3 HTTP 方法
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
return 'Processing login...'
return 'Please login'
3. 模板引擎(Jinja2)
3.1 基本用法
from flask import render_template
@app.route('/hello/')
def hello(name):
return render_template('hello.html', name=name)
模板文件
hello.html
:
html>
<html>
<head>
<title>Hello Pagetitle>
head>
<body>
<h1>Hello {{ name }}!h1>
body>
html>
3.2 模板语法
3.2.1 变量
{{ variable }}
3.2.2 控制结构
{% if user %}
Hello, {{ user }}!
{% else %}
Hello, Stranger!
{% endif %}
{% for item in items %}
<li>{{ item }}li>
{% endfor %}
4. 表单处理
4.1 基本表单
from flask import request
@app.route('/submit', methods=['GET', 'POST'])
def submit():
if request.method == 'POST':
username = request.form['username']
password = request.form['password']
return f'Received: {username}'
return '''
'''
4.2 Flask-WTF 表单
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired
class LoginForm(FlaskForm):
username = StringField('Username', validators=[DataRequired()])
password = PasswordField('Password', validators=[DataRequired()])
submit = SubmitField('Login')
5. 数据库集成
5.1 Flask-SQLAlchemy
from flask_sqlalchemy import SQLAlchemy
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.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)
6. 用户认证
6.1 Flask-Login
from flask_login import LoginManager, UserMixin, login_user, login_required
login_manager = LoginManager()
login_manager.init_app(app)
class User(UserMixin, db.Model):
# 用户模型定义
pass
@login_manager.user_loader
def load_user(user_id):
return User.query.get(int(user_id))
@app.route('/protected')
@login_required
def protected():
return 'Protected area'
7. RESTful API 开发
7.1 基本 REST API
@app.route('/api/users', methods=['GET'])
def get_users():
users = User.query.all()
return jsonify([{'id': user.id, 'username': user.username} for user in users])
@app.route('/api/users/', methods=['GET'])
def get_user(user_id):
user = User.query.get_or_404(user_id)
return jsonify({'id': user.id, 'username': user.username})
7.2 Flask-RESTful
from flask_restful import Resource, Api
api = Api(app)
class UserResource(Resource):
def get(self, user_id):
user = User.query.get_or_404(user_id)
return {'id': user.id, 'username': user.username}
api.add_resource(UserResource, '/api/users/')
8. 项目结构
推荐的项目结构:
myproject/
├── app/
│ ├── __init__.py
│ ├── models.py
│ ├── routes.py
│ └── templates/
├── config.py
├── requirements.txt
└── run.py
9. 部署
9.1 生产环境配置
# config.py
class ProductionConfig:
DEBUG = False
SQLALCHEMY_DATABASE_URI = 'postgresql://user:password@localhost/dbname'
SECRET_KEY = 'your-secret-key'
9.2 使用 Gunicorn 部署
pip install gunicorn
gunicorn -w 4 -b 127.0.0.1:8000 run:app
10. 最佳实践