WEB

本文总阅读量

前记

【暂时废弃】
更新时间:2017-12-13 14:46:00

WEB有很多东西,有些框架/库的功能也是交叉着,所以有点混乱。今天闲的无聊,百度后觉得别人说的还是不明白,就把之前保存的文档全看了一遍。了解一下,应该有很多认知错误的,以后深入了解后再改正。
所以这里就是类似与 前端小功能收集,Redis命令一样,内容简单,纯粹记录下我刚接触时的感想,顺便把以前的东西也写进来了。回头可以看一看,回顾下,还有就是以后找资料容易点。。。。。。

主要是在今天看了vue,Angular(js框架),RESTful,tornado,wsgi文档后,才能把他们正式区分开的。
文字不好,使用度不频繁,所以写的不太好,以后更熟悉时再改,相比之前不知道为什么需要使用vue,也不知道服务器、容器和应用的关系好多了。。。。。。。

前端

之前我在找前端的资料时,就看到很多人在说前端更新很快,一不学习就要落后了,尤其是一个知乎的回复

感谢前端,让我找回了大学学习的时光

前端框架合集的网站

css框架:bootstrap,uikit(我喜欢这个)等
可以不用自己写css就可以做出一个美化的网站,之前第一次接触时,就觉得写个页面美化居然那么简单。。。

js框架:vue.jsReactAngularJS
可以简化前端开发,提高生产力的东西,更让网页像个app一样,让后端只负责数据的传输、账户等校验和业务逻辑(要是之前看到就可以不用在模板上纠结那么久了,用vue代码几行就可以搞定[捂脸])。
一开始以为就是个类似与jinja2的东西。,在看了同学发了个用前端实现路由(vue路由)的朋友圈后,我就决定去看文档了(看的是vue),发现真的是可以提高生产力,我这个js菜鸟可以边看文档边理解(AngularJS理解略难点?),就可以写出很多之前觉得很难写出来的东西了(重点是,代码量也少)。也知道看我之前想实现的功能——spa,可以通过这些框架来实行。

模块化开发:目前没有用到,待补充

中间

那些tcp/ip协议啊,RFC(/d+)什么的虽然刚考完ccna还记得很清楚。。。但是感觉并不属于这个部分的

RESTful
RESTful,实际上只是一种设计风格,他是一种面向资源的设计
当前后端就只有服务器一个,前端的却后手机、平板、电脑等等,通过运用RESTful设计的url,可以让不同的前端一起使用共同的url,而且有充分利用了http的内容(一开始我都是post,get的,现在回头看觉得url设计的不是很好)

1.RESTful,有一个统一的url来调用资源
调用资源的方式通过http1.1协议的方法,分别以不同的方式操作资源

  • get :从服务器取出资源
  • post :在服务器新建资源
  • put :在服务器更新资源(客户端提供完整资源数据)
  • patch :在服务器更新资源(客户端提供需要修改的资源数据)
  • delect :在服务器删除资源

2.RESTful要求无状态
即所有的资源,都可以通过URI定位,而且这个定位与其他资源无关,也不会因为其他资源的变化而改变。
无状态与有状态的区别(比如要从数据库拿到一个音乐资源):

  • 无状态:该资源是无需付费的,访客访问时,也可以用资源推给用户
  • 有状态:该资源是付费的,需要先登录,然后再判断这个用户是否有付费,有的时候才能把资源推给用户
    可以看出,有状态通过url推送资源还需要进一步判断,而且上一步骤操作不成功时,后面的操作则无法进行,而无状态则不需要

3.提供服务的服务器和使用服务的客户需要被隔离对待

4.服务器必须让客户知道请求是否可以被缓存

5.使用超媒体
不知道怎么说,等我看完《REST in Practice》,逃。

附:

1.简单来说,RESTful就是:

看Url就知道要什么
看http method就知道干什么
看http status code就知道结果如何
by 知乎:徐磊

