python--Django 00 WEB框架原理

思考: WEB框架原理是什么?设计模式是什么?

1 Web应用本质

1.1 Web应用认识过程:

  • 学习过python的socket编程后,我们可以简单的理解所有的Web应用本质上就是一个socket服务端和一个socket客户端的通信过程。
  • 进一步学习了前端知识后,我们发现浏览器可以作为客户端与服务端通信。

这样,我们就可以自己实现一个简单的Web应用框架示例。

服务端程序示例:

import socket

sk = socket.socket()
sk.bind(("127.0.0.1", 8080))
sk.listen()


while 1:
    conn, addr = sk.accept()
    data = conn.recv(8096)
    print(data)  # 将浏览器发来的消息打印出来
    conn.send(b"OK")
    conn.close()

浏览器地址栏输入:

https://127.0.0.1:8080

服务端接收结果:

b'GET / HTTP/1.1\r\nHost: 127.0.0.1:8080\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\nDNT: 1\r\nAccept-Encoding: gzip, deflate, br\r\nAccept-Language: zh-CN,zh;q=0.9\r\nCookie: csrftoken=RKBXh1d3M97iz03Rpbojx1bR6mhHudhyX5PszUxxG3bOEwh1lxFpGOgWN93ZH3zv\r\n\r\n'

浏览器接收结果:

显示"OK"

我们发现服务端接收到的结果以"\r\n"作为换行符,可以解析出一个固定的格式。这个可以解析出的固定格式就是网络通信中客户端与服务端通信的规则。这个规则就是HTTP协议,不管是浏览器发送请求(request)信息也好,还是服务器回复响应(response)信息也罢,都要按照这个规则来。

HTTP协议主要规定了客户端和服务器之间的通信格式,那HTTP协议是怎么规定消息格式的呢?

1.2 HTTP协议

每个HTTP请求和响应都遵循相同的格式,一个HTTP包含Header和Body两部分,其中Body是可选的。 HTTP响应的Header中有一个 Content-Type表明响应的内容格式。如 text/html表示HTML网页。

1.2.1 HTTP请求格式

1.2.2 HTTP响应格式

1.3 请求中的URL构成

