Flask是一种用Python编写的轻量级Web框架,就像是一把万能的瑞士军刀。它帮助你快速地创建一个Web应用,不需要你从头开始造轮子。想象一下,你有个工具箱(Flask),里面有各种基本工具(功能),让你可以轻松地搭建一个网站。
就像你在厨房里做一个简单的三明治一样,步骤很简单:
安装Flask:像去超市买面包。
pip install flask
创建一个Python文件:就像拿出一个干净的盘子。
# hello.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run()
运行应用:像是把三明治放进微波炉加热。
python hello.py
打开浏览器访问http://127.0.0.1:5000/
:就像享受你的三明治一样。
就像选择交通工具,Flask像自行车,Django像汽车:
Flask优点:
Flask缺点:
Django优点:
Django缺点:
路由就像是家里的地址牌,告诉别人怎么找到你家的不同房间。
在Flask中,定义路由就像贴标签:
@app.route('/hello')
def hello():
return 'Hello, World!'
这段代码告诉Flask,当有人访问/hello
这个地址时,执行hello
这个函数,并返回"Hello, World!"。
就像你去餐厅点餐,Flask会这样处理:
模板引擎就像是蛋糕模具,帮助你快速做出漂亮的蛋糕(网页)。在Flask中,模板引擎通常是Jinja2。
使用模板引擎的步骤:
创建模板文件:像是准备一个蛋糕模具。
Hello, {{ name }}!
在Flask中渲染模板:就像把蛋糕糊倒进模具然后烤出来。
from flask import render_template
@app.route('/')
def index():
return render_template('index.html', name='World')
结果:当你访问网站时,会看到"Hello, World!"。
就像填写一张问卷,Flask帮助你接收和处理这些数据。
步骤:
@app.route('/submit', methods=['GET', 'POST'])
def submit():
if request.method == 'POST':
username = request.form['username']
return f'Hello, {username}!'
return render_template('form.html')
Session和Cookie就像是你去超市购物的小票,帮助你保存和追踪信息。
使用Session示例:
from flask import session
# 设置密钥
app.secret_key = 'supersecretkey'
@app.route('/login', methods=['POST'])
def login():
session['username'] = request.form['username']
return 'Logged in!'
@app.route('/logout')
def logout():
session.pop('username', None)
return 'Logged out!'
就像你记账,Flask可以用各种数据库来保存和读取数据。常用的工具是SQLAlchemy。
步骤:
安装SQLAlchemy:像是买一本记账本。
pip install flask_sqlalchemy
配置数据库:就像设定记账的格式和规则。
from flask_sqlalchemy import SQLAlchemy
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(80), unique=True, nullable=False)
操作数据库:就像记账或查账。
user = User(username='John')
db.session.add(user)
db.session.commit()
中间件就像是过滤网,它们在请求到达真正的处理函数之前,先进行一些处理。
使用中间件:
@app.before_request
def before_request_func():
print("Before request")
@app.after_request
def after_request_func(response):
print("After request")
return response
就像你家里的保险丝,出现问题时不会影响整个系统,可以及时处理。
使用示例:
@app.errorhandler(404)
def not_found_error(error):
return 'This page does not exist', 404
@app.errorhandler(500)
def internal_error(error):
return 'Internal server error', 500
就像把文件从电脑拷贝到U盘,Flask帮你接收和保存上传的文件。
步骤:
@app.route('/upload', methods=['POST'])
def upload_file():
file = request.files['file']
file.save('/path/to/save/' + file.filename)
return 'File uploaded!'
蓝图就像是建筑的设计图,帮助你把一个大项目拆分成多个小模块,方便管理和维护。
使用蓝图:
创建蓝图:
from flask import Blueprint
admin_bp = Blueprint('admin', __name__)
@admin_bp.route('/admin')
def admin():
return 'Admin Page'
注册蓝图:
app.register_blueprint(admin_bp)
就像是门禁卡系统,认证是检查你是谁,授权是检查你能做什么。
使用Flask-Login示例:
安装Flask-Login:
pip install flask-login
配置用户加载:
from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user
login_manager = LoginManager(app)
class User(UserMixin):
# 用户模型
@login_manager.user_loader
def load_user(user_id):
return User.get(user_id)
上下文就像是你在某个房间里的环境,有自己的灯光、温度等,Flask通过上下文来管理请求和应用的状态。
使用上下文示例:
from flask import current_app
@app.route('/')
def index():
with app.app_context():
print(current_app.name)
return 'Hello, World!'
就像你检查每个房间的灯是否正常,单元测试帮助你确保每个功能都正常运行。
使用pytest进行单元测试:
pip install pytest
def test_index(client):
response = client.get('/')
assert response.status_code == 200
assert b'Hello, World!' in response.data
就像厨房里的各种小工具,Flask有很多扩展库帮你完成特定任务:
钩子函数就像你做饭前后的一些准备和清理工作。在Flask中,钩子函数可以在请求的不同阶段执行一些特定的操作。
常见的钩子函数:
使用示例:
@app.before_request
def before_request_func():
print("Before handling the request")
@app.after_request
def after_request_func(response):
print("After handling the request")
return response
@app.teardown_request
def teardown_request_func(error=None):
print("Teardown after request")
请求钩子和上下文钩子就像是厨房里的定时器和环境控制器:
before_request
和after_request
。app.app_context()
和app.request_context()
。文件下载就像从网上购物,你点击下载按钮,文件就会被发送到你的电脑。Flask可以用send_file
和send_from_directory
来实现文件下载。
使用示例:
from flask import send_file, send_from_directory
@app.route('/download')
def download_file():
return send_file('/path/to/file', as_attachment=True)
@app.route('/download/')
def download_from_directory(filename):
return send_from_directory('/path/to/directory', filename, as_attachment=True)
请求对象就像是快递包裹,里面装着你需要的信息。在Flask中,request
对象包含了客户端发送的所有数据,如表单数据、文件、headers等。
使用示例:
from flask import request
@app.route('/form', methods=['POST'])
def form_handler():
username = request.form['username']
return f'Hello, {username}!'
@app.route('/json', methods=['POST'])
def json_handler():
data = request.json
return f'Received data: {data}'
API就像是餐馆的菜单,你点什么菜,餐馆就给你做什么。在Flask中实现API,可以使用flask-restful
扩展。
使用示例:
安装flask-restful:
pip install flask-restful
创建API资源:
from flask_restful import Resource, Api
api = Api(app)
class HelloWorld(Resource):
def get(self):
return {'hello': 'world'}
api.add_resource(HelloWorld, '/')
跨域请求就像是从不同的国家购买商品,需要特别的通行证。在Flask中,可以使用flask-cors
扩展来处理跨域请求。
使用示例:
安装flask-cors:
pip install flask-cors
配置跨域请求:
from flask_cors import CORS
CORS(app)
静态文件就像是你家里的装修,图片、CSS、JS文件等。在Flask中,可以用static
文件夹来存放这些静态文件。
使用示例:
static
文件夹内。
国际化和本地化就像是你家的多语言菜单,让不同国家的人都能看懂。在Flask中,可以使用Flask-Babel
扩展来实现。
使用示例:
安装Flask-Babel:
pip install flask-babel
配置Flask-Babel:
from flask_babel import Babel
app.config['BABEL_DEFAULT_LOCALE'] = 'en'
babel = Babel(app)
定义翻译字符串:
{{ _('Hello, World!') }}
创建翻译文件:
pybabel extract -F babel.cfg -o messages.pot .
pybabel init -i messages.pot -d translations -l es
pybabel compile -d translations
蓝图就像是你的房间设计图,每个蓝图代表一个功能模块,方便你管理和组织代码。
使用示例:
创建蓝图:
from flask import Blueprint
user_bp = Blueprint('user', __name__, url_prefix='/user')
@user_bp.route('/login')
def login():
return 'User login page'
注册蓝图:
app.register_blueprint(user_bp)
后台任务就像是你的洗衣机,你启动后可以做别的事,不用一直盯着。在Flask中,可以使用Celery
来处理后台任务。
使用示例:
安装Celery:
pip install celery
配置Celery:
from celery import Celery
def make_celery(app):
celery = Celery(
app.import_name,
backend=app.config['CELERY_RESULT_BACKEND'],
broker=app.config['CELERY_BROKER_URL']
)
celery.conf.update(app.config)
return celery
app.config.update(
CELERY_BROKER_URL='redis://localhost:6379/0',
CELERY_RESULT_BACKEND='redis://localhost:6379/0'
)
celery = make_celery(app)
定义任务:
@celery.task
def add_together(a, b):
return a + b
日志记录就像是你的日记,记录每一天发生的事情。在Flask中,可以使用Python内置的logging
模块。
使用示例:
import logging
from logging.handlers import RotatingFileHandler
handler = RotatingFileHandler('app.log', maxBytes=10000, backupCount=3)
handler.setLevel(logging.INFO)
app.logger.addHandler(handler)
@app.route('/')
def index():
app.logger.info('Index page accessed')
return 'Hello, World!'
信号就像是你家的门铃,有人按门铃,你就知道有人来了。在Flask中,可以使用flask.signals
来处理信号。
使用示例:
from flask import signals
def user_logged_in(sender, user):
print(f'{user} logged in')
signals.user_logged_in.connect(user_logged_in)
@app.route('/login')
def login():
user = 'John'
signals.user_logged_in.send(app, user=user)
return 'Logged in!'
性能优化就像是给你的车做保养,确保它跑得快又稳。在Flask中,可以通过缓存、数据库优化等手段进行性能优化。
使用示例:
使用缓存:
from flask_caching import Cache
app.config['CACHE_TYPE'] = 'simple'
cache = Cache(app)
@cache.cached(timeout=60)
@app.route('/data')
def get_data():
return 'Some data'
优化数据库查询:
from sqlalchemy import select
stmt = select(User).where(User.username == 'John')
result = db.session.execute(stmt).scalars().first()