GH1995 / articles

blog
https://gh1995.github.io
2 stars 0 forks source link

Flask Web 开发(1) #2

Open GH1995 opened 4 years ago

GH1995 commented 4 years ago

安装

image image

GH1995 commented 4 years ago

应用的基本结构

初始化

image

路由和视图函数

处理 URL 和函数之间关系的程序称为路由

image

Flask 还支持一种更传统的方式:使用 app.add_url_ rule() 方法。这个方法最简单的形式接受 3 个参数:URL、端点名和视图函数。下述示例使用 app.add_url_rule() 方法注册 index() 函数,其作用与前例相同:

image

image

一个完整的应用

image

Web开发服务器

image

image

动态路由

image image

调试模式

Flask 应用可以在调试模式中运行。在这个模式下,开发服务器默认会加载两个便利的工 具:重载器调试器

启用重载器后,Flask 会监视项目中的所有源码文件,发现变动时自动重启服务器。

调试器是一个基于 Web 的工具,当应用抛出未处理的异常时,它会出现在浏览器中。

image

image

命令行选项

image

请求–响应循环

应用和请求上下文

请求对象就是一个很好的例子,它封装了客户端发送的 HTTP 请求。

image

image

Flask 在分派请求之前激活(或推送)应用和请求上下文,请求处理完成后再将其删除。

请求分派

url_map是 URL 和视图函数之间的对应关系。

Flask 使用 app.route 装饰器或者作用相同的 app.add_url_rule() 方法构建映射。

image

请求对象

image image

请求钩子

在请求钩子函数和视图函数之间共享数据一般使用上下文全局变量 g

响应

image

image

image

image

GH1995 commented 4 years ago

模板

Jinja2模板引擎

image

渲染模板 默认情况下,Flask 在应用目录中的 templates 子目录里寻找模板。

image image

{{ name }} {{ mydict[''key] }} image image

image image image image image image 模板继承 Jinja2 使用 blockendblock 指令在base.html中定义内容区块。 image

使用Flask-Bootstrap集成Bootstrap

image image

navbar 区块使用 Bootstrap 组件定义了一个简单的导航栏。content 区块中 有个 <div> 容器,其中包含一个页头。 image image

自定义错误页面

image image

链接

在模板中直接编写简单路由的 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

静态文件

image

使用Flask-Moment本地化日期和时间

image image image image

GH1995 commented 4 years ago

Web 表单

Flask 请求对象包含客户端在请求中发送 的全部信息,对包含表单数据的 POST 请求来说,用户填写的信息通过 request.form 访问。

配置

image Flask-WTF 之所以要求应用配置一个密钥,是为了防止表单遭到跨站请求伪造(CSRF, cross-site request forgery)攻击。

表单类

image

把表单渲染成HTML

wtf.quick_form() 函数的参数为 Flask-WTF 表单对象,使用 Bootstrap 的 默认样式渲染传入的表单。

image

在视图函数中处理表单

image

重定向和用户会话

image

闪现消息

用户提交有一项错误的登录表单后,服务器发回的响应重新渲染登 录表单,并在表单上面显示一个消息,提示用户名或密码无效。 image image

GH1995 commented 4 years ago

数据库

使用Flask-SQLAlchemy管理数据库

image 文档还建议把 SQLALCHEMY_TRACK_MODIFICATIONS 键设为 False,以便在 不需要跟踪对象变化时降低内存消耗。 image image

定义模型

image

关系

image 一端 db.relationship() 的第一个参数表明这个关系的另一端是哪个模型。db.relationship() 中的 backref参数向 User 模型中添加一个role 属性,从而定义反向关系。 多端 db.ForeignKey()的参数'roles.id'

数据库操作

db.create_all() 函数将寻找所有 db.Model 的子类,然后在数据库中创建对应的表。 image image image image

在视图函数中操作数据库

image image image

集成Python shell

image

使用Flask-Migrate实现数据库迁移

image image image image

GH1995 commented 4 years ago

电子邮件

image image image image image image image image image

GH1995 commented 4 years ago

大型应用的结构

项目结构

image

image

配置选项

image image

使用应用工厂函数

在单个文件中开发应用是很方便,但却有个很大的缺点:应用在全局作用域中创建,无法 动态修改配置。运行脚本时,应用实例已经创建,再修改配置为时已晚。这一点对单元测 试尤其重要,因为有时为了提高测试覆盖度,必须在不同的配置下运行应用。 image Flask app.config 配置对象提供的 from_object() 方法直接导入应 用。至于配置对象,则可以通过名称从 config 字典中选择。

在蓝本中实现应用功能

在蓝本中定义的路由和错误处理程序处于休眠状态,直 到蓝本注册到应用上之后,它们才真正成为应用的一部分。使用位于全局作用域中的蓝本 时,定义路由和错误处理程序的方法几乎与单脚本应用一样。

image image image image 在蓝本中编写错误处理程序稍有不同,如果使用 errorhandler 装饰器,那么只有蓝本中的 错误才能触发处理程序。要想注册应用全局的错误处理程序,必须使用 app_errorhandler 装饰器。 image

应用脚本

image

单元测试

image

image image