admin管理员组

文章数量:1794759

网络编程

网络编程

Python高级语法——网络编程——进阶学习笔记

文中案例参考:

1 TCP/IP协议与HTTP协议

1.0 TCP/IP协议(簇)

  • 互联网协议包含了上百种协议标准,但是最重要的两个协议是TCP和IP协议,所以,大家把互联网的协议简称TCP/IP协议(族)

  • TCP/IP传输分四层:
    网络接口层
    网际层
    传输层
    应用层
    参考002_1/002_2图片

  • 另外一套标准OSI协议
    参靠图片002_3

1.1 HTTP协议是什么?

  • http协议全名叫做:超文本传输协议。

  • http协议就是通信的双方(通常指客户端和服务器)进行数据传输的一种约定好的规范!

  • 是互联网上最广泛的一种协议。

  • 通俗理解就是规定浏览器和服务器之间数据传输的一种规定约定规范。

    例如,我们打开浏览器,输入,这就是通过http协议进行的一次访问。
    其实,说了这么多,可能我们对http的理解,还是很模糊,不着急,我们接着往后看。
    我们举个例子,以前的人们通信的时候通过写信的方式。
    而一般写信是有格式,一般分为称呼、正文、结尾、署名、日期等等,
    写信人通过这种格式写完信寄出去,收信人也通过这种格式进行回信。
    而这种格式就是某种意义上的一种规范协议。当然,很多人会问,不按照这种方式写信,别人都读不懂了吗!
    当然不是,人是活的,但机器是死的。互相通信的两个机器只能通过某种约定好的协议进行通信,
    只有通过这种约定好的方式通信,通信的双方才能看懂对方发过来的是什么。

  • http协议协议规定就体现在:请求报文(浏览器发给服务器)和响应报文(服务器发给浏览器)里面

    • 报文里面有四部分组成:状态行、头部(首部行)、空行、体(正文信息)
    • 头(Head)和正文(Body)以一个空行隔开,参考005_005HTTP请求报文图片
    • 头信息里面看似类似字典的键值,实际是一连串的字符串,以空格和换行隔开
    • 目前使用的协议为HTTP/1.1 HTTP/2.0
  • 请求报文

    请求报文:
    GET / HTTP/1.1
    Host: 127.0.0.1:8080
    Connection: keep-alive
    Cache-Control: max-age=0
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3719.400 QQBrowser/10.5.3715.400
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8
    Accept-Encoding: gzip, deflate, br
    Accept-Language: zh-CN,zh;q=0.9

    最主要的头两行分析如下:
    第一行:
    GET / HTTP/1.1
    GET表示一个读取请求,将从服务器获得网页数据,/表示URL的路径,URL总是以/开头,/就表示首页,
    最后的HTTP/1.1指示采用的HTTP协议版本是1.1。目前HTTP协议的版本就是1.1,
    但是大部分服务器也支持1.0版本,主要区别在于1.1版本允许多个HTTP请求复用一个TCP连接,以加快传输速度。

    从第二行开始,每一行都类似于字典格式: Xxx: abcdefg
    Host: www.sina.com
    表示请求的域名是www.sina.com。如果一台服务器有多个网站,服务器就需要通过Host来区分浏览器请求的是哪个网站。
    参考图片:005_005/006/007
    005_010HTTP请求报文实例

  • 响应报文

    HTTP/1.1 200 OK
    Date: Wed, 31 Jul 2019 03:25:29 GMT
    Content-Type: text/html; charset=utf-8
    Transfer-Encoding: chunked
    Connection: keep-alive
    Server: nginx
    Cache-Control: public, max-age=900, must-revalidate
    Content-Security-Policy: default-src ‘self’; script-src ‘self’ ‘unsafe-inline’ ‘unsafe-eval’ g.click.taobao.com platform.sina.com.cn suggestion.baidu.com www.baidu.com hm.baidu.com nssug.baidu.com tui.cnzz.net www.google-analytics.com *.googlesyndication.com static.huohu123.com .html .html; img-src * data:; child-src ‘self’ *.firefoxchina.cn *.17huohu.com; frame-src ‘self’ *.firefoxchina.cn *.17huohu.com www.taobao.com entry.baidu.com; frame-ancestors ‘self’ *.firefoxchina.cn tongji.baidu.com about:; style-src ‘self’ ‘unsafe-inline’; font-src ‘self’ data: ; report-uri /_/csp-reports
    Content-Encoding: gzip
    Age: 629
    X-Via: 1.1 PShbtssxve43:4 (Cdn Cache Server V2.0), 1.1 PSscyd4hb221:12 (Cdn Cache Server V2.0)

    HTTP响应分为Header(包含状态栏和首部行)和Body两部分(Body是可选项)
    响应报文的Header用来告诉浏览器如何解析Body(用什么解码,语言是什么等等)
    Body是浏览器显示出来的内容

    我们在Network中看到的Header最重要的几行如下:
    HTTP/1.1 200 OK
    200表示一个成功的响应,后面的OK是说明。
    如果返回的不是200,那么往往有其他的功能,例如
    失败的响应有404 Not Found:网页不存在
    500 Internal Server Error:服务器内部出错
    …等等…

    Content-Type: text/html
    Content-Type指示响应的内容,这里是text/html表示HTML网页。
    请注意,浏览器就是依靠Content-Type来判断响应的内容是网页还是图片,是视频还是音乐。
    浏览器并不靠URL来判断响应的内容,所以,即使URL是.jpg,它也不一定就是图片。
    HTTP响应的Body就是HTML源码。

    请再次注意,Body的数据类型由Content-Type头来确定,
    如果是网页,Body就是文本,如果是图片,Body就是图片的二进制数据。
    当存在Content-Encoding时,Body数据是被压缩的,最常见的压缩方式是gzip,
    所以,看到Content-Encoding: gzip时,需要将Body数据先解压缩,才能得到真正的数据。
    压缩的目的在于减少Body的大小,加快网络传输。

    参考图片:005_008/009
    005_011HTTP响应报文实例

  • 模拟HTTP请求

    1. 打开网络助手,选择TCP服务器端,打开
    2. 打开浏览器,输入网址:127.0.0.1:8080
    3. 打开网址,网络调试助手中就接收到请求报文了

    请求报文:
    GET / HTTP/1.1
    Host: 127.0.0.1:8080
    Connection: keep-alive
    Cache-Control: max-age=0
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3719.400 QQBrowser/10.5.3715.400
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8
    Accept-Encoding: gzip, deflate, br
    Accept-Language: zh-CN,zh;q=0.9

    1. 网络调试助手,编辑消息发送回去,作为响应报文

    响应报文(至少有以下三行信息,状态,空行,正文):
    HTTP/1.1 200 OK

    我是响应正文

    参考图片:006_http请求过程模拟结果

