xml地图|网站地图|网站标签 [设为首页] [加入收藏]

智能家电

当前位置:美高梅游戏网站 > 智能家电 > 《Flask Web Development - 更新到第8章》

《Flask Web Development - 更新到第8章》

来源:http://www.gd-chuangmei.com 作者:美高梅游戏网站 时间:2019-10-03 12:39

深入理解Flask - 2016.pdf

图片 1图片.png

Flask 是在Python 用户中最为流行的Web 开发框架。《深入理解 Flask》从一个简单的Flask 项目入手,由浅入深地探讨了一系列实战问题,包括如何使用SQLAlchemy 和Jinja 等工具进行Web 开发;如何正确地设计扩展性强的Flask 应用架构和搭建MVC 环境;对于各种NoSQL 数据库的特性,何时应该、何时不应该及如何使用它们;通过使用Flask 扩展快速实现用户的身份系统、RESTful API、NoSQL查询、后台管理等功能;如何创建自己的扩展;使用Celery 编写异步任务,使用pytest 进行单元测试等;最后介绍了如何部署上线,包括使用自己搭建的服务器或使用各种云服务,以及如何权衡和选择这些不同的解决方案。

英文版本:Mastering Flask - 2015.pdf

英文第2版:

Mastering Flask Web Development 2nd Edition - 2018.Pdf

图片 2图片.png

本来做了个目录快速跳转的,后来简书不再支持这种写法,无奈阅读只能自己根据章节明ctrl+f/v/enter来定位了 ┑┍

--------------------------目录结构-----------------------

前言

  • Flask框架的特点
  • 本书的组织方式
  • 本书面向的读者
  • 本书的主体结构
  • 如何使用本书的示例代码
    • 获取和检出代码
    • 安装数据库和packages
    • 会用到的Git操作

第1章 Flask框架的安装和配置

  • 轻吹Flask
  • 创建和激活虚拟环境
  • 在虚拟环境下来安装Flask

第2章 Flask应用的基本结构

  • Flask应用的各个部分
    • 初始化应用示例
    • 路由和视图函数
    • 启动Server
  • 完整的示例代码
  • 请求-响应的生命周期
    • 应用与请求的上下文
    • 请求和试图方法的匹配
    • 钩子函数
    • 响应结果
      • 给返回字符串带状态码
      • 显式使用response
      • redirect
      • abort
  • 如何集成Flask的扩展
    • 带命令行选项的Flask-Script

第3章 模板

  • Jinjia2模板引擎
    • 渲染模板
    • 变量类型
    • 控制结构
      • if else
      • for
      • macro
      • 外部导入Macro
      • 模板继承
  • Jinjia2集成Bootstrap
    • 第一步,安装flask-bootstrap
    • 第二步,导入flask-bootstrap
    • 第三步,构建模板覆写父模板
  • 定制错误页面
  • 用url_for来获得路由地址
  • 静态文件
  • 使用Flask-Moment来格式化时间和日期

第4章 表单

  • 跨站点伪装请求 保护
  • 表单类和表单属性
  • 在HTML中渲染表单对象
  • 表单响应
  • 重定向和用户Session
  • 消息提示

第5章 数据库

  • 数据库简介
    • SQL数据库
    • NoSQL数据库
    • 选择SQL还是NoSQL数据库
  • Python数据库工具选择
    • 易用性
    • 性能
    • 可移植性
    • 和Flask集成
  • 使用Flask-SQLAlchemy进行数据库管理
    • Model定义
    • 关系
    • 数据库操作
      • 创建表格
      • 插入数据行
      • 修改数据行
      • 删除数据行
      • 查询数据行
    • 在视图方法中操作数据库
    • Model集成Python Shell
    • 使用Flask-Migrate来做数据库的Migrations
      • 创建迁移的资源库
      • 创建迁移脚本
      • Upgrading数据库

第6章 邮件

  • Flask-Mail的使用
    • 通过Python Shell发送邮件
    • 邮件和应用程序集成
    • 发送异步邮件

第7章 大型应用程序架构

  • 项目结构
  • 配置选项
  • 应用程序包App
    • 使用工厂方法来构建应用示例
      • attach routes and custom error pages here
    • 使用Blueprint来实现应用程实例的功能
  • 启动脚本
  • Requirements文件
  • 单元测试
  • 数据库设置

