Flask 进阶学习技巧一

2019-10-10 10:31:14 浏览数 (1)

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 可以解决这个问题,如下:

代码语言:txt复制
@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

0 人点赞