1.2 HTTP协议的特点

  • http协议的特点总结起来就一下几点:
    1、http协议支持客户端/服务端模式,也是一种请求/响应模式的协议。
    2、无连接
    所谓的无连接就是服务器收到了客户端的请求之后,响应完成并收到客户端的应答之后,即断开连接。
    限制每次的连接只处理一次请求。从而节省传输时间。
    3、无状态
    http协议对事务的处理没有记忆能力。
    也就意味着如果需要前面的信息,只能重传,这无形之中增加数据的传输量。
    这种方式某种方面上讲解放了服务器,但是却不利于客户端与服务器的连接。
    为了弥补这种不足,产生了两项记录http状态的技术,一个叫做Cookie,一个叫做Session。
    4、简单快捷
    所谓的简单快捷是指客户端向服务器请求服务时,一般来说只需要传输请求方法和路径,就能进行访问。
    5、灵活
    这里主要指的是客户端可以通过http协议传输任意类型的数据。
    比如传输.jpg文件、.ppt文件等等,只需要设定content-type就可以进行传输。

1.3 http请求/响应的步骤是什么(浏览器访问服务器的步骤)?

  • 具体步骤:
    0、解析域名:浏览器输入网址,通过DNS服务器解析域名,浏览器得到web服务器的IP地址
    1、客户端连接到web服务器:客户端,我们通常指的是浏览器,与web服务器的http端口(默认情况下80)建立一个TCP套接字的连接。
    2、发送HTTP请求:通过TCP套接字,浏览器向web服务器发送一个请求报文,一个请求报文包括请求行、请求头、空行、请求体四部分。
    3、服务器端解析请求并返回http响应:web服务器解析请求,定位资源,返回响应报文。
    4、释放TCP连接:web浏览器主动关闭TCP套接字,关闭TCP连接。
    5、客户端浏览器解析响应报文,解析成HTML内容,经过浏览器的渲染之后就能展示给人们了。

    在浏览器中输入一个网址时,需要通过DNS服务器解析出ip地址(域名解析)
    当得到ip地址之后,浏览器发送数据,以tcp的方式3次握手链接服务器
    以tcp的方式发送http协议的请求数据 给 服务器
    服务器tcp的方式回应http协议的应答数据 给浏览器
    浏览器发送数据,以tcp4次挥手的方式断开连接
    浏览器中显示出html的内容

    参考图片:
    005_003HTTP代理访问WEB的流程
    005_004上网HTTP协议流程

