Flask核心知识点速览:路由、模板与表单处理
本文总结了Flask开发中的关键知识点,涵盖路由装饰器的灵活使用、蓝本(Blueprint)对app对象的引用、Jinja2模板的继承与宏机制,以及表单提交中的POST请求重定向和数据库会话管理。旨在帮助开发者快速掌握Flask基础并避免常见陷阱。
博客已有一段时间未更新,近期主要投入于Flask的学习。尽管常有人提及Flask易于上手,但在初学阶段仍会感到一定的挑战,目前看来其核心逻辑确实清晰易懂。
在深入学习过程中,查阅了大量资料并梳理了诸多细节。今日将这些经验进行系统总结,既是为了验证学习成果,避免“学了却无所得”的错觉,也是为了方便日后查阅,防止知识遗忘。
Flask路由与装饰器详解
一、关于装饰器与路由机制
初次接触时,这一机制显得颇为神奇,往往只能机械地模仿代码,难以独立构思和应用。
@app.route('/')
def hello():
print('hello')
需注意:1. 只有@符号是固定的语法要求,app变量名可自定义,这涉及蓝本(Blueprint)的定义;当使用蓝本时,导入及装饰时的app需替换为蓝本实例名。2. @符号下方的def即为被装饰的函数,其具体行为与route参数紧密相关。3. '/'路径看似简单,实际应用中可动态扩展,如添加/post、/login等。在涉及用户登录场景时,路径还可演变为/post/<name>,具体实现留作思考,难度适中。
2. @下方的def即为被装饰的函数,其具体行为与route参数紧密相关。
3. '/'路径看似简单,实际应用中可动态扩展,如添加/post、/login等。在涉及用户登录场景时,路径还可演变为/post/<name>,具体实现留作思考,难度适中。
Jinja2模板继承与包含机制
二、模板引擎应用
1. 在子模板开头使用{% extends 'xx' %}声明继承关系。随后,子模板中由{% block block_name %}和{% endblock %}包裹的代码块,将替换父模板中同名block包裹的部分。
2. 若希望父模板中的块内容不被子模板完全替换,可使用{{ super() }}保留原有内容。
3. 块内语句的作用域:默认情况下,块内无法访问块外的变量。若需在块内访问外部变量,需在父模板的block声明处添加scoped关键字。
4. 宏定义:{% macro macro_name() %}{% endmacro %},其功能类似于函数封装。
5. 模板包含:使用{% include %}语句。其作用是将另一个模板加载并直接渲染在当前模板位置。这与import不同,import后需调用宏来渲染内容;而include直接渲染整个模板文件,不分块处理。
表单处理与数据库会话管理
三、表单与数据库交互
此处存在较多易错点,需特别注意。
1. 表单提交多采用POST方法。若最后一个请求是包含表单数据的POST请求,直接刷新页面会导致表单重复提交,例如重复下订单。因此,应避免让POST请求成为页面加载的最后一步。
2. 可使用重定向函数redirect(),常与url_for()配合使用。url_for()的参数通常为被装饰函数的名称,例如main.index。
3. 添加会话数据使用db.session.add(),提交会话变更使用db.session.commit()。
4. 每次修改表单对应的数据库列结构后,务必记得进行相应的更新操作。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













