Django学习之web应用
1>web应用之服务器的响应
先回顾下之前网络编程 客户端-服务端交互的过程,实质上就是客户端发起建立连接的请求,服务端相应,3次握手之后,链接建好,相互(请求-响应-请求-响应。。。)通信。Web应用程序是一种可以通过Web访问的应用程序,这类应用程序一般通过浏览器来运行(浏览器来发送请求),服务器这边则针对不同的请求返回(响应)不同的内容给客户端,所以,在网络编程来说,浏览器就是socket客户端,服务器就是socket服务端。
说了一大堆,先回顾之前socket通信服务端怎么写的,
来个最基本的, 先 建立套接字对象,再绑定ip和端口,再开启监听,准备接受客户端的请求建立连接,再接受客户端的请求,再发送字符串,关闭连接。
恩,此时若有个socket客户端,也写些必要的通信代码,那么client-server就可以相互通信了,
但是通过网页访问这个socket-server会怎样呢?如下
这是正常的,刚刚说了,当前这个socket-server只适合跟socket-client通信,而不能跟web通信,为什么。
因为这个socket-server的写法不符合web-client通信的标准,首先明确一点,web通信本质上就是浏览器通过http协议发送请求,服务端收到青后再进行相应,那么这个http请求必然是有一套它自己的标准呀,不然它如何识别你这个server端究竟是要跟
应用程序交互还是跟浏览器交互呢?
恩,那么socket-server稍作修改,如下
响应的固定格式:协议版本 状态码 状态码原因短语 后面接两个\r\n\r\n
当浏览器收到这一堆字符串的时候,就会以‘\r\n\r\n’进行字符串切割,前面的信息称为响应首行,后面的就是响应主体
当解开来发现响应首行 http协议,那么浏览器就会去渲染主体信息,呈现出网页显示的内容。
2>web应用之客户端的请求
理解了web响应部分需要按照http格式的标准,我们再来看下请求部分,毫无疑问,请求也一套标准
改下代码,打印下接受的请求,我们先看下请求的部分
注意前面的 GET / HTTP/1.1\r\n,没错,这就是 请求首行,请求类型,URI ,协议版本,
再\r\n之后是请求头,再\r\n\r\n是请求体(get请求没有请求体,若需要带参数请求,它是以?连接在URI后面,这里的请求体是post请求所写的参数,记住一句:只有post请求才有请求体)
挖两张图来屡一下思路吧
如上请求报文的组成,看URI,我们之前URI就是一个/,是因为我们的浏览器上面的直接就是ip:端口,并就没有加路径,
所以是/,也可以理解为根路径,要去往一些子模块的时候就可以加上路径区分。
get和post的区别
- GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditBook?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中.
- GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
- GET与POST请求在服务端获取请求数据方式不同。
- GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.
3>再回过头来看看socket-server的响应
我们改下脚本,如下,在响应体中加上一些html标签,看下效果
h1标签成功的被解析了,那么可以继续往后添加a标签,div块,img等等,再写些样式,一个漂亮的网页是出来了。
是这样吗,是这样吗,--------------肯定不是呀,一直在这里追加标签、内容,得多累呀,
我们之前写的前面页面也是一个文件,一个html文件,把它的所有内容都读出来,再发送给客户端,不就行了
socket-server再改下,如下
我们再来看看网页这边的请求,F12---Network
相应首行就包含了URI,请求类型,状态码和说明等信息,下面还有请求头信息,Preview是响应体的预览效果,因为
Response里面是箱体的所有内容(内容,html标签,css样式等等),Preview就是浏览器渲染之后的预览效果。
恩,差不多可以了,本质上讲,这,,就是一个web框架,
4>web相应之状态码
5>get请求和post请求带参数的区别
socket-server不用改啥,若出现网页上中文显示乱码的问题,那么就是字符串编码跟你电脑的编码不一致,更换编码方式即可
如上,form表单提交按钮,触发get请求,我们看下效果,浏览器输入用户名和密码,点击提交,如下
直接用?问好拼接在URI上面了,
再换成post看下