Flask知识点汇总表格总结

     最近接手的Python项目有两个,一个是Django项目,一个是Flask项目,Django昨天做了一个比较全面的总结,今天再就Flask做一个知识总结。我这相当于是项目驱动学习类型。

    Flask是一个轻量级的Python Web应用框架,它被设计为易于使用和扩展,使其成为快速开发小型网站和复杂应用程序的理想选择。Flask依赖于外部库来提供对象关系映射(ORM)、表单验证、上传管理等其他功能。

目录

1.Flask基础

2.路由和视图函数

3.请求和响应处理

4.模板

 5.表单处理

6.数据库操作

 7.错误处理

8.配置管理

9.静态文件处理

10.蓝图(Blueprints)

11.会话管理

12.国际化和本地化

13.测试

 14.信号(Signals)

15.钩子(Hooks)和过滤器(Filters)

16,拓展(Extensions)

17.安全性

18.异步处理(任务队列)

19.RESTful API

20.项目部署


1.Flask基础
知识点详细说明代码示例
创建Flask实例Flask应用的起点是创建一个Flask类的实例。app = Flask(__name__)
定义路由使用route装饰器将函数与特定URL关联起来。@app.route('/')
视图函数路由装饰器对应的函数,用于处理请求并返回响应。def index(): return 'Hello, World!'
运行应用启动Flask服务器以响应HTTP请求。app.run(debug=True)
模板渲染使用Jinja2模板引擎渲染HTML模板。render_template('index.html', title='Home')
静态文件提供静态文件,如CSS、JavaScript和图片。app = Flask(__name__, static_folder='static')
请求对象request对象提供当前HTTP请求的所有数据。name = request.args.get('name', 'World')
响应对象用于创建和返回HTTP响应。return make_response(render_template('index.html'))

代码示例:

from flask import Flask, render_template, request, jsonifyapp = Flask(__name__)@app.route('/')
def index():# 视图函数返回一个响应return render_template('index.html', title='Home')@app.route('/hello', methods=['GET'])
def hello_world():# 一个简单的GET路由name = request.args.get('name', 'World')return 'Hello, {}'.format(name)@app.route('/static/test.css')
def serve_static():# 直接返回静态文件return app.send_static_file('test.css')if __name__ == '__main__':app.run(debug=True)

模板示例:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{{ title }}</title>
</head>
<body><h1>{{ title }}</h1><p>Welcome to the Flask app!</p>
</body>
</html>
2.路由和视图函数

路由是URL路径到应用功能的映射。Flask使用装饰器来定义路由,将特定的URL模式映射到Python函数(视图函数)。视图函数是处理请求并返回响应的函数。

知识点详细说明代码示例
静态路由静态路由是映射到固定URL的路由。@app.route('/about')
动态路由动态路由允许URL包含变量部分。@app.route('/user/<username>')
路由变量通过尖括号定义的变量,可以从URL中捕获值。<int:id><username>
默认值为路由变量提供默认值。@app.route('/greet/<name>', defaults={'name': 'Guest'})
HTTP 方法限制路由可以响应的HTTP方法。@app.route('/user', methods=['GET', 'POST'])
重定向使用redirect函数在路由之间重定向。from flask import redirect; return redirect(url_for('index'))
URL生成使用url_for生成URL。url_for('static', filename='style.css')
视图函数返回值视图函数可以返回字符串、响应对象或使用render_template渲染的模板。return render_template('index.html', title='Home')

代码示例:

from flask import Flask, render_template, redirect, url_forapp = Flask(__name__)@app.route('/')
def index():return 'Hello, World!'@app.route('/user/<username>')
def profile(username):# 动态路由示例,显示用户名return 'User: {}'.format(username)@app.route('/old_path')
def old_path():# 从旧路径重定向到新路径return redirect(url_for('index'))@app.route('/post/<int:post_id>')
def post(post_id):# 使用尖括号定义的变量捕获整数值return 'Post ID: {}'.format(post_id)@app.route('/greet/<name>')
def greet(name):# 使用默认值return 'Hello, {}'.format(name)if __name__ == '__main__':app.run(debug=True)

 模板示例(index.html)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{{ title }}</title>
</head>
<body><h1>{{ title }}</h1><!-- 链接到动态路由 --><a href="{{ url_for('profile', username='JohnDoe') }}">John Doe's Profile</a>
</body>
</html>
3.请求和响应处理

在Flask中,处理HTTP请求和构造HTTP响应是核心功能之一。Flask提供了request对象来访问请求数据,以及make_response函数来创建响应对象。

知识点详细说明代码示例
请求对象request是一个全局对象,包含了HTTP请求的所有数据。request.methodrequest.argsrequest.form
请求方法访问HTTP请求的方法(GET, POST, PUT, DELETE等)。if request.method == 'POST':
查询参数从URL的查询字符串中获取参数。name = request.args.get('name', 'World')
表单数据获取POST请求中表单提交的数据。data = request.form.get('data')
JSON数据解析请求中的JSON数据。json_data = request.get_json()
响应对象make_response函数用于创建一个响应对象,它包含了响应体和各种HTTP头信息。response = make_response('Hello, World!', 200)
状态码设置HTTP响应的状态码。response.status_code = 404
响应头设置HTTP响应的头部信息。response.headers['Content-Type'] = 'text/plain'
Cookies操作客户端的Cookies。response.set_cookie('name', 'value')
文件下载发送文件流响应,实现文件下载。return send_file('path/to/file', as_attachment=True)

 代码示例:

from flask import Flask, request, make_response, jsonify, send_fileapp = Flask(__name__)@app.route('/request-info')
def request_info():# 显示请求的一些信息info = {'method': request.method,'args': request.args,'form': request.form,'json': request.get_json()}return jsonify(info)@app.route('/post-data', methods=['POST'])
def post_data():# 处理POST请求的表单数据data = request.form.get('data', 'Default Value')return 'You posted: {}'.format(data)@app.route('/download')
def download():# 文件下载示例return send_file('path/to/file.txt', as_attachment=True)if __name__ == '__main__':app.run(debug=True)
4.模板

