https://www.cnblogs.com/liwenzhou/articles/8620663.html
1.模拟Http请求通过socket
import socket #生成sokect实例 sk =socket.socket() #绑定ip和端口 sk.bind(("127.0.0.1",8000)) #监听 sk.listen() #写一个循环等待客户端的连接. while 1: #获取客户端的链接 conn, _ =sk.accept() #接收客户端发来的消息 data =conn.recv(8096) print(data) #给客户端回复消息 conn.send(b"hello") #关闭 conn.close() sk.close()
2.浏览器中输入 ip之后,打印data 得到的结果.
3. 分析数据
b'GET / HTTP/1.1 Host: 127.0.0.1:8000 Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36 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 Cookie: __guid=96992031.196438983550187420.1534755060914.9175; csrftoken=TGzlOSkvWQLgnrVlVuobDQ0KxLDHxycZ0VPimfwZyRXGBLP7L7v9Uc93hdzlewyY; sessionid=vodmiblg1pkrql3cfqv7l8zxw9fkhrj3 '
-
request
4. 给socket加上请求头之后 ,就能在浏览器上显示
-
response
import socket #生成sokect实例 sk =socket.socket() #绑定ip和端口 sk.bind(("127.0.0.1",8000)) #监听 sk.listen() #写一个循环等待客户端的连接. while 1: #获取客户端的链接 conn, _ =sk.accept() #接收客户端发来的消息 data =conn.recv(8096) print(data) #给客户端回复消息 conn.send(b"http/1.1 200 OK ") #想让浏览器在页面上显示出来的内容都是相应正文 conn.send(b"hello") #关闭 conn.close() sk.close()
5.显示字节或者字符串格式显示
import socket #生成sokect实例 sk =socket.socket() #绑定ip和端口 sk.bind(("127.0.0.1",8000)) #监听 sk.listen() #写一个循环等待客户端的连接. while 1: #获取客户端的链接 conn, _ =sk.accept() #接收客户端发来的消息 data =conn.recv(8096) print("bytes_formate:",data) data_str =str(data, encoding="utf-8") # 如果转换成bytes类型bytes("str",encoding="utf-8") print("str_formate:",data_str) #给客户端回复消息 conn.send(b"http/1.1 200 OK ") #想让浏览器在页面上显示出来的内容都是相应正文 conn.send(b"<h1>hello</h1>") #关闭 conn.close() sk.close()
6. 服务器程序和应用程序
对于真实开发中的python web程序来说,一般会分为两部分:服务器程序和应用程序。
服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理。
应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py 等。不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。
这样,服务器程序就需要为不同的框架提供不同的支持。这样混乱的局面无论对于服务器还是框架,都是不好的。对服务器来说,需要支持各种不同框架,对框架来说,只有支持它的服务器才能被开发出的应用使用。
这时候,标准化就变得尤为重要。我们可以设立一个标准,只要服务器程序支持这个标准,框架也支持这个标准,那么他们就可以配合使用。一旦标准确定,双方各自实现。这样,服务器可以支持更多支持标准的框架,框架也可以使用更多支持标准的服务器。
WSGI(Web Server Gateway Interface)就是一种规范,它定义了使用Python编写的web应用程序与web服务器程序之间的接口格式,实现web应用程序与web服务器程序间的解耦。
常用的WSGI服务器有uwsgi、Gunicorn。而Python标准库提供的独立WSGI服务器叫wsgiref,Django开发环境用的就是这个模块来做服务器。
wsgi 是一个协议 ,应用程序与服务器程序之间的接口,实现web与应用的解耦.
wsgiref 是django环境下的wsgi接口模块.