以Flask为起点入门Web后端开发,关于Flask框架的理解和笔记
  • 分类:Python
  • 发表:2019-06-04
  • 围观(325)
  • 评论(2)

最近在学习Web框架,不管是学长还是老师都是推荐从Java的框架入手,Java找工作比较抢手。或许是对Java的不感兴趣,总是打不起学习的精神。浑浑噩噩到了大三意识到什么都不会总是不行,起码学个简单的框架先入入门。写点小项目也不至于毕业找工作简历过于苍白。为什么不从Python入手,作为Web入门的起点。就我个人理解编程语言都是相通的,只要把原理搞懂了的话,不同语言之间的转换就变得没那么复杂了。

众所周知,Python最火的Web框架有两个:Django和Flask。Django给人的感觉就是高大上,哪方面来看都很优秀。但是为什么我选择从Flask入手?说到底还是收了“垃圾”微信公众号的蛊惑,什么《一行代码创建你的Web服务器》。事实证明Flask虽然可以一行代码创建Web服务,但是要想完善一个Web项目一行代码是绝对搞不定的。一个完整的Flask项目,需要调用的扩展库不计其数。你以为学习Flask就只要看一个Flask文档就够了,但是每个扩展库都有自己独立的文档。有的甚至还没有中文,你都要认真看。所以说程序员脱发这个梗并不是没有道理的。总之入坑之前一定要了解清楚,Flask是很强大的,但是学起来并没有那么简单,入坑还是要谨慎。

这篇文章是关于我初步入门Flask的记录贴,主要包含了我对Flask的总结,Flask常用拓展的介绍,还有就是我学习过程中的一些心得体会。Flask学习的工程量很大,所以总要一步一步积累。防止自己记忆的遗忘,写博客记录一下确实是一个很好的学习方法,我个人有切身体会。

什么是Flask

Flask文档对"微"框架的定义-引自Flask官方文档

Flask对自己的定位是微框架,即只提供Web内核支持,一些网页开发的服务用可拔插的第三方库完成。这与Django有很大的不同,Django太繁重了,除了Web框架,还附带了ORM模板渲染等一系列支持。Flask要想完成一系列的功能就需要不断借助第三方插件扩展。这个操作是非常灵活的,我们可以随心所欲的选择自己喜欢的扩展插入到项目当中。但于此同时第三方库种类繁多,需要翻阅学习不同的文档,无疑给学习量带来了很大的提升。所以对于新手来说,Django或许更适合新手入门。但是既然已经下定决心就不能回头不是么?

Flask框架本身只用到了两个第三方库,这两个库也是官方内置的第三方库。一个是Werkzeug用于提供Flask的底层Web框架支持,另一个就是Jinja2啦,Jinja2是一个模板渲染引擎,用于提供动态数据的渲染支持。你以为Flask就是这么简单那就大错特错了,只用这两个基础库做Web开发是远远不够的。比如说简单的ORM,表单验证,登录权限管理,数据库支持等等一系列Web开发必要的功能,都需要我们借助第三方支持库来实现。老师说Flask是真的很鸡贼,虽然自称框架但是大部分实现都是借助第三方库完成的。对这点我也十分赞同,但是不得不说这样的可拓展性真的是太让人舒服了。相比于Django,Flask可以随心所欲的拓展,在开发小型项目上就不会有Django那种大材小用的感觉。

接下来结合我的入门项目<<鱼书>>项目介绍一下项目架构和Flask的常用第三方扩展。鱼书项目是慕课的七月老师的Flask入门教程,从Flask原理带你入门Flask。七月老师对编程独到的理解真是与众不同,给人一种茅塞顿开的感觉。从代码映射到生活,其实很多编程思想和生活都是相通的。在学习到很多编程思想的同时也领悟到了一些不同的人生道理。现在的我总是忙忙碌碌的在学习,貌似已经抛弃了自己所有的兴趣,虽然编程就是我最开始的兴趣。但如果一直这样高强度的学习我也可能变得消极。或许应该抽点时间拥抱一下生活,你很忙,但知识从未慌张。七月老师的座右铭我也是十分喜欢和认同的:“代码是生存,不是生活”。希望以后我也可以像七月老师一样做一个懂生活的程序员。