1.4 NAT(网络地址装器)

  • 家庭网络上网网址地需要进行转换

  • 说明

    1. 当在家里用宽带链接上网时,会把电话线(今天很多地方都是光纤)---->调制解调制(简称猫)------->电脑等设备
    2. 电脑会得到来自电信服务商的一个公网ip地址(切记只有公网ip地址才能上网),此时可以直接上网happy…
    3. 为了能够让多台设备都可以上网,需要将数据进行“分流” 电话线(今天很多地方都是光纤)---->调制解调制(简称猫)------->路由器------>电脑等设备
    4. 此时路由器的一端有一个公网ip地址,剩下的4个(路由器型号不同个数不同)可以接入电脑等设备 并且 它们的ip是私有ip(例如 192.168.1.2)
  • 上网网络地址转换步骤:

    1. 当一个电脑(192.168.1.2)上网时,先通过DNS协议解析出某个域名对应的ip,
    2. 然后发送数据时,在经过路由器时转换为公网IP以及路由器自己分配的临时端口
      192.168.1.2:6789—>192.168.1.1路由器—>116.226.52.212:6539—>猫—>万维网
    3. 接收数据时,在经过路由器时转换为路由器之前记录的IP以及port端口
      万维网—>猫—>116.226.52.212:6539—>192.168.1.1路由器—>192.168.1.2:6789

1.5 常用网络通信名词

  • 总结
    MAC地址:在设备与设备之间数据通信时用来标记收发双方(网卡的序列号)
    IP地址:在逻辑上标记一台电脑,用来指引数据包的收发方向(相当于电脑的序列号)
    网络掩码:用来区分ip地址的网络号和主机号
    默认网关:当需要发送的数据包的目的ip不在本网段内时,就会发送给默认的一台电脑,成为网关
    集线器:已过时,用来连接多态电脑,缺点:每次收发数据都进行广播,网络会变的拥堵
    交换机:集线器的升级版,有学习功能知道需要发送给哪台设备,根据需要进行单播、广播
    路由器:连接多个不同的网段,让他们之间可以进行收发数据,每次收到数据后,ip不变,但是MAC地址会变化
    光猫:光猫是一种类似于基带modem(数字调制解调器)的设备,和基带modem不同的是接入的是光纤专线,是光信号。
    光电收发器是用局域网中光电信号的转换,而仅仅是信号转换,没有接口协议的转换。
    DNS:用来解析出IP(类似电话簿),通过网址解析出对应的IP
    http服务器:提供浏览器能够访问到的数据

  • 补充
    网络掩码:网络掩码用来标记IP地址哪些数字是网络号,哪些是主机号

2 Web服务器

  • Web静态服务器
    • 参考案例001/002/003/004_Web静态服务器
    • 多进程的优势上面案例还体现不出来,但是当有成千上万个浏览器同时访问时候
    • 多进程多线程多协程就体现出来了优势