第8章 用户授权

  • Flask中授权相关的包和扩展
  • 密码安全
    • 使用Werkzeug做密码加密
  • 创建授权的Blueprint
  • 使用Flask-Login来进行用户授权
    • 构建登陆的User Model
    • 保护路由
    • 添加登陆表单
    • 用户登入
    • 用户登出
    • 测试登陆功能
  • 新用户注册
    • 添加注册表单
    • 注册新用户
  • 账号确认
    • 使用itsdangerous来初始化确认的token
    • 发送确认的Email
  • 账号管理
    • 密码修改
    • 密码重置
    • 修改邮箱
  • 发送确认的Email
  • 账号管理
    • 密码修改
    • 密码重置
    • 修改邮箱

--------------------------正文----------------------

  • 其他框架

    大型框架替你做了很多事,同时也限定了你处理问题的方式,比如你只能用一些指定的数据库引擎或者用户授权的方法,要采用其他实现方式会遇到很大的困难。

  • Flask框架

    Flask框架被设计成易于扩展的形式,除了一个强壮的内核,基本上所有的功能都要用第三方的扩展来实现。比如数据库,你可以选择NoSQL数据库、可以选择自己开发的数据库,甚至不用数据库。其他的扩展也是如此,你可以任意选择或者自己开发。

    :上述说的Flask的好处,你也从另一个方面来理解,使用大型框架比如Django来做一些快速的开发、常规的解决方案会很方便,而使用Flask意味着什么你都要自己去挑选,这对于开发经验尚且欠缺的人来说是个灾难。

本书展现了使用Flask开发一个Web应用的流程,当然这只是作者推荐的一种方式。

其他的教材通常是把相关的示例程序提供给你,然后要你自己你集成在一起。本书作者采用了一种不同的方式,本书从一个小例子开始介绍用Flask开发涉及的知识,然后逐渐把它扩展成一个功能完善的博客社交应用。

  • 你应该具有一些Python的编码经验

    虽然本书不要求有Flask开发经验,但是很多Python概念会被涉及,比如:包、模块、方法、decorators和面向对象编程。此外,如果熟悉异常、知道如何从stack traces进行错误诊断也会非常有助于学习。注:如果对于本书的示例项目中包的组织方式或者类方法调用不能理解,最好还是学习一些Python知识再往下走,否则容易迷糊。

  • 你最好知道基本的命令行操作

    因为本书很多操作都是在命令行进行的,你最好熟悉基本的像定位到文件夹、执行文件、切入到python shell输入Python脚本,以及使用一些Git的clone和check的操作。

  • 你最好具备基础的前端知识,

    Web应用免不了使用到前端的几项技术,包括HTML、CSS和JavaScript,书中会直接使用它们而不会再详细介绍。

  • 强烈建议你通过克隆项目的方式来学习

    作者把项目发布到了Github上,你可以下载ZIP或TAR包,但是更合理的做法是安装Git客户端到电脑上,然后熟悉基本的Git版本控制的知识。如果你还没接触过Git,强烈推荐你把它作为一个接触和学习Git的机会,后面会有一小节大致介绍如何结合Git使用示例代码。

  • 本书不能告诉你所有Flask开发的知识

    本书尽管涉及到了大多数Flask框架的的特性,但你应该把Official Flask Documentation 作为本书的一个补充。

  • 第一部分,介绍Flask
    • 第1章 Flask框架的安装和配置
    • 第2章 Flask应用程序的基本结构
    • 第3章 模板
  • 第二部分,一个社交博客应用的构建
  • 第三部分,你需要知道的其他知识

获取和检出代码

本书的示例代码可以从

