1. 高级用户自定义
Flask 提供大量的类,也就是说,你可以通过继承官方提供的各种类,打造一个高度自定义的 Flask , 如下所示:
代码语言:txt复制# 自定义 Request, Flask,
from flask import Flask, Request
from werkzeug.datastructures import ImmutableOrderedMultiDict
class MyRequest(Request):
"""Request subclass to override request parameter storage"""
parameter_storage_class = ImmutableOrderedMultiDict
class MyFlask(Flask):
"""Flask subclass using the custom request class"""
request_class = MyRequest
除此之外,你还可以自定义异常,并且统一响应格式。(这部分太简单,不写了)
2. Mirco - small is good!
Flask 的设计思想核心是"micro"(微), 微不是功能少能力低,而是为了保持核心简单而又可扩展。
这非常贴近现代软件工程推崇尽量高内聚低耦合的组件化思想。
如何表现:
- Flask 并不强制决定你所使用的模板引擎, 数据库,但提供默认支持,一切由你做主
- 大部分的中间件,类和方法都很简单,并且非常便于继承、重新包装、派生
- 和 Django 不一样,Flask 本身仅提供开发生产所需要的基本功能。得益于社区强壮,你可以找到海量的 Flask 插件来解决各种常用常用业务需求(比如 Flask-Session, Flask-Migrate, Flask-sqlalchemy 等),如果你对这些插件都不满意,你还能参考它们自己写一个,也为开源社区做贡献。
3. 使用 URL 处理器
由于“永远不要信任用户输入”,所以 web 开发总离不开表单校验。
很多初级程序员喜欢复制粘贴, 但是进阶的程序员都会把表单校验统一处理。
那么怎样可以把这些脏活处理得更优美呢?
可以参考使用 Flask 的 URL 处理器 。
示例代码如下:
代码语言:txt复制from flask import Flask, g
app = Flask(__name__)
@app.route('/<lang_code>/')
def index(lang_code):
g.lang_code = lang_code
...
@app.route('/<lang_code>/about')
def about(lang_code):
g.lang_code = lang_code
...
以上示例中出现重复 g.lang_code = lang_code
, (通常现实中重复代码比这严重多了)
使用 Flask 提供 url_value_preprocessor
可以解决这个问题,如下:
@app.url_value_preprocessor
def g_lang_code(endpoint, values):
g.lang_code = values.get('lang_code', None)
refer: https://dormousehole.readthedocs.io/en/latest/index.html