2.RESTful库:

  • Django
  • django-rest-framework:一个强大灵活的工具,用来构建 web API。
  • django-tastypie:为Django 应用开发API。
  • django-formapi:为 Django 的表单验证,创建 JSON APIs 。
  • Flask
  • flask-api:为 flask 开发的,可浏览 Web APIs 。
  • flask-restful:为 flask 快速创建REST APIs 。
  • flask-restless:为 SQLAlchemy 定义的数据库模型创建 RESTful APIs 。
  • flask-api-utils:为 Flask 处理 API 表示和验证。
  • eve:REST API 框架,由 Flask, MongoDB 等驱动。
  • Pyramid
  • cornice:一个Pyramid 的 REST 框架 。
  • 与框架无关的
  • falcon:一个用来建立云 API 和 web app 后端的高性能框架。
  • sandman:为现存的数据库驱动系统自动创建 REST APIs 。
  • restless:框架无关的 REST 框架 ,基于从 Tastypie 学到的知识。
  • ripozo:快速创建 REST/HATEOAS/Hypermedia APIs。

3.初识时,可能觉得RESTful跟自己生成的api很像,但是还是有区别

举个具体API的例子:请求:
GET /posts HTTP/1.1
Accept: application/atom+xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
响应:
HTTP/1.1 200 OK
Content-Type: application/atom+xml

<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>Posts</title>
<link href="http://example.org/posts" rel="self" />
<link href="http://example.org/posts?pn=2" rel="next" />
<id>urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6</id>
<updated>2003-12-13T18:30:02Z</updated>
<entry>
<title>Post XXX</title>
<link href="http://example.org/post-xxx" />
<id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a</id>
<updated>2003-12-13T18:30:02Z</updated>
<content type="xhtml">
<div xmlns="http://www.w3.org/1999/xhtml">
<p>This is the post content.</p>
</div>
</content>
</entry>
<entry>...</entry>
</feed>

注意上面atom格式中的多个元素,它们分别定义了当前状态下合法的状态转移。例如,这是一个指向自己的链接,其中rel属性指定了状态转移的关系为自身。
这是下一页的链接,
如果当前不是第一页的话,就会有类似如下的链接来表示上一页,
而这个是某一篇文章的链接,
总结一下,就是:服务器生成包含状态转移的表征数据,用来响应客户端对于一个资源的请求;客户端借助这份表征数据,记录了当前的应用状态以及对应可转移状态的方式。当然,为了要实现这一系列的功能,一个不可或缺的东西就是超文本(hypertext)或者说超媒体类型(hypermedia type)。这绝对不是一个简简单单的媒体类型(例如,JSON属性列表)可以做到的。(参考:REST APIs must be hypertext-driven)因此,像下面这种API,1、获取文章

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
请求:
GET /blog/post/{postId} HTTP/1.1

响应:
HTTP/1.1 200 OK
{
"title": "foobar",
"content": "foobar",
"comments": ["", "", ""]
}

2、发布文章

请求:
POST /blog/post HTTP/1.1
{
"title": "foobar",
"content": "foobar",
"comments": ["", "", ""]
}

响应:
HTTP/1.1 201 CREATED

绝对不是RESTful!绝对不是RESTful!绝对不是RESTful!

以上引用:
作者:季文昊
链接:https://www.zhihu.com/question/28557115/answer/48120528
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

后端

web上的server都叫web server,但是大家分工也有不同的,有服务器,容器,应用
服务器主要是处理请求,决定分发到那个应用(静态文件也在此处理),容器则是负责初始化环境(设置环境变量,如异步通信,websocket也在此处),应用则是提供应用功能。

服务器: Apache/Nginx
容器:tonardo/Twisted
应用:用web框架开发的应用,web框架有Django,flask,Bottle,pyramid,CherryPy等(框架链接见这里的web框架部分)

