Flask Web 开发学习稿(一)

好久没有更新过了,把这些日子搞的东西先放一波出来
这个学习笔记未必会包含全部章节,有时会将两个章节进行合并

第一章 安装

1.1 使用虚拟环境

虚拟环境是 Python 解释器的一个私有副本,可以安装私有包而不影响全局 Python 解释器

Python 3.3 通过 venv 模块原生支持虚拟环境,命令为 pyvenv 。不过在 Python 3.3 中使用 pyvenv 命令创建的虚拟环境不包含 pip ,在 Python 3.4 中改进了这一缺陷。

我这边使用 Python 3.5.0 和 Pycharm 来进行学习,所以暂时不使用这个,Pycharm 可以很好的解决各个项目的版本的虚拟环境问题。

1.2 使用 pip 安装 Python 包

使用 (venv) $ pip install flask 可以在虚拟环境中安装 Flask

第二章 程序的基本结构

2.1 初始化

Web 服务器使用一种名为 Web 服务器网关接口的协议,把接收自客户端的所有请求都转交给这个对象处理
Flask 类的构造函数只有一个必须指定的参数,即程序主模块或包的名字。Flask 用这个参数决定程序的根目录,以便找到相对于程序根目录的资源文件位置。在大多数程序中,Python 的 __name__ 变量就是所需的值。

2.2 路由和视图函数

程序实例保存了一个 URL 到 Python 函数的映射关系,处理 URL 和函数之间关系的程序成为路由。
Flask 中定义路由最简单的方式是使用程序提供的 app.route 修饰器,把修饰的函数注册为路由。

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

修饰器是 Python 语言的标准特性,可以使用不同的方式修改函数的行为

把 index 函数注册为程序跟地址的处理程序,不过在 Pthon 代码中嵌入响应字符串会导致代码难以维护,以后将会介绍生成响应的正确方法。像 index 这样的函数称为视图函数。
地址中也可以包含可变部分,可以在路由中定义可变的这部分

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

尖括号中的内容是动态部分,任何能匹配静态部分的 URL 都会映射到这个路由上。

2.3 - 2.4 启动服务器

用 run 方法来启动 Flask 集成的开发 Web 服务器

from flask import Flask
app = Flask(__name__)


@app.route('/')


def index():
    return '<h1>Hello World!</h1>'


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

使用__name__ == '__main__'是 Python 的惯用法,确保直接执行此脚本时才启动服务器,若其他程序调用该脚本可能父级程序会启动不同的服务器,就不执行 app.run 了
在 Pycharm 中启动后,可以看到 Flask 为我们启动了一个调试实例
1.png
通过浏览器访问,可以发现已经成功的访问了,而且调试器中也记录下了这次访问
这里写图片描述
我们可以和前面的动态部分结合起来,变成一个根据不同地址显示不同页面的服务,可以看到服务器已经记录下了两次访问,其中一次使用路径进来,响应中也带有相应信息,表示已经成功
这里写图片描述
这里写图片描述

2.5 请求-响应循环

2.5.1 程序和请求上下文

为了避免在需要使用访问对象时,都将其作为参数传入。Flask 使用上下文临时把某些对象变为全局可访问

from flask import Flask
from flask import request

app = Flask(__name__)

@app.route('/')


def index():
    user_agent = request.headers.get('User-Agent')
    return '<p>Your Browser is %s!</p>' % user_agent


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

这里写图片描述
在这个视图函数中,我们把 request 当作全局变量使用,事实上 request 不可能是全局变量,而 Flask 使用上下文让特定的变量在一个线程中全局可访问,与此同时还不会干扰其他线程。

线程是可单独管理的最小指令集,多线程 Web 服务器会创建一个线程池
再从线程池中选择一个线程用于处理接收到的请求

在 Flask 中有两种上下文:程序上下文和请求上下文,这两种上下文提供的变量如下:

变量名 上下文 说明
current_app 程序上下文 当前激活程序的程序实例
g 程序上下文 处理请求时用作临时存储的对象,每次请求都会重设这个变量
request 请求上下文 请求对象,封装了客户端发出的 HTTP 请求中的内容
session 请求上下文 用户绘画,用户存储请求之间需要“记住”的值的字典

Flask 会在分发请求之前激活程序和请求上下文,请求处理完成后再将其删除

2.5.2 请求调度

Flask 使用 app.route 修饰器或者非修饰器形式的 app.add_url_rule() 生成映射
想要查看 Flask 程序中的 URL 映射是什么样子,我们可以在 Python Shell 中检查为 hello》py 生成的映射

from hello import app
app.url_map
2.5.3 请求钩子

有时在处理请求之前或者之后执行代码会很有用,Flask 提供了注册通用函数的功能,注册的函数可在请求被分发到视图函数之前或之后调用。请求钩子使用修饰器实现。Flask 支持以下四种钩子:

钩子名 上下文
before_first_request 注册一个函数,在处理第一个请求之前运行
before_request 注册一个函数,在每次请求之前运行
after_request 注册一个函数,如果没有未处理的异常抛出,在每次请求后运行
teardown_request 注册一个函数,即使有未处理的异常抛出,也在每次请求后运行

Flask 会在分发请求之前激活程序和请求上下文,请求处理完成后再将其删除
在请求钩子函数和视图函数之间共享数据一般使用上下文全局变量g

2.5.4 响应

Flask 调用视图函数后,会将其返回值作为响应的内容。如果视图函数返回的响应需要使用不同的状态码,那么可以把数字代码作为第二个返回值,添加到响应文本之后。

from flask import Flask
from flask import request

app = Flask(__name__)

@app.route('/')


def index():
    return '<p>Bad Request !</p>', 400


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

可以看到浏览器中直接显示了 HTPP 400 错误。视图函数返回的响应还可以接受第三个参数,这是一个由首部组成的字典,可以添加到 HTTP 响应中。
如果不想返回由多个值组成的元组,Flask 视图函数还可以返回 Response 对象。make_response() 函数可接受1/2/3个参数,并返回一个 Response 对象。

from flask import Flask
from flask import make_response
from flask import redirect

app = Flask(__name__)

@app.route('/')


def index():
    response = make_response('<h1>This document carries a cookie!</h1>')
    response.set_cookie('answer', '42')
    return response


@app.route('/<name>')


def user(name):
    return redirect('http://www.baidu.com')


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

可以看到,已经被设置好了 Cookie
这里写图片描述
如果在地址中访问/txb则会被重定向到百度去
还有一种特殊的响应由 abort 函数生成,用于错误处理

from flask import Flask
  • 5
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值