安装好Git客户端以后(如果还没有你可以从

$ git clone https://github.com/miguelgrinberg/flasky.git

如上命令克隆的不只是一份代码,同时也包含了该项目所有的提交记录。所有的代码的提交都有一个tag,并且在这个项目中所有的tag跟章节的顺序是一致的,比如第一章的提交tag是1a, 第五章因为有多次提交所以tag依次是5a、5b等。我们推荐的做法是,导出最老版本的代码进行学习,然后随着学习的推进,切换新版本的代码。如下是一个开始:

$ git checkout 1a

安装数据库和packages

因为检出的项目中只是包含代码,数据库还有一些依赖的库你可能需要单独安装,不过不用担心,执行时候如果未安装会有提示给到我们。

会用到的Git操作

如果了解过Git的基础知识就会知道,我们使用 git checkout 命令的时候,本地目录应该是干净的(没有改动过后未提交的代码)。开发过程中难免会想改一改代码,但是要 checkout 到下一个历史节点的时候记得把你的改动给撤销掉,最简单的做法是使用 git reset 命令:

$ git reset --hard

另外,本书的示例项目flasky的开发者可能因为修复一些bug或者别的原因会改动代码,如果你需要获取到最新的代码以及相应的标签等,你可以执行如下命令来把Github上所有的改动同步过来并覆盖到本地代码(实际上没有太多必要,因为我们知道本书既然出版了作者不大可能把例子改得不利于读者阅读):

$ git fetch --all$ git fetch --tags$ git reset --hard origin/master

一个对学习有帮助的操作是代码比较,你可以使用命令行来比对两次提交之前哪些代码发生了改变:

$ git diff 2a 2b

但是在命令行进行代码的比对可读性不好,你可以直接到Github上查看每次提交的改动,比如2a和2b两次提交的差别可以在这里看到:[ berg/flasky/compare/2a...2b]( berg/flasky/compare/2a...2b) 。

Flask框架很小,但强壮的内核加上丰富的扩展几乎能满足你所有需求。Flask有两个主要的依赖库:Werkzeug和Jinja2,它们都是由Flask核心的开发人员开发的。与其他大型框架不同的是,Flask自身不支持数据库、表单验证、用户授权等复杂的任务,而需要集成其他的扩展,作为一个开发者你需要挑选最合适你项目的扩展。

安装Flask之前你需要安装Python,为了更好的和本书保持一致推荐使用v2.7或者v3.3。

安装Flask的最好的办法是在虚拟环境中进行安装,虚拟环境拥有私有的Python编译器,它和其他项目的环境彼此独立,最重要的是它不会污染全局环境。

可以考虑使用第三方套件virtualenv来安装虚拟环境,Mac OS下可以用如下命令来查看是否安装过virtualenv,如果执行下述命令报错了,那么请先安装virtualenv。注:该笔记的所有命令行操作都是在Mac OS上的,后面不再重复进行说明。

$ virtualenv --version

假如安装过easy_install,可以使用easy_install命令安装virtualenv,否则要先安装easy_install(此处不记录安装细节,遇到问题可以参考该书对应的部分):

$ sudo easy_install virtualenv

前言部分有介绍如何将项目克隆到本地,下面进入到项目文件夹并构建虚拟环境(环境名为venv,可自定义):

$ cd flasky$ virtualenv venvNew python executable in venv/bin/pythonInstalling setuptools, pip...done.

激活虚拟环境(编译器路径被暂时加入到了PATH中):

$ source venv/bin/activate

激活只是对当前的console窗口有效,可以发现激活以后,命令行头部多了 。取消激活可以执行如下命令:

$ source venv/bin/deactivate

Python的多数包都可以用pip进行安装,因为安装virtualenv的过程已经安装了pip,可以使用如下命令直接安装Flask:

 $ pip install flask

再执行如下命令验证Flask是否安装成功:

 $ python>>> import flask>>>

如上如果没有错误信息,基本安装已经完成,可以开始Flask的学习之旅了。

本章将开始熟悉一个最基本的Flask应用的各个部分,并自己动手构建一个Flask Web应用。

初始化应用示例

Web服务器使用WSGI协议(Web Server Gateway Interface protocol)将所有从客户端接收到的请求传递给应用实例,这个应用实例就是一个Flask对象,通常用如下方式进行创建:

from flask importFlask app = Flask

关于Flask中参数的说明:Flask的构造函数只接收一个参数__name__,它会指向该程序片段所在的模块。目前只需要知道使用__name__就够了。

路由和视图函数

路由的作用就是将请求地址和方法关联起来,最简单的做法是通过使用应用程序实例的decorator app.route来定义一个路由:

@app.routedef index(): return '<h1>Hello World!</h1>'

当然相应内容只是一个字符串,对于想构建更复杂的response结构显然还不够,这里只是简单介绍response的概念,具体如何初始化一个更复杂的response会在第三章介绍。

很多路由上是要求能传递参数的,我们可以在路由上是配置动态参数:

@app.route('/user/<name>')def user: return '<h1>Hello, %s!</h1>' % name

在上例中,尖括号中间的内容是动态的,任何匹配了该形式的URL会映射到这个路由上,然后调用对应的视图方法。默认的,传递的参数被当做string处理,当然你也可以指定它们的类型,比如:

@app.route('/user/<int:id>')

启动Server

应用程序实例app有一个run方法用于启动Flask所集成的Web服务器:

if __name__ == '__main__': app.run(debug=True)

上述代码是一个常见的Python语法,if判定条件是为了保证只有该脚本被直接执行的时候才去启动server,因为如果该脚本是被当做模块引入的,那么很可能在其他的脚本中已经启动过server了。启动过后server会一直轮巡检查是否收到有客户端的请求,可以通过Ctrl+C 停止server。run方法有一些可选参数可以配置,比如设置debug=True能够开启调试模式。

Flask提供的Web服务器不是给产品环境用的,关于这部分内容可能要参考第十七章。

在前面的代码片段已经说明了该例子的各个部分,可以把flasky项目直接checkout到Tag为2a的历史节点上执行并查看效果:

Example 2-2. hello.py: Flask application with a dynamic route

from flask import Flaskapp = Flask@app.routedef index(): return '<h1>Hello World!</h1>'if __name__ == '__main__': app.run(debug=True)

在虚拟环境下运行hello.py,然后访问 即可看到Hello World页面。

 $ python hello.py * Running on http://127.0.0.1:5000/ * Restarting with reloader

图片 32-1.png

你也可以尝试传递动态参数给路由,从而显示动态内容,同样你可以checkout到2b的历史节点查看效果。

from flask import Flaskapp = Flask@app.route def index(): return '<h1>Hello World!</h1>'@app.route('/user/<name>')def user: return '<h1>Hello, %s!</h1>' % nameif __name__ == '__main__': app.run(debug=True)

图片 42a.png

在学会了如何构建一个基础应用程序,我们介绍一些原理性的东西帮助你理解Flask框架。

应用与请求的上下文

Flask接受来自客户端的请求的时候需要构建一些对象给视图方法使用,比如request对象。视图方法如何获得请求对象呢,你可以在视图方法中传递一个参数比如def index,这样一来所有的视图方法都会增加一个参数,并且完成一个请求所需要的可能还不止一个request对象。Flask的做法是怎么样的呢? 先来看如下这个例子:

from flask import request@app.routedef index(): user_agent = request.headers.get('User-Agent') return '<p>Your browser is %s</p>' % user_agent

上述例子通过使用contexts来暂时的使得某些对象(这里是request)成为全局的,这意味着你可以直接使用一些对象就好像它们是全局对象一样。实际上上的request对象不可能是全局的,因为在一个多线程服务器中不同的线程所拥有的是来自不同的客户端的不同的请求,在介绍原理之前先来参考一个表格,表格中列举了Flask中的两个contexts:application context和reqeust context,它们各自暴露了一些对变量外部使用:

图片 52b.png

原理是这样的:任何时候一个请求来到Flask就会激活(或者称作pushes)application context和request contexts,当请求结束再销毁它们。这意味着请求到来的时候,你可以在当前线程中获取到current_app和g,类似地reqeust和session也能被获取到。当没有激活的application context或者request context的时候,获取这些变量会报错。

如下示例证明了application context是如何工作的:

>>> from hello import app>>> from flask import current_app>>> current_app.nameTraceback (most recent call last):...RuntimeError: working outside of application context>>> app_ctx = app.app_context()>>> app_ctx.push()>>> current_app.name'hello'>>> app_ctx.pop()

默认直接使用current_app.name是会报错的,直到我们调用了app的app_ctx的push或pop方法改变了current_app的值。注:这里把push和pop当做一个往current_app写入、推出application context的方法,而不要跟常见的数组的操作方法混淆了。

请求和试图方法的匹配

当客户端的请求来到时,我们需要找到对应的service方法来处理它,Flask会通过在URL map中查找当前请求URL来找到对应的service。Flask构建的map的值是由 app.route decorators和等价的nondecorator版本 app.add_url_url 初始的。

我们可以查看一下在hello.py中这个map长什么样:

 $ python>>> from hello import app>>> app.url_mapMap([<Rule '/' (HEAD, OPTIONS, GET) -> index>, <Rule '/static/<filename>' (HEAD, OPTIONS, GET) -> static>, <Rule '/user/<name>' (HEAD, OPTIONS, GET) -> user>])

三个routes中,/ 和 /user/<name> 都是我们通过app.route decorators构建的,/static/<filename>则是Flask加的专门用来获取静态文件的,第三章会介绍更多相关知识。

HEAD, OPTIONS, GET 表示路由的视图方法所处理的请求类型,因此对于完全一样的路由,我们可以定义完全不同的视图方法。 在这里因为HEAD和OPTIONS方法都是Flask自动管理的,因此我们的三个路由都是跟GET类型绑定的 。关于请求类型在第四章会有更多的介绍。

钩子函数

我们通常希望请求前、后可能希望做一些通用的处理,在Flask中可以使用一些钩子函数来达到这个目的,Flask提供了四个钩子函数,含义很好理解:

  • before_first_request
  • before_request
  • after_request
  • teardown_request

钩子函数的一个典型的应用场景是:在第一次请求中通过before_first_request来获取到用户数据存储到Context中,以后请求就可以直接从Context中直接取用户数据了。

响应结果

返回给前台的数据除了可以是一个字符串,还可以携带第二个参数,下例中除了返回字符串还返回了一个400的状态码:

@app.routedef index(): return '<h1>Bad Request</h1>', 400

你甚至还可以添加第三个参数来给response的headers添加一些设置,但是更好的做法是直接返回一个response对象。如下的例子用make_response方法构建了一个response并设置了cookie:

from flask import make_response@app.routedef index(): response = make_response('<h1>This document carries a cookie!</h1>') response.set_cookie('answer', '42') return response

redirect是一种特殊的response,通常带有302状态码,它不包含具体的response内容而是提供一个新的URL给浏览器来加载,redirect在第四章会大量被使用。你能够通过 using a three-value return (:原书内容如此不大理解含义) 或者通过response对象的方式来进行redirect,但是最通用的做法还是使用Flask提供的redirect()方法来构建redirect类型的response:

from flask import redirect@app.routedef index(): return redirect('http://www.example.com')

有一中特殊的response是用abort来生成的,通常被用来做错误处理。如下的例子,当根据动态参数id没有查询到相应的user的时候,会返回404的状态码。尽管abort没有返回结果,但它通过raise exception的方式跳出了处理的流程:

from flask import abort@app.route('/user/<id>')def get_user: user = load_user if not user: abort return '<p>Hello, %s</p>' % user.name

Flask有大量的可用于不同目的的扩展可以使用,如果这些不能满足需求,你还能找任何可用的Python包。为了演示如何在应用程序中集成扩展,如下的部分会为hello.py添加一个扩展,使应用程序能携带命令行参数。

带命令行选项的Flask-Script

Flask的Web Server启动时候有一些参数是可以配置的,我们可以在app.run中传入这些参数,假如我们不想改代码,只想在命令行执行的时候指定这些参数呢?该部分会介绍如何使用Flask-Script用于加强命令行的功能,使命令行能携带参数。

  • 第一步,使用pip安装该扩展:

$ pip install flask-script

- 第二步,基于hello.py修改代码: ``` from flask import Flask from flask.ext.script import Manager app = Flask manager = Manager @app.route def index(): return '<h1>Hello World!</h1>' if __name__ == '__main__': manager.run() ``` 所有的扩展都在flask.ext模块下,我们要导入的Flask-Script是从flask.ext.script模块导入,导入后名为Manager的class可以被使用。几乎所有拓展的初始化形式都是类似的:通过把Flask实例传递给模块的构造函数。当manager.run执行的时候,命令行扩展的逻辑已经被注入了。你可以checkout到2c的历史节点来查看该部分代码。- 第三步,命令行执行: ```  $ python hello.py usage: hello.py [-?] {shell,runserver} ... positional arguments: {shell,runserver} shell Runs a Python shell inside Flask application context. runserver Runs the Flask development server i.e. app.run() optional arguments: -?, --help show this help message and exit

如上,必选参数为runserver和shell, 这里我们要做的是启动Server。要查看runserver有哪些参数,可以如下方式:``` $ python hello.py runserver --helpusage: hello.py runserver [-h] [-t HOST] [-p PORT] [--threaded] [--processes PROCESSES] [--passthrough-errors] [-d] [-r]Runs the Flask development server i.e. app.run() optional arguments: -h, --help -t HOST, --host HOST -p PORT, --port PORT --threaded --processes PROCESSES --passthrough-errors -d, --no-debug -r, --no-reload

 现在能够基于命令行直接设置server的host和port等参数了,可以将主机地址设置为0.0.0.0看看: ```  $ python hello.py runserver --host 0.0.0.0 * Running on http://0.0.0.0:5000/ * Restarting with reloader

视图方法有两个作用:处理业务逻辑和 返回响应内容。模板起到了将两者分开管理的作用,本章介绍模板引擎Jinjia2。

模板只是一些包含文本的字符串,设置的变量标记位最终会被模板引擎用数据渲染。要使用Jinjia2模板,第一步是定义模板,Jinjia2默然会到项目的子目录templates中寻找模板,所以在该目录下定义两个模板文件:

Example 3-1. templates/index.html: Jinja2 template:

<h1>Hello World!</h1>

Example 3-2. templates/user.html: Jinja2 template

<h1>Hello {{name}}!</h1>

本文由美高梅游戏网站发布于智能家电,转载请注明出处:《Flask Web Development - 更新到第8章》

关键词:

上一篇:搭建 Android 混编框架(1)

下一篇:没有了