开发前所做准备:
创建虚拟环境:
Ubuntu用户使用如下命令进行安装:
$ sudo apt-get install python-virtualenv
Mac OS X系统:
$ sudo easy_install virtualenv
如果你使用微软的Windows系统或其他没有官方virtualenv包的操作系统,那么安装过程要稍微复杂一点,在浏览器中输入网址https://bitbucket.org/pypa/setuptools,回车后会进入setuptools安装程序的主页。在这个页面中找到下载安装脚本链接,脚本名为ez_setup.py。把这个文件保存到电脑的一个临时文件夹中,然后在这个文件夹中执行以下命令:
$ python ez_setup.py
$ easy_install virtualenv
(上述命令必须以具有管理员权限的用户身份执行,在微软Windows系统中,请使用“以管理员身份运行”选项打开命令行窗口,在基于Unix的系统中,要在上面两个命令前面加上sudo,或者以根用户身份执行)
在当前项目所在文件夹中创建虚拟环境,一般虚拟环境会被命名为venv:
$ virtualenv venv
现在,在项目文件夹中就有了一个venv的子文件夹,它保存一个全新的虚拟环境,其中有一个私有的Python解释器,在使用这个虚拟环境之前,你必须将它激活
Linux和Mac OS X用户,激活命令如下:
$ source venv/bin/activate
微软Windows激活命令如下:
$ venvScriptsactive
退出虚拟环境:
deactivate
程序的基本结构:
初始化:
说明:所有Flask程序必须创建一个程序实例,把收到的客户端的请求转交给这个程序实例处理。
Flask类的构造函数只有一个必须指定的参数,即__name__,那么这个__name__是什么意思呢?Flask的这个参数__name__决定程序的根目录,以便稍后能够找到相对于程序根目录的资源文件位置。
关于动态请求地址:
我们经常会遇到这种请求地址:http://www.baidu.com/<name>
路由函数如下:
那么下面这URL函数是什么意思呢?
上面这个URL的意思为:路由中的动态部分默认使用字符串,把id转换成整数类型。
启动服务器:
__name__ =='__main__' 是python的惯用方法,在这里确保直接执行这个脚本时才启动开发Web服务器。如果这个脚本由其他脚本引入,程序假定父级脚本会启动不同的服务器,因此不会执行app.run(). 加debug=True简便理解:每当程序代码修改后,它会自动启动。
程序和请求上下文:
Flask从客户端收到请求时,要让视图函数能访问一些对象,这样才能处理请求。请求对象就是一个很好的例子,它封装了客户端发送的HTTP请求。
Flask中使用请求上下文让视图函数可以访问请求中的对象,Flask使用上下文让特定的变量在一个线程中全局可访问,与此同时却不会干扰其他线程。
在Flask中有两种上下文,程序上下文和请求上下文:
变量名 上下文 说明
current_app 程序上下文 当前激活程序的程序实例
g 程序上下文 处理请求时用作临时存储的对象,每次请求都会重设这个变量
request 请求上下文 请求对象,封装了客户端发出的HTTP请求中的内容
session 请求上下文 用户会话,用于存储请求之间需要“记住”的值的词典
Flask在分发请求之前激活(或推送)程序和请求上下文,请求处理完成后再将其删除。
在这个例子中,没激活程序上下文之前就调用current_app.name会导致报错,但推送完上下文之后就可以调用了。注意,在程序实例上调用app.app_context()可获得一个程序上下文。
请求钩子:
请求钩子使用装饰器实现:
before_first_request:注册一个函数,在处理第一个请求之前运行。
before_request:注册一个函数,在每次请求之前运行。
after_request:注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行
teardown_request:注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行。
在请求钩子函数和视图函数之间共享数据一般使用上下文全局变量g。例如,before_request处理程序可以从数据库中加载已登录用户,并将其保存到g.user中,随后调用视图函数时,视图函数再使用g.user获取用户。
Flask web开发第八章总结:
Flask-Login:管理已经登录用户的用户会话
Werkzeug:计算密码散列值并进行核对
itsdangerous:生成并核对加密安全令牌
若想保证数据库中用户密码的安全,关键在于不能存储密码本身,而要存储密码的散列值。计算密码散列值的函数接收密码密码作为输入,使用一种或多种加密算法进行转换密码,最终得到一个和原始密码没有关系的字符序列,核对密码时,密码散列值可代替原密码,因为计算散列值的函数是可复现的:只要输入一样,结果就一样。
Flask-Login认证用户:
Flask-Login是个非常有用的小型扩展,专门用来管理用户认证系统中的认证状态,且不依赖特定的认证机制。
使用Flask-Login扩展,必须实现几个方法:
is_authenticated() 如果用户已经登录,必须返回True,否则返回False
is_active() 如果允许用户登录,必须返回true,否则返回False
is_anonymous() 对普通用户必须返回False
get_id() 必须返回用户的唯一标识符,使用Unicode编码字符串