2.1 TCP–3次握手4次挥手

  • TCP在真正的读写操作之前,server与client之间必须建立一个连接,
    当读写操作完成后,双方不再需要这个连接时它们可以释放这个连接,
    连接的建立通过三次握手,释放则需要四次握手,
    所以说每个连接的建立都是需要资源消耗和时间消耗的。

  • 对象
    TCP客户端与服务器端

  • 目的(礼尚往来):

    • 3次握手:建立连接(占用资源)
    • 4次挥手:断开连接(释放资源)
  • 通俗理解:
    我发你数据你要回我(过去回来共2次),
    你发我数据我要回你(过去回来共2次),
    一来一去一共4次(实际中握手有2次是1次完成的,就变成了3次握手,4次挥手)

  • 3次握手4次挥手流程:

  • 3次握手:

    • TCP客户端的connect方法默认是阻塞的,只有3次握手成功,创建连接后才解阻塞
      参考案例:002文件夹中的001_TCP客户端
    • 第1次:客户端发送数据给服务器端,客户端要连接服务器,让服务器准备好资源
    • 第2次:服务器发送数据给客户端,告诉客户端我已经准备好了资源,同时让客户端也准备好资源
      (实际第2次是两次,但是都是服务器发送给客户端,当做1次
      第2-1次回复第1次客户端过来的数据,
      第2-2次是服务器发送数据给客户端,让客户端准备好资源
      为了减少连接次数,可以当做一次握手)
    • 第3次:客户端确认也准备好了,双方都已经准备好资源,创建连接
    • 3次握手,建立连接成功(占用资源)
  • 4次挥手:

    • 目的:客户端和服务器端断开连接
    • 注意:TCP连接都是双工模式,同时可发收数据
    • 第1次:客户端关闭发送数据,客户端发送消息给服务器,我要关闭发送了
    • 第2次:服务器发送数据给客户端,我已收到数据,我要关闭接收数据了
    • 第3次:服务器发送数据给客户端,我要关闭发送数据了
    • 第4次:客户端发送数据给服务器,我已接收到数据,我也关闭接收数据了
    • 上述过程:一般都是客户端先发起关闭close连接请求
    • 注意:
      2,3都是服务器发数据给客户端,但是2和3不能合并,有可能服务器延时一会儿在发送我要关闭发送数据,因此2次挥手是独立的
      第3次服务器发送数据给客户端,可能客户端收不到,一般加入超时等待,如果客户端没有回应,
      服务器就在发送一次数据,一般超时等待2msl
    • 4次挥手,断开连接成功(释放资源)
    • 参考图片:007_TCP通信过程的三次握手四次挥手
    • 图片中:x x+1 y+1 y+2 用于数据之间的确认,发送一个值过来,接收到数据则返回一个值

2.2 TCP短连接长连接

  • TCP短连接
    模拟一种TCP短连接的情况:
    1. client 向 server 发起连接请求
    2. server 接到请求,双方建立连接
    3. client 向 server 发送消息
    4. server 回应 client
    5. 一次读写完成,此时双方任何一个都可以发起 close 操作
    在步骤5中,一般都是 client 先发起 close 操作。当然也不排除有特殊的情况。
    从上面的描述看,短连接一般只会在 client/server 间传递一次读写操作!

  • TCP长连接
    再模拟一种长连接的情况:
    1. client 向 server 发起连接
    2. server 接到请求,双方建立连接
    3. client 向 server 发送消息
    4. server 回应 client
    5. 一次读写完成,连接不关闭
    6. 后续读写操作…
    7. 长时间操作之后client发起关闭请求

  • TCP长/短连接的优点和缺点

    • 长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。
      对于频繁请求资源的客户来说,较适用长连接。
    • client与server之间的连接如果一直不关闭的话,会存在一个问题,
      随着客户端连接越来越多,server早晚有扛不住的时候,这时候server端需要采取一些策略,
      如关闭一些长时间没有读写事件发生的连接,这样可以避免一些恶意连接导致server端服务受损;
      如果条件再允许就可以以客户端机器为颗粒度,限制每个客户端的最大长连接数,
      这样可以完全避免某个蛋疼的客户端连累后端服务。
    • 短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。
    • 但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。
  • TCP长/短连接的应用场景

    • 长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,比如数据库的连接。
      每个TCP连接都需要三次握手,这需要时间,如果每个操作都是先连接,
      再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,
      再次处理时直接发送数据包就OK了,不用建立TCP连接。
      例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,
      而且频繁的socket 创建也是对资源的浪费。
    • 而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,
      而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,
      如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,
      那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。
  • 参考案例006/007