Flask使用Jinja2作为其模板引擎,允许您生成HTML文件。模板可以包含变量、控制结构(如循环和条件语句),并允许您将应用逻辑与表现层分离。

知识点详细说明代码示例
基本语法使用双花括号 {{ }} 来输出变量,使用 {% %} 来编写控制逻辑。{{ variable }}{% if condition %}
变量输出将变量插入到HTML中。{{ user.username }}
控制结构使用 ifforelse 等控制逻辑。{% if users %}...{% endif %}
模板继承允许一个模板扩展另一个模板。{% extends 'base.html' %}
模板块允许子模板覆盖(或填充)父模板的块。{% block content %}...{% endblock %}
过滤器对变量进行格式化或处理。`{{ user.email
允许您定义可重用的模板代码块。{% macro input(name, value='') %}...{% endmacro %}
模板上下文模板可以自动接收当前的请求、session等对象。requestsession
静态文件模板中引用静态文件路径。{{ url_for('static', filename='css/style.css') }}
环境配置设置模板引擎的配置,如模板文件夹、缓存等。app.jinja_env.trim_blocks = True

代码示例:

from flask import Flask, render_templateapp = Flask(__name__)@app.route('/')
def index():# 传递变量到模板title = "Home"users = ["Alice", "Bob", "Charlie"]return render_template('index.html', title=title, users=users)if __name__ == '__main__':app.run(debug=True)

模板示例(index.html)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{{ title }}</title><link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body><h1>{{ title }}</h1><ul>{% for user in users %}<li>{{ user }}</li>{% endfor %}</ul>
</body>
</html>

 模板示例(使用模板继承和块的base.html)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{% block title %}My App{% endblock %}</title>
</head>
<body><header><nav><!-- Navigation bar --></nav></header><main>{% block content %}{% endblock %}</main><footer><!-- Footer --></footer>
</body>
</html>
 5.表单处理

表单处理是Web应用中常见的功能之一,Flask通过集成WTForms库来实现表单的创建和验证。WTForms提供了表单字段类型、验证规则以及表单渲染等。

知识点详细说明代码示例
WTForms集成使用Flask-WTF扩展集成WTForms库。from flask_wtf import FlaskForm
表单字段定义表单中的不同类型的字段,如文本框、密码框、复选框等。TextField('Username', validators=[InputRequired()])
字段验证对表单字段应用验证规则,确保数据的正确性。validators=[DataRequired(), Email()]
表单渲染在模板中渲染表单,包括生成HTML标签和处理表单数据。{{ form.hidden_tag() }}
表单提交处理表单的POST请求,获取和验证表单数据。if form.validate_on_submit():
CSRF保护启用跨站请求伪造保护。form = MyForm(meta={'csrf': True})
文件上传处理文件上传字段。FileField('Photo', validators=[FileAllowed(['jpg', 'png'], 'Images only!')])
自定义表单类创建自定义的WTForms表单类。class MyForm(FlaskForm):
错误消息显示在模板中显示表单字段的错误消息。{{ form.username.errors }}

 代码示例:

首先,安装Flask-WTF扩展:

pip install Flask-WTF

 然后是Flask应用代码:

from flask import Flask, render_template, flash, redirect, url_for
from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequiredapp = Flask(__name__)
app.config['SECRET_KEY'] = 'a-very-secret-key'  # 设置CSRF保护的密钥class LoginForm(FlaskForm):username = StringField('Username', validators=[DataRequired()])password = PasswordField('Password', validators=[DataRequired()])submit = SubmitField('Sign In')@app.route('/login', methods=['GET', 'POST'])
def login():form = LoginForm()if form.validate_on_submit():# 这里添加用户验证逻辑flash('Login requested for user {}, remember=True'.format(form.username.data))return redirect(url_for('index'))return render_template('login.html', title='Sign In', form=form)@app.route('/')
def index():return 'Index Page'if __name__ == '__main__':app.run(debug=True)

模板示例(login.html):

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{{ title }}</title>
</head>
<body><h1>{{ title }}</h1><form method="post">{{ form.hidden_tag() }}<p>{{ form.username.label }}<br>{{ form.username(size=20) }}<br>{% if form.username.errors %}<span style="color: red;">{{ form.username.errors[0] }}</span>{% endif %}</p><p>{{ form.password.label }}<br>{{ form.password(size=20) }}<br>{% if form.password.errors %}<span style="color: red;">{{ form.password.errors[0] }}</span>{% endif %}</p><p>{{ form.submit() }}</p></form>
</body>
</html>
6.数据库操作

Flask通过使用扩展库如SQLAlchemy来实现与数据库的交互。SQLAlchemy是一个ORM(对象关系映射)工具,它允许你使用Python代码来定义数据库模型,并与数据库进行交互。

知识点详细说明代码示例
SQLAlchemy配置配置SQLAlchemy作为ORM工具。from flask_sqlalchemy import SQLAlchemy
定义模型创建类来表示数据库中的表。class User(db.Model):
字段类型定义模型的字段及其数据类型。id = db.Column(db.Integer, primary_key=True)
主键和索引设置字段为主键或索引。primary_key=Trueindex=True
关系映射定义模型之间的关联关系。posts = db.relationship('Post', backref='author', lazy=True)
创建和更新记录向数据库中添加或更新记录。new_user = User(username='John Doe')db.session.add(new_user)
查询记录使用SQLAlchemy查询构造器检索记录。users = User.query.all()
删除记录从数据库中删除记录。db.session.delete(user)
事务操作使用事务来确保数据库操作的原子性。db.session.commit()db.session.rollback()
数据库迁移使用Flask-Migrate管理数据库迁移。from flask_migrate import Migrate
查询优化使用懒加载和预加载优化查询性能。lazy='dynamic'joinedload

代码示例:

 首先,安装SQLAlchemy和Flask-Migrate:

pip install Flask-SQLAlchemy Flask-Migrate

然后是Flask应用代码;

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrateapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///mydatabase.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
migrate = Migrate(app, db)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 '<User %r>' % self.username@app.route('/')
def index():new_user = User(username='xiaomifeng1010', email='xiaomifeng1010@example.com')db.session.add(new_user)db.session.commit()return 'User added.'if __name__ == '__main__':db.create_all()app.run(debug=True)

示例包括SQLAlchemy配置、定义模型、字段类型、关系映射、创建和更新记录、查询记录、删除记录、事务操作以及数据库迁移等。 

 7.错误处理

错误处理是Web应用开发中一个重要的部分,它确保应用能够优雅地处理意外情况。Flask允许你捕获和处理特定的错误,甚至自定义错误页面。

知识点详细说明代码示例
错误页面通过errorhandler装饰器定义自定义错误页面。@app.errorhandler(404)
HTTP异常抛出HTTP异常来立即中断请求并返回错误响应。raise HTTPException('404 Not Found')
自定义异常创建自定义异常类来处理特定的业务逻辑错误。class MyCustomError(Exception):
全局异常处理使用app.handle_exceptionapp.errorhandler全局捕获未处理的异常。def handle_error(e):
日志记录使用日志记录错误信息,便于调试和监控。app.logger.error('An error occurred')
错误传递在视图函数中捕获异常,并将错误信息传递给模板。try: ... except:
错误状态码在返回响应时设置合适的HTTP状态码。response = make_response('Error page'), 500)
安全错误处理避免泄露敏感信息,如在生产环境中隐藏详细的错误堆栈。app.config['DEBUG'] = False

代码示例:

from flask import Flask, render_template, make_response
from werkzeug.exceptions import HTTPExceptionapp = Flask(__name__)@app.errorhandler(404)
def page_not_found(e):# 自定义404错误页面return render_template('404.html'), 404@app.errorhandler(Exception)
def handle_exception(e):# 全局错误处理app.logger.error('An error occurred - %s', str(e))if isinstance(e, HTTPException):response = e.get_response()else:response = make_response(render_template('500.html'), 500)return response@app.route('/')
def index():try:# 假设的代码出错result = 10 / 0except ZeroDivisionError:return render_template('error.html', error='division by zero'), 400return 'This is the index page'if __name__ == '__main__':app.run(debug=True)

模板示例(404.html)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>404 - Page Not Found</title>
</head>
<body><h1>404 - Page Not Found</h1><p>The page you are looking for does not exist.</p>
</body>
</html>

示例包括定义错误页面、处理HTTP异常、创建自定义异常、全局异常处理、日志记录、错误传递和安全错误处理等。

8.配置管理

配置管理是Flask应用中用于设置和读取配置值的重要部分。这些配置可以包括数据库连接字符串、应用调试模式、静态文件路径等。

知识点详细说明代码示例
配置项Flask应用的配置项,如DEBUGSECRET_KEY等。app.config['DEBUG'] = True
环境变量从环境变量中读取配置,适合生产环境。import os; DEBUG = os.environ.get('FLASK_DEBUG', True)
配置文件使用外部文件(如.env或config.py)来存储配置。from dotenv import load_dotenv; load_dotenv()
默认配置Flask提供的默认配置,可以在需要时覆盖。app.config.from_object('flask.default_config')
覆盖配置在应用启动时,使用命令行参数或代码覆盖配置项。app.config.from_pyfile('config.py')
类型转换确保配置值是正确的类型。SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL', 'sqlite:///' + os.path.join(basedir, 'app.db'))
加密配置对于敏感信息,使用加密的配置值。from flask_config_manager import ConfigManager
动态配置根据应用的运行时状态动态设置配置。if app.debug: app.config['DEBUG'] = True

代码示例:

使用环境变量和.env文件:

import os
from dotenv import load_dotenv
from flask import Flask# 加载.env文件中的环境变量
load_dotenv()app = Flask(__name__)
basedir = os.path.abspath(os.path.dirname(__file__))# 从环境变量中读取配置
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY')
app.config['DATABASE_URL'] = os.environ.get('DATABASE_URL', 'sqlite:///' + os.path.join(basedir, 'app.db'))# 应用的其他配置...

使用配置文件

# config.py
DEBUG = True
SECRET_KEY = 'supersecretkey'
SQLALCHEMY_DATABASE_URI = 'sqlite:///mydatabase.db'

然后在主应用文件中:

app.config.from_pyfile('config.py')

示例中包括配置项、环境变量、配置文件、默认配置、覆盖配置、类型转换、加密配置和动态配置等。

9.静态文件处理

静态文件是指在Web应用中通常不会频繁变化的文件,如CSS样式表、JavaScript脚本和图片。Flask提供了简单的方法来管理和提供这些静态文件。

知识点详细说明代码示例
静态文件目录Flask自动从应用的static文件夹提供静态文件。app = Flask(__name__, static_folder='static')
自定义静态文件路径可以指定静态文件的自定义路径。app = Flask(__name__, static_folder='my_static')
静态文件URL使用url_for生成静态文件的URL。url_for('static', filename='css/style.css')
缓存控制对静态文件的缓存进行控制以优化性能。app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 3600
文件版本控制通过添加版本号或hash值来防止浏览器缓存问题。url_for('static', filename='js/script-v1.2.3.js')
静态文件服务器开发时可以使用Flask的内置服务器提供静态文件,生产环境应使用专门的静态文件服务器。-
大型静态文件对于大型静态文件,考虑使用CDN或专用的静态文件服务器。-
安全性确保静态文件服务不会泄露应用目录之外的文件。-

代码示例:

在Flask应用中提供静态文件:

from flask import Flaskapp = Flask(__name__, static_folder='static')@app.route('/')
def index():return render_template('index.html')

假设index.html模板中引用了静态文件:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body><script src="{{ url_for('static', filename='js/app.js') }}"></script><!-- Content -->
</body>
</html>

 示例中包括静态文件目录、自定义静态文件路径、静态文件URL、缓存控制、文件版本控制、静态文件服务器和安全性等。

10.蓝图(Blueprints)

蓝图是Flask提供的组织代码的一种方式,允许你将应用分割成不同的组件,每个组件负责处理一组相关的功能或路由。这使得大型应用的管理和测试变得更加容易。

知识点详细说明代码示例
创建蓝图导入Blueprint并创建蓝图对象。from flask import Blueprint
注册蓝图将蓝图注册到Flask应用中。app.register_blueprint(my_blueprint)
蓝图路由在蓝图对象上使用route装饰器定义路由。my_blueprint.route('/hello')
URL前缀为蓝图中的路由设置URL前缀。app.register_blueprint(bp, url_prefix='/users')
动态路由蓝图中的路由也可以包含动态部分。my_blueprint.route('/<username>')
导入蓝图从其他模块导入蓝图对象。from my_module import my_blueprint
蓝图命名为蓝图指定名称,方便在模板中使用。blueprint = Blueprint('my_blueprint', __name__)
蓝图顺序注册蓝图的顺序可能影响路由匹配的结果。app.register_blueprint(auth Blueprint('auth'))
蓝图和配置蓝图可以有自己的配置,也可以使用应用的全局配置。blueprint.config['DEBUG'] = True
蓝图的模板和静态文件蓝图可以有自己的模板和静态文件目录。blueprint = Blueprint('my_blueprint', __name__, static_folder='static', template_folder='templates')

代码示例:

创建蓝图

from flask import Blueprintmy_blueprint = Blueprint('my_blueprint', __name__)@my_blueprint.route('/')
def index():return "Hello from the blueprint!"@my_blueprint.route('/hello/<name>')
def hello(name):return "Hello, {}".format(name)

在应用中注册蓝图:

from flask import Flask
from my_module import my_blueprintapp = Flask(__name__)# 注册蓝图,设置url_prefix为'/my_blueprint'
app.register_blueprint(my_blueprint, url_prefix='/my_blueprint')if __name__ == '__main__':app.run(debug=True)

示例中包括创建蓝图、注册蓝图、蓝图路由、URL前缀、动态路由、导入蓝图、蓝图命名、蓝图顺序、蓝图和配置以及蓝图的模板和静态文件等。

11.会话管理

会话管理是Web应用中用于跟踪用户状态的重要部分。Flask使用客户端Cookies和服务器端存储来实现会话管理。

知识点详细说明代码示例
启用会话使用Flask-Session扩展启用会话支持。from flask_session import Session
配置会话配置会话类型和存储选项。app.config['SESSION_TYPE'] = 'filesystem'
会话对象使用session对象存储和获取会话中的信息。session['username'] = 'JohnDoe'
持久化会话配置会话的持久化存储。Session(app)
安全会话使用SECRET_KEY配置项确保会话的安全性。app.config['SECRET_KEY'] = 'secret_key'
会话过期控制会话的生命周期。session.permanent = True
修改和删除修改和删除会话中的值。session.pop('username', None)
会话保护防止会话劫持和固定会话。SESSION_PROTECTION = 'strong'
跨域会话在使用子域时管理会话的共享。SESSION_COOKIE_DOMAIN = '.example.com'
会话示例在模板中使用会话数据。{% if session['username'] %}Hello, {{ session['username'] }}{% endif %}

代码示例

首先,安装Flask-Session扩展:

 pip install Flask-Session

然后是Flask应用代码:

from flask import Flask, session
from flask_session import Sessionapp = Flask(__name__)
app.config['SESSION_TYPE'] = 'filesystem'  # 也可以是redis, memcached等
app.config['SECRET_KEY'] = 'a-very-secret-key'# 需要在第一个请求前初始化Session
Session(app)@app.route('/login', methods=['POST'])
def login():# 假设验证逻辑通过session['username'] = 'JohnDoe'return 'Logged in'@app.route('/logout')
def logout():# 清除会话中的usernamesession.pop('username', None)return 'Logged out'@app.route('/')
def index():return 'Home' if 'username' not in session else 'Hello, {}'.format(session['username'])if __name__ == '__main__':app.run(debug=True)

示例中包括启用会话、配置会话、会话对象、持久化会话、安全会话、会话过期、修改和删除、会话保护、跨域会话和会话示例等

12.国际化和本地化

国际化是指设计和开发能适应不同国家和文化环境的软件的过程。本地化则是将软件调整为适应特定地区的过程。Flask使用Babel库来实现国际化和本地化。

知识点详细说明代码示例
Babel集成使用Flask-Babel扩展集成Babel库。from flask_babel import Babel
gettext使用gettext函数进行字符串的翻译。_("Hello, World!")
翻译函数定义翻译函数,如_gettext等。from flask_babel import gettext as _
消息提取从代码和模板中提取可翻译的字符串。pybabel extract -F babel.cfg -o messages.pot .
编译翻译编译.po文件生成.mo文件用于运行时翻译。pybabel compile -d app/translations -D my_app
更新翻译更新现有翻译或创建新语言的翻译。pybabel update -i messages.pot -d app/translations -l de
语言环境根据用户偏好设置请求的语言环境。from flask import request
语言选择允许用户选择应用的语言。url_for('index', _language='es')
时区支持处理与时区相关的本地化问题。from babel.dates import format_datetime
数字和日期格式根据不同语言环境格式化数字和日期。format_datetime(datetime, 'long', locale=locale)

代码示例

首先,安装Flask-Babel扩展

 pip install Flask-Babel

然后是Flask应用代码:

from flask import Flask, render_template
from flask_babel import Babel, gettext as _app = Flask(__name__)
babel = Babel(app)# 假设已经通过Babel的配置文件设置了语言环境@app.route('/')
def index():return render_template('index.html', title=_("Welcome"))if __name__ == '__main__':app.run(debug=True)

模板示例(index.html)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>{{ title }}</title>
</head>
<body><h1>{{ title }}</h1><p>{{ _('Hello, World!') }}</p>
</body>
</html>

示例包括Babel集成、gettext翻译函数、消息提取、编译翻译、更新翻译、语言环境、语言选择、时区支持、数字和日期格式等。

13.测试

测试是确保Web应用按预期工作的重要环节。Flask提供了一个测试客户端,允许你模拟请求并测试视图函数。

知识点详细说明代码示例
测试客户端使用Flask的测试客户端模拟请求。app.test_client()
发送请求使用测试客户端发送GET、POST等请求。client.get('/')
请求上下文在请求上下文中执行测试。with app.test_request_context():
检查响应检查响应的状态码、数据和头部。response = client.get('/')
表单提交提交表单并测试表单处理逻辑。response = client.post('/login', data={'username': 'admin'})
测试配置为测试设置不同的配置,避免影响生产环境。app.config['TESTING'] = True
覆盖URLs在测试时覆盖URL规则。app.url_map.bind('localhost')
测试数据库使用测试数据库避免影响生产数据。SQLALCHEMY_DATABASE_URI = 'sqlite:///'
Fixtures使用Fixtures准备测试数据。@pytest.fixture
并发测试测试应用在并发条件下的行为。@pytest.mark.asyncio
性能测试对应用进行性能测试。使用外部工具如Locust

代码示例:

使用Flask的测试客户端:

import unittest
from flask import Flask, url_for
app = Flask(__name__)
app.config['TESTING'] = True# 假设有一些路由和视图函数定义class TestFlaskApp(unittest.TestCase):def setUp(self):self.client = app.test_client()def test_index(self):response = self.client.get(url_for('index'))self.assertEqual(response.status_code, 200)def test_404(self):response = self.client.get(url_for('static', filename='unknown'))self.assertEqual(response.status_code, 404)if __name__ == '__main__':unittest.main()
 14.信号(Signals)

在Flask中,信号是一种实现应用组件间松耦合通信的方式。Flask-Signals扩展提供了信号支持,允许在特定事件发生时发送通知。

知识点详细说明代码示例
Flask-Signals使用Flask-Signals扩展来处理信号。from flask.signals import signals_available, got_request_exception
信号注册注册信号接收器以响应特定事件。signals_pre_request.connect(obj, sender=app)
发送信号在应用逻辑中发送信号。signals_pre_request.send(app)
内置信号Flask内置了一些信号,如before_render_templatetemplate_rendered等。from flask import signals
自定义信号创建自定义信号以满足特定需求。class my_signal(Signal):
信号管理管理信号的注册和注销。receiver.connected_receiver.disconnect()
信号与蓝图在蓝图中使用信号。from flask import Blueprint, signals
信号与AOP结合面向切面编程(AOP)使用信号。使用信号在方法前后执行代码
信号性能注意信号的使用可能影响应用性能。谨慎使用信号,避免不必要的开销

代码示例

首先,安装Flask-Signals扩展:

 pip install Flask-Signals

然后是Flask应用代码:

 

from flask import Flask
from flask.signals import Signal, got_request_exceptionapp = Flask(__name__)# 定义一个信号
pre_request = Signal()# 定义一个信号接收器
def log_request(sender, **extra):print("Request logged")# 将信号与接收器关联
pre_request.connect(log_request, sender=app)@app.route('/')
def index():# 在请求处理前发送信号pre_request.send(app)return 'Hello, World!'@app.errorhandler(404)
def page_not_found(e):# 发送异常信号got_request_exception.send(app, exception=e)return 'Page not found', 404if __name__ == '__main__':app.run(debug=True)
15.钩子(Hooks)和过滤器(Filters)

钩子和过滤器是Flask中用于在特定点介入应用流程的机制。钩子用于在应用的生命周期中的特定事件上执行代码,而过滤器提供了一种在渲染模板之前修改变量内容的方法。

知识点详细说明代码示例
钩子(Hooks)钩子允许你在Flask应用的生命周期中的特定点执行代码。@app.before_first_request
钩子管理Flask-Hooks了插件提供了更多的钩子支持。from flask_hooks import Hooks
自定义钩子创建自定义钩子以满足特定需求。Hooks.register('my_hook', custom_hook_function)
过滤器(Filters)模板过滤器允许你定义在渲染模板之前修改变量的函数。@app.template_filter('my_filter')
过滤器使用在模板中使用定义的过滤器。`{{ some_variable
全局过滤器定义全局可用的过滤器。@app.template_filter('title', True)
环境集成钩子和过滤器可以与蓝图、信号等其他Flask功能集成。在蓝图中使用钩子和过滤器
性能考虑注意过滤器的性能,避免在模板中进行复杂操作。使用缓存或优化过滤器逻辑

代码示例

使用钩子:

from flask import Flask
app = Flask(__name__)@app.before_first_request
def on_start():print("Application is starting up.")if __name__ == '__main__':app.run(debug=True)

使用过滤器:

from flask import Flask
app = Flask(__name__)@app.template_filter('int_or_none')
def int_or_none_filter(value):try:return int(value)except (TypeError, ValueError):return None@app.route('/')
def index():return render_template('index.html', some_value='123abc')if __name__ == '__main__':app.run(debug=True)

模板示例(index.html)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><p>{{ some_value|int_or_none }}</p>
</body>
</html>
16,拓展(Extensions)

Flask扩展是一小组组件,它们为Flask应用提供了各种功能,如数据库集成、用户认证、表单处理、任务队列、缓存等。

知识点详细说明代码示例
扩展使用使用扩展来添加额外的功能。from flask_sqlalchemy import SQLAlchemy
配置扩展为扩展配置应用。db = SQLAlchemy(app)
常用扩展Flask社区提供了许多常用的扩展。Flask-SQLAlchemy, Flask-WTF, Flask-Login, Flask-Caching 等
扩展初始化在应用对象上初始化扩展。from flask_mail import Mail
扩展配置为扩展设置配置项。app.config['SQLALCHEMY_DATABASE_URI']
扩展方法使用扩展提供的方法。db.create_all()
自定义扩展创建自定义扩展以封装特定的应用逻辑。class MyCustomExtension(object):
扩展集成将多个扩展集成到一个应用中。使用Flask-Security集成Flask-SQLAlchemy和Flask-Login
扩展事件利用扩展提供的事件钩子。from flask_sqlalchemy import models_committed
扩展性能考虑扩展的性能影响。使用合适的缓存策略

代码示例:

使用Flask-SQLAlchemy拓展

from flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///myapp.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)def __repr__(self):return '<User %r>' % self.username@app.route('/')
def index():new_user = User(username='JohnDoe', email='john@example.com')db.session.add(new_user)db.session.commit()return 'User added.'if __name__ == '__main__':db.create_all()app.run(debug=True)
17.安全性

安全性是Web应用开发中至关重要的部分。Flask提供了一些内置的机制和建议,以及与外部库的集成,来帮助开发者构建安全的Web应用。

知识点详细说明代码示例
密码哈希使用密码哈希来存储用户密码。werkzeug.security.generate_password_hash
密码校验验证用户输入的密码是否正确。werkzeug.security.check_password_hash
HTTPS支持强制使用HTTPS来保护数据传输。app.config['PREFERRED_URL_SCHEME'] = 'https'
内容安全策略实施内容安全策略(CSP)来防止跨站脚本攻击。设置HTTP头 Content-Security-Policy
跨站请求伪造(CSRF)使用Flask-WTF等扩展来防御CSRF攻击。from flask_wtf import CSRFProtect
SQL注入防护使用ORM来防止SQL注入攻击。db.session.query(User).filter_by(username=user_input)
点击劫持防护防止点击劫持攻击。设置HTTP头 X-Frame-Options
XSS防护防范跨站脚本(XSS)攻击。使用模板自动转义和`
Session 安全安全地管理用户会话。使用session对象和SECRET_KEY
安全头设置各种HTTP安全头。使用flask-talisman来设置安全头
依赖更新定期更新Flask及其扩展以修复安全漏洞。使用pipconda进行更新

代码示例

使用密码哈希和校验

from werkzeug.security import generate_password_hash, check_password_hashpassword_hash = generate_password_hash('mypassword')
# 存储password_hash到数据库# 密码校验
password = 'mypassword'
is_correct = check_password_hash(password_hash, password)

启用CSRF保护:

from flask_wtf import CSRFProtectapp = Flask(__name__)
# 其他配置...# 启用CSRF保护
csrf = CSRFProtect(app)
18.异步处理(任务队列)

异步处理允许应用程序执行长时间运行的任务而不会阻塞请求的进程,这对于提高应用程序的响应性和可伸缩性至关重要。Flask可以通过集成如Celery这样的任务队列系统来实现异步处理。

知识点详细说明代码示例
Celery集成使用Celery进行后台任务处理。from celery import Celery
任务定义定义Celery任务来执行异步操作。@celery.task
任务延迟将任务推迟到以后执行。my_task.delay(arg1, arg2)
任务执行立即执行任务。result = my_task.apply(args=[arg1, arg2])
任务结果存储和检索任务的结果。result.get(timeout=timeout)
周期任务定时执行任务。app.add_periodic_task(5.0, my_task.s(arg))
任务重试配置任务失败时的重试策略。my_task.retry(exc=Exception('Something went wrong'))
信号支持使用Celery的信号来响应任务事件。from celery.signals import task_prerun, task_postrun
结果后端配置Celery的结果后端来存储任务状态。app.conf.result_backend = 'redis://localhost:6379/0'
消息代理使用消息代理如RabbitMQ或Redis来传递任务消息。app.conf.broker_url = 'pyamqp://localhost//'
调试和日志使用Celery的日志系统进行调试。app.worker_log = logging.getLogger('celery.worker')

 代码示例

首先安装Celery和与消息代理相匹配的库(如RabbitMQ的koubu)

pip install celery
pip install kombu

然后是Flask应用代码:

from flask import Flask
from celery import Celeryapp = Flask(__name__)
# 配置Celery的broker_url
app.config['CELERY_BROKER_URL'] = 'redis://localhost:6379/0'
celery = Celery(app.name, broker=app.config['CELERY_BROKER_URL'])@celery.task
def add(x, y):return x + y@app.route('/async/add/<int:x>/<int:y>')
def add_async(x, y):result = add.delay(x, y)return f'Result: {result.get()}'
19.RESTful API

RESTful API(Representational State Transfer)是一种基于HTTP协议的轻量级架构,用于网络应用程序之间的互操作性和通信。Flask可以用来快速开发RESTful服务。

知识点详细说明代码示例
路由和端点使用Flask的路由系统定义API端点。@app.route('/resource', methods=['GET', 'POST'])
请求方法支持GET、POST、PUT、DELETE等HTTP方法。if request.method == 'POST':
请求解析解析JSON、表单数据或XML等请求体。json_data = request.get_json()
响应对象使用make_response创建和自定义响应。response = make_response(json.dumps(data), 201)
JSON响应常用于返回JSON格式的数据。from flask import jsonify
HTTP状态码返回合适的HTTP状态码表示操作结果。return make_response(json.dumps({'message': 'Not Found'}), 404)
错误处理自定义错误处理来返回API友好的错误信息。@app.errorhandler(404)
请求限制使用Flask-Limiter限制请求频率。from flask_limiter import Limiter
认证使用Flask-HTTPAuth或JWT等实现API认证。from flask_httpauth import HTTPBasicAuth
版本控制为API实现版本控制。@app.route('/api/v1/resource')
文档使用Swagger (OpenAPI)为API生成文档。from flask_swagger_ui import get_swaggerui_blueprint

代码示例

使用Flask创建一个简单的RESTful API:

from flask import Flask, jsonify, request, make_response
from flask_httpauth import HTTPBasicAuthapp = Flask(__name__)
auth = HTTPBasicAuth()# 假设有一个用户认证的逻辑
@auth.verify_password
def verify_password(username, password):if username == 'admin' and password == 'secret':return True@app.route('/api/resource', methods=['GET', 'POST'])
@auth.login_required
def resource():if request.method == 'POST':data = request.get_json()# 处理数据并保存到数据库...return jsonify({'message': 'Resource created'}), 201else:# 获取所有资源resources = [{'id': 1, 'name': 'Resource One'}]return jsonify(resources)@app.errorhandler(404)
def not_found(error):return make_response(jsonify({'error': 'Not found'}), 404)if __name__ == '__main__':app.run(debug=True)
20.项目部署

部署是指将开发完成的Flask应用放到服务器上,使其可以对外提供服务的过程。Flask应用可以部署到各种服务器和平台上,包括WSGI服务器、容器化平台(如Docker)和云服务(如AWS、Heroku,阿里云等)。

知识点详细说明代码示例
WSGI服务器使用WSGI兼容的服务器来运行Flask应用。gunicorn -b :8000 myapp:app
部署选项Flask应用可以部署到多种服务器上。使用Gunicorn, uWSGI, Waitress等
虚拟环境在虚拟环境中部署以隔离依赖。venv 或 conda
环境变量使用环境变量来管理配置和敏感信息。os.environ['FLASK_ENV'] = 'production'
静态文件静态文件应通过专门的服务器提供。使用Nginx或CDN服务
数据库迁移将应用部署到服务器时可能需要数据库迁移。使用Alembic或Flask-Migrate
进程管理使用进程管理器来管理应用的运行。supervisord 或 systemd
日志管理配置日志以便于监控和调试。使用logging模块
HTTPS配置SSL/TLS来启用HTTPS。通过服务器或反向代理配置
性能优化根据需要对Flask应用进行性能优化。使用缓存、数据库优化等
容器化使用Docker等容器化技术部署Flask应用。docker build -t myapp .
云服务利用云平台的PaaS或IaaS服务部署。AWS Elastic Beanstalk, Heroku,阿里云 等

代码示例:

使用Gunicom部署Flask应用:

 

# 在虚拟环境中安装Gunicorn
pip install gunicorn

# 使用Gunicorn运行Flask应用
gunicorn -w 4 -b :8000 myapp:app

配置Nginx作为反向代理服务器:

server {listen 80;server_name myapp.com www.myapp.com;location / {proxy_pass http://localhost:8000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}location /static/ {root /path/to/myapp/static;expires 30d;}
}

 使用Docker部署Flask应用:

# 使用官方Python镜像
FROM python:3.8# 设置工作目录
WORKDIR /app# 安装依赖
COPY requirements.txt /app/
RUN pip install -r requirements.txt# 复制应用代码
COPY . /app/# 运行应用
CMD ["gunicorn", "-b", ":8000", "myapp:app"]

Flask对于原Java开发者来说,学习起来应该要更加容易一些,接口写法有一些相似性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/6019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能数据分析平台待修复BUG以及待完成需求

快速跳转&#xff1a;何耳林毕设项目介绍-CSDN博客 BUG 1.个人图标页搜索功能&#xff0c;不能进行搜索 2.用户管理功能头部搜索栏有多余搜索项 3.修改用户权限等信息会影响当前管理用户 待完成需求 1.新增AI问答功能 2.图标页自动刷新功能 3.将个人页更改到头像下拉框&…

分类规则挖掘(三)

目录 四、贝叶斯分类方法&#xff08;一&#xff09;贝叶斯定理&#xff08;二&#xff09;朴素贝叶斯分类器&#xff08;三&#xff09;朴素贝叶斯分类方法的改进 五、其它分类方法 四、贝叶斯分类方法 贝叶斯 (Bayes) 分类方法是以贝叶斯定理为基础的一系列分类算法的总称。贝…

【C++STL详解(五)】--------list的介绍与使用

目录 前言 一、list的介绍 二、list的使用 Ⅰ.默认成员函数 1、构造函数 2、赋值重载 3、析构函数 Ⅱ、容量 1.size() Ⅲ、迭代器与遍历 1.beginend (正向迭代器) 2.rbeginrend (反向迭代器) 3.front 4.back Ⅳ、增删查改 1.push_front 2.pop_front 3.push_b…

目标跟踪难点及算法介绍

目标跟踪是计算机视觉领域的一个重要问题&#xff0c;目前广泛应用在体育赛事转播、安防监控和无人机、无人车、机器人等领域。 简单来说&#xff0c;目标跟踪就是在连续的视频序列中&#xff0c;建立所要跟踪物体的位置关系&#xff0c;得到物体完整的运动轨迹。给定图像第一帧…

c3 笔记7 css基本语法

相关内容&#xff1a;字体、段落、词间距、文字效果&#xff08;对齐、上下标、阴影&#xff09;、背景图、背景渐变、…… 单位pt与px的差别pt是印刷使用的字号单位&#xff0c;不管屏幕分辨率是多少&#xff0c;打印到纸上看起来都是相同的&#xff0c;lot的长度是0.01384英寸…

【STM32+HAL】SDIO+DMA模式读写SD卡

一、准备工作 有关CUBEMX的初始化配置&#xff0c;参见我的另一篇blog&#xff1a;【STM32HAL】CUBEMX初始化配置 二、所用工具 1、芯片&#xff1a; STM32F407ZGT6 2、IDE&#xff1a; MDK-Keil软件 3、库文件&#xff1a;STM32F4xxHAL库 三、实现功能 实现用SDIODMA读写S…

Python网络编程:从基础到实践

Python 是一种广泛应用于网络编程的高级编程语言&#xff0c;它简单易学&#xff0c;功能强大&#xff0c;深受广大开发者的喜爱。本文将带你深入了解 Python 网络编程的基础知识&#xff0c;并通过实际案例&#xff0c;让你掌握如何使用 Python 进行网络编程。 第一部分&…

05_机器学习赛事_优惠券使用预测

1. 函数库导入 # import libraries necessary for this project import os, sys, pickleimport numpy as np import pandas as pdimport matplotlib.pyplot as plt import matplotlib.dates as mdatesimport seaborn as sns import datetime as dtfrom datetime import datefr…

如何删除BigKey

③第三方工具 利用第三方工具&#xff0c;如 Redis-Rdb-Tools 分析RDB快照文件&#xff0c;全面分析内存使用情况https://github.com/sripathikrishnan/redis-rdb-tools ④网络监控 自定义工具&#xff0c;监控进出Redis的网络数据&#xff0c;超出预警值时主动告警一般阿里…

MVCC如何根据read view结合行数据的undo log版本链过滤数据的?

先明确定义 行数据的最新undo log事务id 按顺序判断 比最小的小&#xff0c;一定读:行数据的最新undo log事务id比min_trx_id还小&#xff0c;说明这个产生这条undo log的事务在read view产生时刻已经被提交了。 如果行数据的最新undo log事务id和当前事务id相等&#xff0…

拼多多新店和老店哪个好做

拼多多新店和老店哪个好做 拼多多推广可以使用3an推客。3an推客&#xff08;CPS模式&#xff09;给商家提供的营销工具&#xff0c;由商家自主设置佣金比例&#xff0c;激励推广者去帮助商家推广商品链接&#xff0c;按最终有效交易金额支付佣金&#xff0c;不成交不扣费。是商…

Python基础学习之数据结构

在编程的世界里&#xff0c;数据结构是构建高效程序的关键基石。Python作为一种功能强大的编程语言&#xff0c;提供了多种内置的数据结构&#xff0c;使得我们能够以简洁、优雅的方式解决复杂的问题。在本文中&#xff0c;我们将深入探讨Python中几种常见的数据结构。 一、列…

php利用阿里云短信SDK实现短信发送功能

当使用PHP结合阿里云短信服务SDK来实现短信验证码登录时&#xff0c;你需要遵循以下步骤&#xff1a; 1. 注册阿里云账号并开通短信服务 首先&#xff0c;你需要有一个阿里云账号&#xff0c;并在阿里云控制台中开通短信服务&#xff08;Dysmsapi&#xff09;。 2. 获取Acce…

34.Docker基本操作

镜像相关的命令 镜像名称分为两部分组成&#xff1a;[repository]:[tag],tag就是镜像的版本。如果tag没有指定默认就是latest,表示最新版本的镜像。 查看docker命令的帮助信息 docker --help 具体某条命令的帮助信息 docker images --help 案例一&#xff1a;从DockerHub中…

5G赋能 扬帆未来|AGV无人仓成黑科技“顶流”

AGV 近年来&#xff0c;无人化这个概念逐渐被运用到了社会中的各个行业&#xff0c;而跟物流有关的就有无人分拣机器人、无人驾驶卡车、和无人叉车&#xff0c;越来越多的新装备也开始投入到实际运用中。 仓储管理在物流管理中占据着核心地位。传统的仓储管理中存在诸多的弊端…

发卡盗u源码系统搭建ZHU

2024最新UI发卡盗U/支持多语言/更新UI界面/支持多个主流钱包去除后门板&#xff0c;最好是部署智能合约后用合约地址来授权包含转账支付页面盗U授权源码。 完美提U&#xff0c;教程包含如何提u 。功能完美。 1.Php静态 2.目录puicta 3.扩sal 4.ssl不强https

SQL数据库

一.什么是数据库 数据库&#xff1a;存储数据的仓库&#xff0c;数据是有组织的进行存储。&#xff08;database 简称DB&#xff09; 数据库管理系统&#xff1a;管理数据库的大型软禁&#xff08;DataBase Management System 简称DBMS&#xff09; SQL&#xff1a;操作关系…

flutter-解决AppBar背景色为白色带滚动时不生效的bug

作为初学flutter的小白来说&#xff0c;今天在模仿小米商城app的首页appbar的时候&#xff0c;遇到一个奇怪的问题&#xff0c;就是修改AppBar的backgroundColor,在首页上拉滚动时&#xff0c;设置的白色背景色不生效&#xff0c;背景色变成不是淡灰色&#xff0c;其他深色不影…

Golang | Leetcode Golang题解之第63题不同路径II

题目&#xff1a; 题解&#xff1a; func uniquePathsWithObstacles(obstacleGrid [][]int) int {n, m : len(obstacleGrid), len(obstacleGrid[0])f : make([]int, m)if obstacleGrid[0][0] 0 {f[0] 1}for i : 0; i < n; i {for j : 0; j < m; j {if obstacleGrid[i]…

《读懂财务报表》手绘版读书笔记:通过报表找好公司

通过财报的三张表判断好公司&#xff1a; 然后是在三表中&#xff0c;计算各个项目占总体的比例&#xff0c;以及做比率分析&#xff0c; 比率分析&#xff0c;从偿还能力&#xff0c;运营能力&#xff0c;盈利能力三方面分析&#xff1a; 1&#xff09; 偿还能力 2&#xff09…