上面是按照主要功能划分的,很多框架对于上面每个领域都有一些涉足,但擅长的不一样,像tonardo(因为我今天才刚刚看了这个的文档,Twisted还没看- -)
Tornado既是一个容器,也是应用。而它作为容器 采用的是asynchronous IO的网络模型,这是一种很高效的模型。在文档中,前半部分讲了tornado作为一个应用是如何使用的,后面,也是最主要的讲了如何运用tornado来实现他的异步和长轮询问以及使用WebSocket实现双工通信。

大多时候后端都是通过服务器+容器+应用,栗子:
nginx+tornado+django:
1.Nginx作为反代理,分发到后端的torndo服务器
2.Django作为framwork搭建到tornado服务器上,使用其admin功能
在这个栗子中
服务器关心的是 HTTP 协议层面的传输和访问控制,所以在 Nginx上可以看到代理、负载均衡等功能。客户端通过服务器访问服务器上存储的资源(HTML 文件、图片文件等等)。通过 CGI 技术,也可以将处理过的内容通过服务器分发,但是一个服务器始终只是把服务器上的文件如实的通过 HTTP 协议传输给客户端。而容器,则是一个应用执行的容器。保证应用能够在应用服务器上正常运行。,我们可以通过框架来开发应用,让应用运行在应用执行的容器。他们能一起使用则是靠wsgi协议(容器那里可以说属于wsgi层,也就是通过wsgi协议分别连接服务器和应用的)

还有另外一个栗子

Apache/lighttpd: 相当于一个request proxy,根据配置,把不同的请求转发给不同的server处理,例如静态的文件请求自己处理,这个时候它就像一个web server,对于fastcgi/python这样的请求转发给flup这样的Server/Gateway进行处理 flup: 一个用python写的web server,也就是cgi中所谓的Server/Gateway,它负责接受apache/lighttpd转发的请求,并调用你写的程序 (application),并将application处理的结果返回到apache/lighttpdfastcgi: apache/lighttpd的一个模块,虽然flup可以作为一个独立的web server使用,但是对于浏览器请求处理一般都交给 apache/lighttpd处理,然后由apache/lighttpd转发给flup处理,这样就需要一个东西来把apache/lighttpd跟flup联系起来,这个东西就是fastcgi,它通过环境变量以及socket将客户端请求的信息传送给flup并接收flup返回的结果web.py: 应该说有了上面的东西你就可以开始编写你的web程序了,但是问题是你就要自己处理浏览器的输入输出,还有cookie、session、模板等各种各样的问题了,web.py的作用就是帮你把这些工作都做好了,它就是所谓的web framework,另外一个出名的是django,不过感觉太复杂了,web.py差不多就够用了WSGI : 除了flup Server/Gateway外还有很多其他人的写的Server/Gateway, 这个时候就会出问题了,如果你在flup上写了一个程序,现在由于各种原因你要使用xdly了,这个时候你的程序也许就要做很多痛苦的修改才能使用 xdly server了,WSGI就是一个规范,他规范了flup这个服务应该怎么写,应该使用什么方式什么参数调用你写的程序(application)等,当然同时也规范你的程序应该怎么写了,这样的话,只要flup跟xdly都遵守WSGI的话,你的程序在两个上面都可以使用了,flup就是一个WSGI server

WebSocket

WebSocket 是什么原理?为什么可以实现持久连接? - Ovear的回答 - 知乎

nginx

HTTP Server,充当着反向代理,有着均衡负荷,和分发静态文件等功能。
nginx的能力比Apache好,但目前我对nginx是使用只会简单的配置。nginx文档

WSGI\uWSGI\uwsgi

  • WSGI是一种通信协议。
  • uwsgi是一种线路协议而不是通信协议,在此常用于在uWSGI服务器与其他网络服务器的数据通信。
  • 而uWSGI是实现了uwsgi和WSGI两种协议的Web服务器。

可以说WSGI是一种编程接口,而uwsgi是一种传输协议,而uWSGI是一个服务器(但是主要是链接nginx与框架的中间层(wsgi))。
相关文档:1,2

查看评论