关于鱼书

什么是鱼书?鱼书就是一种理念,用来拯救闲置的二手图书交换平台。由于送书和索取书都是免费的,所以或许理念有些理想主义。但是七月老师说了,产品本身是否成功并不是作为学习者需要关心的,我们需要关心的是鱼书这个项目运用到的技术,这个才是重点。至于项目成不成功我不知道,但是我知道七月老师的这个项目现在还在运行,不管是出于什么目的,我觉得这个产品总会有喜欢并且使用的客户。我想七月老师总是有他的考虑吧。

项目目录结构

 

典型的MVC架构,我个人认为项目结构是非常合理的。在之后很久的一段时间内,我写的Flask项目应该都会借鉴这种代码组织结构。因为是Flask入门,所以所有动态数据的渲染都是通过Jinja2渲染的,而不是当前流行的用Ajax做数据渲染。但是Flask学会了转Ajax难度不是很大。

跟七月老师学到了很多,第一次深入了解了MVC,也是第一次知道原来业务逻辑是要写在模型层。也知道了后端开发难点不在于代码,不在于数据库,难点在于业务逻辑的完善。实现一个功能需要考虑到的因素太多了,每一处马虎大意都给网站安全埋下一次隐患。作为开发者我们需要对用户数据负责,这就要求我们有缜密的逻辑思维。在写小项目的时候我们可以一气呵成想到哪里写在哪里。对于一个要上线的大型项目来说我们必须做好业务测试,避免带来不必要的损失。

鱼书项目用到了很多第三方Flask支持,Flask的强大也在于灵活的第三方插件支持。显然鱼书是入门项目只用到了Flask官方推荐的几个插件,包括Jinja2,WTForm,Flask-SQLAlchemy,Flask-Login,Flask-mail......等一系列基础插件,官方的插件并不止这几个,但是掌握了这几个插件对于小型项目的开发可以说是不在话下。更多的插件Flask文档给了详细的介绍:Flask扩展仓库(点击链接跳转),同时还可以在Pypi查找标记为 Framework :: Flask 扩展包。

鱼书用到的第三方扩展

Werkzeug

Werkzeug是Python的WSGI规范的实用函数库。使用广泛,基于BSD协议。Flask的底层Web支持就是基于Werkzeug。Werkzeug是一个WSGI工具包,不能被理解成一个框架或者是一个服务器,它仅仅是实现了Web框架的内容,比如说:request,response等等。Werkzeug有详细的中文文档:https://werkzeug-docs-cn.readthedocs.io/zh_CN/latest/。看起来好难呢,我到现在还没有简单看一看。

Jinja2

Jinja2是Flask框架内置为数不多的第三方扩展之一。做Web开发总是需要做讲服务器处理出来的动态信息渲染到静态页面中,直接用Python操作HTML之类往往是繁锁且不切实际的。Jinja2的存在就是解决这个问题的。Jinja2定位为模板渲染引擎,就是方便我们向静态页面渲染数据的。当然并不是这么简单的功能,Jinja2的沙箱功能和自动转义功能,对应网站的安全性起着至关重要的作用。据说Jinja的思想源于Django的模板引擎。同样中文文档地址:http://docs.jinkan.org/docs/jinja2/。但是文档有点冗长,作为初学者建议先看模板设计者文档这一章,如果需要深入了解的时候才全文通读。

Flask-SQLAlchemy