2.3 epoll

  • 案例006/007中,处理每个客户端的请求,使用的for循环处理每一个客户端

  • 这种循环检查的方式,被称为轮询,这种方式效率很低,如果有大量数据需要大量耗时

  • 为了解决上述问题,可以使用epoll,当一个客户端来了数据,就通知服务器进行处理

  • 所有客户端都放在一个监视列表中,这种方式被称为事件通知

  • I/O 多路复用的特点:
    通过一种机制使一个进程能同时等待多个文件描述符,
    而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态,
    epoll()函数就可以返回。 所以, IO多路复用,本质上不会有并发的功能,
    因为任何时候还是只有一个进程或线程进行工作,
    它之所以能提高效率是因为select\epoll 把进来的socket放到他们的 ‘监视’ 列表里面,
    当任何socket有可读可写数据立马处理,那如果select\epoll 手里同时检测着很多socket,
    一有动静马上返回给进程处理,总比一个一个socket过来,阻塞等待,处理高效率。

  • 当然也可以多线程/多进程方式,一个连接过来开一个进程/线程处理,
    这样消耗的内存和进程切换页会耗掉更多的系统资源。
    所以我们可以结合IO多路复用和多进程/多线程来高性能并发,
    IO复用负责提高接受socket的通知效率,
    收到请求后,交给进程池/线程池来处理逻辑。

  • 参考案例008

  • epoll是在Linux2.6内核后才实现的,epoll不能在windows下运行,属于linux独有
    可以安装虚拟机运行008案例
    008案例windows下运行会出现错误
    epl = select.epoll()
    AttributeError: module ‘select’ has no attribute ‘epoll’

3 MSGI Mini Web框架

3.1 动态页面请求

  • 动态请求:资源并不是固定的,请求的时候才生成,请求获取当前时间(时间随时在变)

  • 静态请求:资源一直存在(文字,图片等),请求时候拿去

  • 浏览器请求动态页面过程
    参考图片009/010
    案例001/002

3.2 WSGI接口 MiniWeb框架 介绍

  • Web Server Gateway Interface (或简称 WSGI,读作“wizgy”)

  • WSGI允许开发者将选择web框架和web服务器分开。
    可以混合匹配web服务器和web框架,选择一个适合的配对。
    比如,可以在Gunicorn 或者 Nginx/uWSGI 或者 Waitress上运行 Django, Flask, 或 Pyramid。
    真正的混合匹配,得益于WSGI同时支持服务器和架构:

  • web服务器必须具备WSGI接口,所有的现代Python Web框架都已具备WSGI接口,
    它让你不对代码作修改就能使服务器和特点的web框架协同工作。

  • WSGI由web服务器支持,而web框架允许你选择适合自己的配对,
    但它同样对于服务器和框架开发者提供便利使他们可以专注于自己偏爱的领域和专长而不至于相互牵制。
    其他语言也有类似接口:java有Servlet API,Ruby 有 Rack。

  • 定义WGGI接口
    WSGI接口定义非常简单,它只要求Web开发者实现一个函数,就可以响应HTTP请求。
    我们来看一个最简单的Web版本的“Hel、lo World!”

    def application(environ, start_response):
    start_response(‘200 OK’, [(‘Content-Type’, ‘text/html’)])
    return ‘Hello World!’

    上面的application()函数就是符合WSGI标准的一个HTTP处理函数,它接收两个参数:
    environ:一个包含所有HTTP请求信息的dict对象
    start_response:一个发送HTTP响应的函数
    该函数传入两个参数:
    ‘200 OK’
    [(‘Content-Type’, ‘text/html’)]
    - 参考002_MSGI_MiniWeb_Web服务器_支持MSGI接口案例
    - 参数作为属性然后设置为为header的值

    整个application()函数本身没有涉及到任何解析HTTP的部分,也就是说,
    把底层web服务器解析部分和应用程序逻辑部分进行了分离,这样开发者就可以专心做一个领域了

    不过,等等,这个application()函数怎么调用?如果我们自己调用,
    两个参数environ和start_response我们没法提供,返回的str也没法发给浏览器。

    所以application()函数必须由WSGI服务器来调用。有很多符合WSGI规范的服务器。
    而我们此时的web服务器项目的目的就是做一个既能解析静态网页还可以解析动态网页的服务器

    Web服务器通过WSGI协议最终返回header和body信息给浏览器,参考图片009/010

