"放任"独身

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

 

基本的SOCKET接口函数

在生活中,A要电话给B,A拨号,B听到电话铃声后提起电话,这时A和B就建立起了连接,A和B就可以讲话了。等交流结束,挂断电话结束此次交谈。  打电话很简单解释了这工作原理:“open—write/read—close”模式。
 

 

    服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。

 

通过这个图可以看出来wsgi server 基本工作流程

  1. 服务器创建socket,监听端口,等待客户端连接。

  2. 当有请求来时,服务器解析客户端信息放到环境变量environ中,并调用绑定的handler来处理请求。

  3. handler解析这个http请求,将请求信息例如method,path等放到environ中。

  4. wsgi handler再将一些服务器端信息也放到environ中,最后服务器信息,客户端信息,本次请求信息全部都保存到了环境变量environ中。

  5. wsgi handler 调用注册的wsgi app,并将environ和回调函数传给wsgi app

  6. wsgi app 将reponse header/status/body 回传给wsgi handler

  7. 最终handler还是通过socket将response信息塞回给客户端。

Django是MVC吗?

首先说说Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求,其示意图如下所示:

Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是值:

M 代表模型(Model):负责业务对象和数据库的关系映射(ORM)。

T 代表模板 (Template):负责如何把页面展示给用户(html)。

V 代表视图(View):负责业务逻辑,并在适当时候调用Model和Template。

除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template,MTV的响应模式如下所示:

1,Web服务器(中间件)收到一个http请求

2,Django在URLconf里查找对应的视图(View)函数来处理http请求

3,视图函数调用相应的数据模型来存取数据、调用相应的模板向用户展示页面

4,视图函数处理结束后返回一个http的响应给Web服务器

5,Web服务器将响应发送给客户端

这种设计模式关键的优势在于各种组件都是松耦合的。这样,每个由 Django驱动的Web应用都有着明确的目的,并且可独立更改而不影响到其它的部分。

比如,开发者更改一个应用程序中的 URL 而不用影响到这个程序底层的实现。设计师可以改变 HTML页面的样式而不用接触Python代码。

数据库管理员可以重新命名数据表并且只需更改模型,无需从一大堆文件中进行查找和替换。

落到实处,Django的MTV模式相对应的python文件如下:

Django是如何工作的?

要真正的欣赏Django,你需要撇开表象来看本质。它启发你得同时也让会让你不知所措。下图显示了在Django应用中一个典型的web请求是如何被处理的。

how-web-requests-in-django

前面的图片展示了从一个访客的浏览器到Django应用并返回的一个web请求的简单历程。如下是数字标识的路径:

  1. 浏览器发送请求(基本上是字节类型的字符串)到web服务器。
  2. web服务器(比如,Nginx)把这个请求转交到一个WSGI(比如,uWSGI),或者直接地文件系统能够取出一个文件(比如,一个CSS文件)。
  3. 不像web服务器那样,WSGI服务器可以直接运行Python应用。请求生成一个被称为environ的Ptyhon字典,而且,可以选择传递过去几个中间件的层,最终,达到Django应用。
  4. URLconf中含有属于应用的urls.py选择一个视图处理基于请求的URL的那个请求,这个请求就已经变成了HttpRequest——一个Python字典对象。
  5. 被选择的那个视图通常要做下面所列出的一件或者更多件事情:
    1. 通过模型与数据库对话。
    2. 使用模板渲染HTML或者任何格式化过的响应。
    3. 返回一个纯文本响应(不被显示的)。
    4. 抛出一个异常。
  6. HttpResponse对象离开Django后,被渲染为一个字符串。
  7. 在浏览器见到一个美化的,渲染后的web页面。

虽然某些细节被省略掉,这个解释应该有助于欣赏Django的高级架构。它也展示了关键的组件所扮演的角色,比如模型,视图,和模板。Django的很多组件都基于这几个广为人知设计模式。

 

posted on 2017-12-18 17:03  "放任"独身  阅读(164)  评论(0)    收藏  举报