Flask-SQLAlchemy是对SQLAlchemy的封装使其更好地支持Flask。Flask-SQLAlchemy提供了SQL工具包和关系对象映射(ORM)。可以让我们在写业务逻辑的时候不用关心如何写SQL查询,只用关系具体的业务逻辑。我们不用关系如何建表,因为Flask-SQLAlchemy可以根据我们写的代码自动生成相应的数据表。ORM节省了很多开发流程,让数据库的使用变得不再那么繁锁。ORM总是会在Web开发被提到,主要是因为他快速开发的优势。但是缺点也很明显,对待复杂查询会显得有些力不从心,同样查询效率没有原生SQL语句快。对于SQL只会写单表查询的我来说,无疑是很让我喜欢的。

Flask-SQLAlchemy文档地址:http://www.pythondoc.com/flask-sqlalchemy/。由于Flask-SQLAlchemy只是对SQLAlchemy的封装,真正想了解底层的架构还是要看SQLAlchemy的文档:https://docs.sqlalchemy.org/en/13/orm/tutorial.html。需要注意的是Flask-SQLAlchemy需要第三方数据库模块支持,我用的是MySQL数据库所以选择的是Cymqsl,通过pip install cymysq安装。具体还是要根据自身的实际情况选择不同的数据库支持库。

WTForms

Web服务建立之后总是需要处理来自不同请求的表单数据,并不是所有表单都符合我们的数据要求。对于验证不通过的数据我们自然不能提交到数据库。而WTForm就是提供后台表单验证的数据的扩展。它内置了很多常用的表单验证规则,通过简单的代码就可以验证form数据的正确性。当然它也支持自定义表单的验证。需要注意的是在网页前端也可以通过JS做数据的验证,但这不代表前端做了验证后端就不需要验证,因为要时刻记住客户端发来的数据是不受信任的,都是可以伪造的,为了Web服务的安全性,后端验证不可或缺。文档地址:https://wtforms.readthedocs.io/en/stable/。英文文档看起来会有点吃力,但是会用之后真的不难。

Flask-Login

Web开发总是需要有很多登录的场景,记录登录状态一般是通过session实现。从无到有编写一个权限管理实在是太复杂叻,优秀的程序员排斥重复造轮子行为。Flask-Login就是提供登录权限管理的扩展。我们只需要在注册的路由下面再带一个装饰器,这个路由就被重置为登录状态访问。细节代码我们不需要了解,只需要关注Flask-login的简单配置就好了,反正遇到要登录的业务场景就打装饰器就好了。七天免登录的功能如果我们从头开始写需要数量庞大的代码,但是有了Flask-login扩展就只用一行代码就搞定了,效果可以说是立竿见影。文档地址:http://www.pythondoc.com/flask-login/

Flask-mail

对于很多业务场景比如说找回密码,我们需要像用户的邮箱发送邮件。虽然原生Python提供了邮件发送的支持库,但是和urllib一样过于底层需要我们控制的参数太多啦,总归没有requests好用。对于邮件也是一样。Flask-mail提供了简单的邮件发送方式,与Flask更加切合。而且可以使用Jinja渲染邮件页面,可以说是十分方便了。文档地址:https://pythonhosted.org/Flask-Mail/


总结

视频文档前前后后加起来看了将近一年了,拖延症是真的伤不起。马上毕业了才有危机感,开始不努力后期就比较累这个没得说,还是怪自己前面太贪玩啦。但是他们不是说了么:种一棵树最好的时间是十年前,其次就是现在。我现在开始也不算太晚不是么?

Flask的学习并没有想象的简单,希望自己可以迎难而上,更加熟练的掌握Flask的开发,这样以后毕业了也可以在简历上写上“精通”Web编程。最好的学习方法就是多写代码而不是看了多少教程,接下来的时间我会通过小的实战项目更加全面的学习Flask。但是Web开发并不是纯粹的后端,需要与前端相互配合的。所以希望自己在学习Flask的过程中能扩充自己的前端知识,毕竟html、css、javascript都是只掌握了皮毛,JQuery都没有看呢,任重道远,加油叻!


共有 2 条评论

  1. 追风的骚007

    希望持续更新,小弟持续关注

    1. Weiney

      Weiney

      谢谢支持呀,一定会认真学习的哦

Top