3.3 Web服务器使用WSGI接口

  • 静态和动态单独处理参考案例:
    001_MSGI_面向对象_Web服务器_解析静态资源请求
    002_MSGI_面向对象_Web服务器_集成解析动态资源请求

  • Web服务器使用WSGI接口

  • 001_MSGI_MiniWeb_Web服务器和逻辑处理代码分开
    动态请求单独使用mini_frame处理请求

  • 002_MSGI_MiniWeb_Web服务器_支持MSGI接口
    定义一个MSGI接口,Web服务器接入MSGI接口用于处理header和body信息
    然后返回给服务器,再由服务器返回给浏览器

  • 003_MSGI_MiniWeb_Web服务器__dict使用(通过传递字典实现浏览器不同的动态请求)
    002基础进行升级,使用dict传递参数,传递参数给web框架,
    web根据传过来参数处理具体不同的动态请求

  • 004_MiniWeb_Web服务器_实现模板文件_使用指定模板
    各功能进行封装到包里面
    代码里面直接导入模块,调用函数
    web_server作为服务器控制整个过程
    dynamic里面放置web框架,用于处理动态请求
    static里面放置css js静态文件,静态请求直接打开调用
    templates放置一些固定的前端html框架页面,到时候动态请求可以直接调用

  • 005_MiniWeb_Web服务器_实现模板文件_指定端口及框架
    运行代码时候指定端口和框架
    我们就可以指定不同的接口和框架了
    运行代码时候传参数,只需要主代码main函数中加入sys.argv
    argv就是CMD窗口中运行时python之后传递来的参数
    然后服务器main函数中提取出传递的参数

    CMD窗口中运行python脚本(虚拟环境下运行py文件)
    参考:

    第一步:指定端口
    main函数中修改代码用于接收port参数,然后WSGIServer(port)传递到
    self.tcp_server_socket.bind(("", port))中绑定端口
    CMD虚拟环境下指定端口运行代码:
    python web_server.py 7888
    浏览器打开:http://127.0.0.1:7788/center.py

    第二步:指定框架
    main函数中修改代码用于接收框架的参数,然后WSGIServer(port, app)传递到
    self.application = app

    直接使用外面传入的模块参数self.application = app

    body = self.application(env, self.set_response_header)
    CMD虚拟环境下指定端口运行代码:
    python web_server.py 7788 mini_frame:application
    浏览器打开:http://127.0.0.1:7788/center.py

  • 006_MiniWeb_Web服务器_实现模板文件_添加Web服务器的配置文件
    005还是解耦(功能分离,模块化)不够充分,006进行升级
    005中的web服务器中还有框架的相关代码,53和148行还有处理静态请求的文件夹和处理动态请求的文件夹路径
    006中将该部分内容分离出来,单独放到一个web_server.conf配置文件中
    该配置文件专门用于存储处理静态和动态请求的框架
    如此,就将服务器和框架完全分离了
    以后具体处理的框架都单独放在文件夹中,然后将框架路径添加到配置文件中
    后期修改,就只需要修改配置文件和框架里面的文件了,服务器文件不用修改了
    CMD窗口中运行python脚本(虚拟环境下运行py文件)
    参考:
    CMD虚拟环境下指定端口运行代码:
    python web_server.py 7788 mini_frame:application
    浏览器打开:http://127.0.0.1:7788/center.py

  • 007_MiniWeb_Web服务器_实现模板文件_添加路由功能_带有参数的装饰器
    006功能继续升级,服务器框架添加路由功能
    006项目升级,if语句升级,如果有大量的功能,则需要非常多的elif语句
    因此我们使用装饰器和字典实现了路由功能,
    根据浏览器的请求是什么,到时候就调用什么函数为其服务,就是路由实现的

    路由是什么?

    根据浏览器的请求是什么,到时候就调用什么函数为其服务,就是路由实现的

    什么请求用什么服务,安排这个步骤的就是路由

    CMD虚拟环境下指定端口运行代码:
    python web_server.py 7788 mini_frame:application
    浏览器打开:http://127.0.0.1:7788/center.py

  • 008_MiniWeb_Web服务器_实现模板文件_添加MySQL功能

    • 导入外部的sql数据文件到本地MySQL数据库
      • 先切换到要导入数据的数据库
        use stock_db
      • 导入数据
        source sql文件的路径
        (注意你的文件路径要是复制来的,windows下要将""全部换成“/”)
        mysql> source D:/stock_db.sql
        007项目升级,支持查询MySQL数据,然后将其返回
        专门定义一个my_sql()函数,用于连接数据库,查询数据,然后返回数据作为body
        先启动数据库然后使用stock_db数据库:
        CMD窗口执行:mysql -u root -p 密码:00xxx56
        show databases;
        use stock_db;
        CMD虚拟环境下指定端口运行代码:
        python web_server.py 7788 mini_frame:application
        浏览器打开:http://127.0.0.1:7788/my_sql.py
  • 009_MiniWeb_Web服务器_实现模板文件_添加MySQL功能_替换模板
    008项目升级,替换模板数据
    index.py处理去寻找static中的index.html模板文件
    原始模板文件里面有个{%content%},我们将其进行替换
    上面代码全部使用指定的前端模板文件替换,还未使用mysql中数据
    我们运行查看效果
    010中我们将前端模板中的固定数据替换为我们查询出来的数据
    先启动数据库然后使用stock_db数据库:
    CMD窗口执行:mysql -u root -p 密码:00xxx56
    show databases;
    use stock_db;
    CMD虚拟环境下指定端口运行代码:
    python web_server.py 7788 mini_frame:application
    浏览器打开:http://127.0.0.1:7788/index.py

  • 010_MiniWeb_Web服务器_实现模板文件_添加MySQL功能_替换模板升级版
    009项目升级,替换模板数据,使用mysql中查询到数据替换指定模板中的数据
    index.py处理去寻找static中的index.html模板文件
    原始模板文件里面有个{%content%},我们将其进行替换
    上面替换,使用%s字符串替换,元组切片取出数据
    先启动数据库然后使用stock_db数据库:
    CMD窗口执行:mysql -u root -p 密码:00xxx56
    show databases;
    use stock_db;
    CMD虚拟环境下指定端口运行代码:
    python web_server.py 7788 mini_frame:application
    浏览器打开:http://127.0.0.1:7788/index.py

    此时股票信息栏就显示出来数据库查出的股票信息了
    此时个人中心数据还是空白,我们011进行个人中心数据显示

  • 011_MiniWeb_Web服务器_实现模板文件_添加MySQL功能_替换模板升级版Plus
    010项目升级,替换模板数据,使用mysql中查询到数据替换指定模板中的数据
    011里面加入了个人中心的数据,使用内连接查询两个数据表,提取出个人中心的数据
    index.py和center.py处理去寻找static中的index/center.html模板文件
    原始模板文件里面有个{%content%},我们将其进行替换
    上面替换,使用%s字符串替换,元组切片取出数据

    先启动数据库然后使用stock_db数据库:
    CMD窗口执行:mysql -u root -p 密码:00xxx56
    show databases;
    use stock_db;
    CMD虚拟环境下指定端口运行代码:
    python web_server.py 7788 mini_frame:application
    浏览器打开:http://127.0.0.1:7788/index.py

    上面都使用了mysql查询数据,就是查询语句不一样,因此我们可以重新一个函数
    conn_sql()专门用于查询数据,传入查询语句作为参数,返回查询的结果

