从0到独自开发一个网站后台
折腾了9个小时终于把服务器架好了,因为uwsgi的不友好,发现了一个比nginx还快的服务器——gunicorn,以前python不易部署,所以被php猛超,但是估计不久, 就是我打python的天下了!!
好了回到整体,其实第一篇博客我想献给这一年的开发经历,把自己走过的坑告诉别人。
后端
在了解后端之前你首先得知道在你打开一个网页时,都发生了什么事。
这张图即是用nginx和gunicorn做服务器代理的
如图,通常它经过这几个步骤,首先你发送一个请求(request)给服务器,和服务器说“服务器服务器,给我这个域名下的页面”,一般是get的方法访问的这个网址(url),服务器就会接受你的访问,并得到你的访问信息。
服务器是怎么听得懂你的请求呢,主要是这有一种通用的写法,即是一种协议——HTTP协议,这让每次发送的表头都是有规律的,是可以用程序解析的了,如:
那个200是一个状态码,表示成功,4开头的状态码表示浏览器访问的错误如404,5开头的状态码表示服务器错误如502
现在你发送一个请求(request),url是 http://www.aljun.me/about?username=aljun 这里面,http是协议(protocol),aljun.me是hostname,这里有个隐含的,一般默认端口( port )为80,/about是path ,然后有一段query的值 username=salamer,这些信息都将交由后端跑的app获取到,就好比你给了一串关键字给搜索引擎,搜索引擎会回复你你要的结果。
后端跑的app
当服务器拿到你的请求url,它就会扔给跑在它上面的一个app,就是一套运行的逻辑,你可以理解为是一个黑箱,你扔给它一个东西它会返回一个东西。下面我用一个最简单的flask程序来给一个后端程序的例子:
好,我来逐句解释这个程序,首先你先初始化一个flask应用,把它传给app(第一,二行),然后你获得一个路由(url)(第四行),这里获得的是 /目录,而那个路由装饰器下面跑的函数就是当访问 / 路径时所用的逻辑,可以看到,它返回一个hello world,最后两句是,使app运行,这是python的一种写法,目的是不被调用
好,我们来运行看看
这时你可以打开浏览器输入 `127.0.0.1:5000',会看到
好,一个最简单的网站后端就算完成了。但是这单单只是客户端与服务端的交互,只涉及逻辑,并没有设计数据,现在的网站基本上都有复杂的数据库交互,即是,在运行app时,app会使用 * sql * 语句与数据库交互,获得数据,这时它会打到前端。
MTV
mtv是一种模式,它与mvc相类似,mtv分别指m(models,数据层),t(template,模板层),v(views,逻辑层)
python的web框架基本都是这个套路(django,flask,tornado)他们的作用是把一个后端app的逻辑分开,来更加好的扩展应用,而不像php,jsp那般只是完全渲染,mtv分别的作用:
- M:定义数据库,一般是用python的orm(如django的orm,或者著名的sqlalchemy)来设计数据库,封装sql语句来创建数据,对app起数据库的 起CRUD(增删查改)的作用
- T:前端渲染,用来写前端的逻辑,一般可可以嵌套进一些python语句甚至是python函数方法,在python领域里面主流是(jinja2,和mako,连django也在其1.8版本后引进jinja2引擎)
- V:后端的逻辑,也就是rails里面的controller的作用,他用来调控从数据库里拿哪些数据,以及传什么数据到template,和渲染哪个html文件,重定向等等。
MVC
其实mtv是mvc的一种变种,但是由于mvc在ruby,java等语言上的web框架上大放异彩,很多后端框架都是基于他。
后端框架(webframework)
先放上一张框架的排名(摘自http://hotframeworks.com)
看到,ruby,python之类的动态语言的web后端框架还是相当牛逼的
为什么要使用框架呢,事实上在现在,如果说所有东西全部自己写,那么开发效率将是相当低的,在产品迭代如此之快,o2o甚至做到了一周一次产品迭代,若一个开发团队不能快速的迭代产品将会很快被对手抛弃,被市场抛弃,而框架iu是帮助我们的最好帮手,早期的框架比较乱,但现在一般一个好的框架都是基于一定的好的软件方法学理念如mvc,mvvm之类的。
框架有多快?框架里面的翘楚ruby on rails曾经有一个视频,直播15分钟开发出一个blog。
一下我将讲讲我这大半年使用的一些框架的经验
Django
这个算的上是python的web框架里面的老大了,一直被拿去和rails相比,在quora上面的django vs rails 大战持续了很久,但django确实有很多值得诟病的地方,特别是性能,因为他是一个大而全的框架,几乎什么都有,主要模块包括:django.template,django.orm,django.forms,django.url,django.admin,django.authenticate等等,其中最值得称赞的好像是django自带的admin系统,笔者曾经自己开发过学校一个社团系统,后端就是基于admin系统,省下了我不少的事,但是由于他坚持什么都自己来,所以代码量巨大,看源码几乎是一种很艰难的事情,而它的orm我对他有爱有恨,首先django的orm真的足够简单那,就关系来说,多对多,一对多非常好设计,比起sqlalchemy还要建个关系表,他真的太简单,但这也带来了性能上的下降,其次是他的template系统,最近的1.8更新,终于他放弃了那个已经跑不动的template系统,转向拥抱jinja2,但二者语法还是相当相近。
使用公司:IBM,NASA,instagram,disqus,Pinterest,mozila
FLASK
我的这个博客就是基于flask开发的,flask它自称是个微框架,基于两个库,一个前端渲染库jinja2,一个url库Werkzeug,其他的东西可以自己添加啊,如我这个博客就是加上了wtf,sqlalchemy,pagedowm等的库而开发出来的,flask比起django有很大的自由性,但也意味着你需要自己造很多轮子
使用公司:国内的果壳网,pinterest等
tornado
这是一个可以处理异步的web服务器,有可以拿来写后端框架,自己有一套template,他刚开始是由feedback开发,后来feedback被facebook收购,他转而由facebook开发,facebook的前cto出去创业的quora就是基于tornado写的,而quora的国内版本 知乎 也是基于的tornado,他因为异步带来的效率而大受欢迎。然而笔者并不是很喜欢他那种很java的写法,不过效率的话,最近好像也不能比同样可以异步的nodejs。
使用公司:facebook,quora,知乎
ruby on rails
这就是传说中的框架中的王冠,支撑起了早期的推特,以及一大堆公司,基本上是硅谷那边rails火的一塌糊涂,ruby语言的作者赞其是将ruby的元编程能力发挥到了变态的程度,当时笔者自己按着rails guide写时,完全在很恍惚的状态下,一下子,几行代码,一个博客就出来了,而且代码可复用型极高,语法也很简洁,并且将coffescript,jquery什么的一起囊括,非常吓人,写着非常的爽
全面基于mvc框架,并且天生支持RESTful架构,如果是初创企业非常建议使用
使用公司:推特,github,tumblr,国内的100offer,freewheel以及非常多的公司在自己的领域使用rails开发小的应用
详情:有哪些企业使用rails
nodejs
这个基于谷歌v8的javascript引擎的框架几乎火遍世界,他让javascript不再只是一个前端的脚本语言,而且javascript天生对事件异步的支持也使得用nodejs开发的后端效率非常之高,笔者的nodejs经验不算特别多,但是不是很喜欢那种javascript的语法,国内的话BAT基本都在内部不断的开发基于nodejs的应用,更是nodejs+mongodb+express+angularjs(mean构架)是现在最火的创业公司的技术选型。
使用公司:BAT等等的很多公司