《flask web开发》俗称狗书,当时学习的时候一路坑,由于模块版本的更新,很多模块的使用都出现了问题,并且短短的100多页完成博客的基本功能,作者在很多模块功能的说明上并没有详细说明,想着写篇文章针对一些知识点详细说明。
flask的第一章介绍了虚拟环境virtualenv安装和github上拷代码来查看作者的每章代码,但是刚学会python基本语法的同学往往一脸懵逼,虚拟环境的安装这里就不介绍了,基本按着书上的来就行,如果出现异常,百度下virtualenv的安装基本问题不大。这边重点介绍下github的使用。
github是程序员必备的技巧,这边推介我写的教程:github新手进阶教程。如果暂时不想了解,就想快速使用,那这边简单介绍下如何拷贝代码到本地。首先得下一个git指令,这边网址附上:
Mac:https://sourceforge.net/projects/git-osx-installer/
Windows:https://git-for-windows.github.io/
Linux:apt-get install git
按照教程,可以在任意位置创建一个文件夹(我这边在桌面创建flask文件夹),然后打开终端进入当前文件夹,依次输入:
git clone https://github.com/miguelgrinberg/flasky.git # (从作者的github上克隆(相当于复制)flasky项目到本地)
cd flasky #进入flasky文件夹
git checkout 1a #切换到分支1a,此时原本的flasky项目就仅剩1a的内容
了解如何克隆,针对作者书里的源码后续就都能轻松拷贝了。后续我也会陆续在我的github上更新代码,并且争取尽量写注释,感兴趣的同学可以克隆我的代码到本地,这个后续再说。
IDE也就是集成开发环境,可以理解为让你的程序编写更轻松,这边强烈推介pycharm,不仅支持代码补全等基本功能,并且可以很方便的看模块的源码。感兴趣的同学可以上网搜下安装教程,本次的教程都是通过pycharm来完成的。
app = Flask(__name __)
flask的app创建,需要往Flask里传入__name__,部分同学可能还对该语法不是很熟悉。在python中,__name__表示当前模块名称,简单举例来说在当前hello.py运行程序,__name__的值就是__main __,但如果别的模块导入hello.py,此时hello.py里面的__name__的值就是hello.py。所以一般我们在运行本模块的时候,都会添加if __name __ == ‘__main __’,这是因为当模块被其他模块导入的时候,会默认直接运行一遍程序,所以通过该语句来控制被其他模块导入时不运行。
回到flask,这里传入的__name__指代hello.py,表示hello.py所在的文件夹为项目的根路径,后续的templates(模版文件夹)、static(静态文件夹都将会在该根路径下查找)。如果此时我们点到源码里(在pycharm里,通过ctrl+鼠标左键点击Flask)看,会发现Flask类初始化__init __里定义了很多默认参数(如下),而这些用默认的就行。
另外如果不传__name__有影响吗?实际上随便传个字符串‘dafaf‘也是没问题的,因为flask如果找不到该字符串会默认以当前文件所在的文件夹为项目根目录,但是如果你的字符串是’abc‘,那不好意思,刚好python内置模块里有‘abc’这个模块,此时flask就会找到’abc’所在的模块所在目录为根目录。
所以,为方便管理和业内统一,传入__name__来表示flask的app应用程序创建。
关于路由的概念,狗书已经讲的比较清楚,其中@app.route(’/user/
关于转换器最重要的是可以自定义转换器,也就是可以自定义转换器来正则匹配路由,关于这点,后续再单独列篇章说明。
第一次接触上下文的概念都会懵逼,如果对http协议有所了解的话,会觉得这个概念也不是那么难(这边推介http的两本书:http图解/http权威指南,两本都很易懂,区别是前者篇幅短小,后者篇幅巨大)。
flask的上下文分为请求上下文(英文名request context)和应用上下文(application context),实际上context的翻译还有环境的意思,所以也可以简单理解为请求环境和应用环境,简单的讲两者作用:
请求上下文:保存了客户端和服务器交互的数据
应用上下文:flask 应用程序运行过程中,保存的一些配置信息,比如程序名、数据库连接、应用信息等
在每次浏览器请求服务端的时候,会发送请求,请求方式有许多:get、post、put、delete等等,其中前两者最为广泛使用,都可以携带数据访问服务端(例如账号和密码),那每一个请求都是有别于其他请求的,也对应着不同的路由(视图函数),而这些请求携带的数据就保存在一个个的请求上下文里,在flask里就是request和session,通过这两个对象就可以轻易获得交互数据。另外应用上下文主要指的就是current_app,这个上下文一般指代当前flask,也就是app。总结一句话,flask的app程序就是current_app(应用上下文),而浏览器每往服务端发送一份请求,就会产生请求上下文,所以多个请求上下文对应着一个应用上下文。
应用上下文里还有g变量,这个变量也是用来存储请求的数据的,那和请求上下文的区别是,针对当前的请求是全局的,而不同的请求会有不同的全局变量,通过不同的thread id区别。
关于推送,这个了解下就行,因为狗书是采取前后端不分离的方式来写的,不分离的意思就是后端获取数据,同时把数据传给模版再渲染展示,所以少了前后端数据交互的过程,需要通过上下文推送来交互,真实开发环境里是通过ajax等来交互的,那个时候自然拿的到request里的数据。
请求钩子是通过装饰器来完成的,我们登录网站后,每点开一个新链接,服务端不能每次都要判断并加载用户吧?此时就可以在每次浏览器发送请求结束(比如点开链接)后,自动执行判断用户是否登录并加载。
前面的相应内容通过简单的return返回一个html标签命令就ok了,我们也可以通过返回对象来携带cookie。cookie和session是浏览器和服务器交互的重要知识点。我们知道,http协议是无状态协议,它只负责通信,不负责保存数据,这样能保证通信的速度。但是缺点就是每次访问服务端都要重新登录,这时cookie就出来了,它的作用就是保存通信数据到浏览器里,第一次给服务端发送请求时,服务端会设置一个cookie返回客户端,客户端保存该cookie到浏览器里,下次访问时就会自动携带该cookie给服务端,此时服务端就能判断客户端是之前的客户端,就免去了重新登录的必要。这在我们平常访问时也很常见,浏览器会提示是否要保存账号密码到当地,也就是这个道理了。
至于session,是依赖于cookie实现的,和cookie的区别是cookie是保存在客户端,session是保存在服务端。因此更为安全,因为客户端也就是浏览器,可以被多人使用,如果保存在客户端,信息明显不够安全,通过session每次把客户数据保存到服务端,然后通过传一个session_id回客户端,下次客户端访问时,把session_id和服务端的一比对,就可以验证是否是同一个客户端。
@app.route('/')
def index():
response = make_response('This document carries a cookie!
')
response.set_cookie('answer', '42') #设置cookie,为字典格式,前者为key,后者为value
return response
很多同学看到这会不注意,这个命令可以支持我们通过命令的形式来启动程序,并且当有数据库迁移的时候可能通过该命令完成。启动命令:python hello.py runserver。
@app.route('/user/')
def get_user(id):
user = load_user(id)
if not user:
abort(404)
return 'Hello, %s
' % user.name
这里的load_user未定义,所以这边会报错,在第二版作者更新了这块代码,这边只要了解下abort的使用就行。
from flask.ext.script import Manager #模块导入错误
manager = Manager(app)
# ...
if __name__ == '__main__':
manager.run()
这边会出现模块导入错误,原因是flask.ext不再存放模块,后续存储在该模块的都改成flask_script这种格式就OK了。
第三章是对于模版的介绍,引入了bootstrap模块,这个模块主要还是练手使用,真实开发里都是有专门的前端来撰写对应的界面程序,所以我觉得了解下该模块就好,如果你的目标只是个人开发小网页的话,那是可以认真学习下该模块。
关于模版的使用,要掌握好模版引擎jinja2的继承、变量、控制结构的使用,因为后面的项目是绕不开这三个的。另外就是url_for的妙用,在前端定位路由url时,往往可以通过url来定位,比如/user/michael就定位到michael的个人主页,但是url往往是多变的,而视图函数基本是固定的,所以可以通过url_for来定位视图函数,从而反向定位url位置,它的底层原理也是借助url_map里的映射关系来反向定位的,这里就不多加说明了。
第三章整体内容比较简单,跟着狗书敲基本没什么问题。
暂时到这里,后续再更新4-6章知识点,写完的感觉就是有的没必要讲,又遗漏了部分没讲,另外就是很多知识点都要花巨大篇幅来讲,这边压缩了篇幅,所以部分知识点可能不够严谨,这点还待完善。主要是适用人群的不同,部分人可能刚学完python的基础语法就接触狗书了,对http协议、html标签语言等等都不是很了解,而部分人有这些基础在的话,很多东西就很简单理解,后面再逐步更新把。
这边我上传了我的文件到github,针对每个路由都有尽量去写注释,感兴趣的同学可以下载到本地。github地址是:[email protected]:sandwu/flask_web-.git。执行命令和狗书一样,不同的是我是以标签tag来保存的,每一章节对应各自的version,从v1.0-v3.0是前三章节的。执行下述命令拷贝第三章节就行:
git clone [email protected]:sandwu/flask_web-.git
cd flask_web-
git checkout v3.0