4 伪静态、静态和动态的区别

  • 目前开发的网站其实真正意义上都是动态网站,只是URL上有些区别,一般URL分为静态URL、动态URL、伪静态URL,他们的区别是什么?

  • SEO:
    SEO(Search Engine Optimization):汉译为搜索引擎优化。
    是一种方式:利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名。
    目的是让其在行业内占据领先地位,获得品牌收益。很大程度上是网站经营者的一种商业行为,将自己或自己公司的排名前移。

    它是一种通过分析搜索引擎的排名规律,了解各种搜索引擎怎样进行搜索、怎样抓取互联网页面、怎样确定特定关键词的搜索结果排名的技术。
    搜索引擎采用易于被搜索引用的手段,对网站进行有针对性的优化,提高网站在搜索引擎中的自然排名,
    吸引更多的用户访问网站,提高网站的访问量,提高网站的销售能力和宣传能力,从而提升网站的品牌效应。

  • 静态URL
    静态URL类似 域名/news/2012-5-18/110.html 我们一般称为真静态URL,每个网页有真实的物理路径,也就是真实存在服务器里的。
    优点是:
    网站打开速度快,因为它不用进行运算;另外网址结构比较友好,利于记忆。
    缺点是:
    最大的缺点是如果是中大型网站,则产生的页面特别多,不好管理。至于有的开发者说占用硬盘空间大,
    我觉得这个可有忽略不计,占用不了多少空间的,况且目前硬盘空间都比较大。还有的开发者说会伤硬盘,这点也可以忽略不计。
    一句话总结:
    静态网站对SEO的影响:静态URL对SEO肯定有加分的影响,因为打开速度快,这个是本质。

  • 动态URL
    动态URL类似 域名/NewsMore.asp?id=5 或者 域名/DaiKuan.php?id=17,
    带有?号的URL,我们一般称为动态网址,每个URL只是一个逻辑地址,并不是真实物理存在服务器硬盘里的。
    优点是:
    适合中大型网站,修改页面很方便,因为是逻辑地址,所以占用硬盘空间要比纯静态网站小。
    缺点是:
    因为要进行运算,所以打开速度稍慢,不过这个可有忽略不计,目前有服务器缓存技术可以解决速度问题。
    最大的缺点是URL结构稍稍复杂,不利于记忆。
    一句话总结:
    动态URL对SEO的影响:目前百度SE已经能够很好的理解动态URL,
    所以对SEO没有什么减分的影响(特别复杂的URL结构除外)。
    所以你无论选择动态还是静态其实都无所谓,看你选择的程序和需求了。

  • 伪静态URL
    伪静态URL类似 域名/course/74.html 这个URL和真静态URL类似。
    他是通过伪静态规则把动态URL伪装成静态网址。也是逻辑地址,不存在物理地址。
    优点是:
    URL比较友好,利于记忆。非常适合大中型网站,是个折中方案。
    缺点是:
    设置麻烦,服务器要支持重写规则,小企业网站或者玩不好的就不要折腾了。
    另外进行了伪静态网站访问速度并没有变快,因为实质上它会额外的进行运算解释,
    反正增加了服务器负担,速度反而变慢,不过现在的服务器都很强大,这种影响也可以忽略不计。
    还有可能会造成动态URL和静态URL都被搜索引擎收录,不过可以用robots禁止掉动态地址。
    一句话总结:
    对SEO的影响:和动态URL一样,对SEO没有什么减分影响。

本文标签: 网络编程