Open GH1995 opened 4 years ago
处理 URL 和函数之间关系的程序称为路由。
Flask 还支持一种更传统的方式:使用 app.add_url_ rule()
方法。这个方法最简单的形式接受 3 个参数:URL、端点名和视图函数。下述示例使用 app.add_url_rule()
方法注册 index()
函数,其作用与前例相同:
Flask 应用可以在调试模式中运行。在这个模式下,开发服务器默认会加载两个便利的工 具:重载器和调试器。
启用重载器后,Flask 会监视项目中的所有源码文件,发现变动时自动重启服务器。
调试器是一个基于 Web 的工具,当应用抛出未处理的异常时,它会出现在浏览器中。
请求对象就是一个很好的例子,它封装了客户端发送的 HTTP 请求。
Flask 在分派请求之前激活(或推送)应用和请求上下文,请求处理完成后再将其删除。
url_map
是 URL 和视图函数之间的对应关系。
Flask 使用 app.route
装饰器或者作用相同的 app.add_url_rule()
方法构建映射。
before_request
before_first_request
after_request
teardown_request
注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行。在请求钩子函数和视图函数之间共享数据一般使用上下文全局变量 g
。
渲染模板
默认情况下,Flask 在应用目录中的 templates
子目录里寻找模板。
{{ name }}
{{ mydict[''key] }}
模板继承
Jinja2 使用 block
和 endblock
指令在base.html
中定义内容区块。
navbar
区块使用 Bootstrap 组件定义了一个简单的导航栏。content
区块中 有个 <div>
容器,其中包含一个页头。
在模板中直接编写简单路由的 URL 链接不难,但对于包含可变部分的动态路由,在模板 中构建正确的 URL 就很困难了。而且,直接编写 URL 会对代码中定义的路由产生不必要 的依赖关系。如果重新定义路由,模板中的链接可能会失效。
为了避免这些问题,Flask 提供了 url_for()
辅助函数,它使用应用的 URL 映射中保存的 信息生成 URL。
url_for()
函数最简单的用法是以视图函数名(或者 app.add_url_route()
定义路由时 使用的端点名)作为参数,返回对应的 URL。
使用 url_for()
生成动态URL时,将动态部分作为关键字参数传入。例如,url_for('user', name='john', _external=True)
的返回结果是 http://localhost:5000/user/john
。
Flask 请求对象包含客户端在请求中发送 的全部信息,对包含表单数据的 POST
请求来说,用户填写的信息通过 request.form
访问。
Flask-WTF 之所以要求应用配置一个密钥,是为了防止表单遭到跨站请求伪造(CSRF, cross-site request forgery)攻击。
wtf.quick_form()
函数的参数为 Flask-WTF 表单对象,使用 Bootstrap 的 默认样式渲染传入的表单。
用户提交有一项错误的登录表单后,服务器发回的响应重新渲染登 录表单,并在表单上面显示一个消息,提示用户名或密码无效。
文档还建议把 SQLALCHEMY_TRACK_MODIFICATIONS 键设为 False,以便在 不需要跟踪对象变化时降低内存消耗。
一端
db.relationship()
的第一个参数表明这个关系的另一端是哪个模型。db.relationship()
中的 backref
参数向 User
模型中添加一个role
属性,从而定义反向关系。
多端
db.ForeignKey()
的参数'roles.id'
db.create_all()
函数将寻找所有 db.Model
的子类,然后在数据库中创建对应的表。
在单个文件中开发应用是很方便,但却有个很大的缺点:应用在全局作用域中创建,无法 动态修改配置。运行脚本时,应用实例已经创建,再修改配置为时已晚。这一点对单元测 试尤其重要,因为有时为了提高测试覆盖度,必须在不同的配置下运行应用。
Flask app.config
配置对象提供的 from_object()
方法直接导入应 用。至于配置对象,则可以通过名称从 config
字典中选择。
在蓝本中定义的路由和错误处理程序处于休眠状态,直 到蓝本注册到应用上之后,它们才真正成为应用的一部分。使用位于全局作用域中的蓝本 时,定义路由和错误处理程序的方法几乎与单脚本应用一样。
在蓝本中编写错误处理程序稍有不同,如果使用 errorhandler
装饰器,那么只有蓝本中的 错误才能触发处理程序。要想注册应用全局的错误处理程序,必须使用 app_errorhandler
装饰器。
安装