超文本传输协议(HTTP)的统一资源定位符将从因特网获取信息的五个基本元素包括在一个简单的地址即url中,以http://www.luffycity.com:80/news/index.html?id=250&page=1 为例:

  • 传送协议:  http
  • 层级URL标记符号(为[//],固定不变)://
  • 访问资源需要的凭证信息(可省略)
  • 服务器(通常为域名,有时为IP地址): www.luffycity.com
  • 端口号(以数字方式表示,若为HTTP的默认值“:80”可省略):80 (https协议: 默认端口是443)
  • 路径(以“/”字符区别路径中的每一个目录名称):/news/index.html
  • 查询:?id=250&page=1(GET模式的窗体参数,以“?”字符为起点,每个参数以“&”隔开,再以“=”分开参数名称与数据,通常以UTF8的URL编码,避开字符冲突的问题)
  • 片段 以“#”字符为起点

1.4 响应中的状态码

所有HTTP响应的第一行都是状态行,依次是当前HTTP版本号,3位数字组成的状态代码,以及描述状态的短语,彼此由空格分隔。

状态代码的第一个数字代表当前响应的类型:

  • 1xx消息——请求已被服务器接收,继续处理
  • 2xx成功——请求已成功被服务器接收、理解、并接受
  • 3xx重定向——需要后续操作才能完成这一请求
  • 4xx请求错误——请求含有词法错误或者无法被执行
  • 5xx服务器错误——服务器在处理某个正确请求时发生错误

虽然 RFC 2616 中已经推荐了描述状态的短语,例如"200 OK","404 Not Found",但是WEB开发者仍然能够自行决定采用何种短语,用以显示本地化的状态描述或者自定义信息。

1.4 HTTP工作原理

HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

以下是 HTTP 请求/响应的步骤:

1. 客户端连接到Web服务器
一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.baidu.com。

2. 发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。

3. 服务器接受请求并返回HTTP响应
Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。

4. 释放连接TCP连接
若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;

5. 客户端浏览器解析HTML内容
客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。

例如:在浏览器地址栏键入URL,按下回车之后会经历以下流程:

  1. 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
  2. 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
  3. 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
  4. 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
  5. 释放 TCP连接;
  6. 浏览器将该 html 文本进行解析并显示内容;  

1.5 HTTP版本以及HTTPS

1.5.1 HTTP版本

主要有以下四个版本

  • 0.9
  • 1.0
  • 1.1  现今广泛使用的一个版本
  • 2.0  于2015年5月以RFC 7540正式发表,取代HTTP 1.1成为HTTP的实现标准。

1.5.2 HTTPS

HTTPS 协议是由 HTTP 加上 TLS/SSL (即HTTP + SSL / TLS)协议构建的可进行加密传输、身份认证的网络协议,主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护。

 

2 WEB应用框架自我的改进

服务器端程序:

"""
使用socket 搭建一个简单的web服务端
使用函数接收访问的网页并返回响应的结果
"""

import socket
sk = socket.socket()
sk.bind(('127.0.0.1', 8080))
sk.listen()


def login(url):
    data = 'ni fang wen de shi: {}'.format(url)
    return bytes(data, encoding='utf8')


def admin(url):
    data = 'ni fang wen de shi: {}'.format(url)
    return bytes(data, encoding='utf8')


# url和函数的对应关系
url_func = [
    ('/login/', login),
    ('/admin/', admin),
]


while 1:
    # ------------------- 建立连接 接收消息部分 --------------------
    conn, addr = sk.accept()
    data = conn.recv(9000)

    # -------------------- 对用户发来的消息做处理的部分 -------------
    # 把收到的字节类型的数据转换成字符串
    data_str = str(data, encoding='utf8')
    # 按照课前练习切分字符串,得到请求行
    first_line = data_str.split('\r\n')[0]
    # 对请求行按照空格切割
    url = first_line.split(' ')[1]

    # --------------- 业务逻辑处理部分 ---------------------
    # 使用func变量保存将要执行的函数
    for i in url_func:
        if i[0] == url:
            func = i[1]
            break
    else:
        func = None
    # 执行函数
    if func:
        msg = func(url)
    else:
        msg = b'404 not found!'

    # ----------------- 回复响应消息 部分 ----------------------
    conn.send(b'HTTP/1.1 200 OK\r\n\r\n')
    conn.send(msg)
    conn.close()

运行服务器端程序后,在浏览器地址栏输入:

127.0.0.1:8080/login/

浏览器运行结果根据输入地址的不同而不同:

python--Django 00 WEB框架原理_第1张图片

python--Django 00 WEB框架原理_第2张图片

3 python开发中的web框架

通过以上自我改进,我们把可以总结出web框架主要有的三个工作,可分为两种程序:

  • a 收发socket消息,按照HTTP协议解析消息                                      (这部分也叫web服务程序; wsgiref、gunicorn 、uWSGI)
  • b  字符串替换,实现网页的动态展示(例如博客)效果                  (这部分也叫web应用程序: )
  • c  业务逻辑处理,实现交互(例如购物网站)                                  (这部分也叫web应用程序):

web服务程序:

web应用程序:

web服务程序和web应用程序间通信: 用WSGI协议

3.1 框架分类

3.1.1 web框架分类法一:

自己实现abc的:例如tornado   tornado并发做的好可以用于爬虫

自己实现b,c  用别人a    例如Django

自己实现C  使用别人的a和b: 例如Flask   Flask小而美   

 

3.1.2 web框架分类法二:

1.Django:Django框架是一个大而全的框架

2.其他  :tornado   Flask   bottle

4 MVC框架和MTV框架

MVC,全名是Model View Controller,是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller),具有耦合性低、重用性高、生命周期成本低等优点。

python--Django 00 WEB框架原理_第3张图片

MVC:Model(模型)、Template(模板)和View(视图),也就是MTV框架。 

两种模式的区别与联系进一步学习:点击

 

5 服务器网站环境LAMP和LNMP

点击 1(https://zhidao.baidu.com/question/584804822.html)  

点击 2(https://blog.csdn.net/qq_38461232/article/details/91127424)

你可能感兴趣的:(#,07python,Django)