定制小程序开发分清前端和后端,定制小程序开发前后端分离,定制小程序开发后端进行数据的处理,定制小程序开发前端进行的是数据的格定制小程序开发式化和显示
一、B/S开发和HTTP协议(分清楚CS和BS的区别)
B/S定制小程序开发其实就是一种特殊的C/S B/S指的是Browser-Server
定制小程序开发将浏览器认为是特殊的客户端(client),其支持HTTP协议,能够通过URL定制小程序开发向服务端发起请求,定制小程序开发等待服务端返回HTML等数据,定制小程序开发并在浏览器内可视化展示的程序
Server,支持HTTP(s) 协议,定制小程序开发能够接受众多客户端发起的HTTP协议请求,定制小程序开发经过处理将HTML定制小程序开发等数据返回给浏览器
定制小程序开发本质上来说,BS是一种特殊的CS,即客户端是一种支持HTTP协议且能解析并渲染HTML的软件,服务端必须是能够接收多客户端HTTP访问的服务器软件
HTTP协议底层基于TCP协议实现
BS开发分为两端开发:
1.客户端开发,或称:如HTML,CSS(层叠样式表),JavaScript等
2.服务端开发,Python有WSGI,Django,Flask,Tornado等
HTTP协议
该协议是无状态协议,同一个客户端的两次请求之间没有任何关系,从服务器端角度来说,它不知道这两个请求来自同一个客户端
cookie 解决了无状态,引入cookie之后服务器端会通过键值对来识别请求连接的客户端
就是服务器端必须要求浏览器端要保留的键值对,每次发出请求时会一并将cookie发送到服务器端
类型为“小型文本文件”,是某些网站为了辨别用户身份,进行跟踪而储存在用户本地终端上的数据(通常经过加密),由用户计算机暂时或永久保存的信息
键值对消息;浏览器发起每一请求时,都会把cookie消息发给服务器端;是一种客户端,服务器端传递数据的技术;服务端可以通过判断这些信息,来确定这次请求是否和之前的请求有关联;一般来说cookie信息是在服务器端生成,返回给客户端的;客户端可以自己设置cookie信息
类似的还有session
URL组成
URL可以说就是地址,uniform resource locator统一资源定位符,每一个链接指向一个资源供客户端访问
scheme模式,协议:
http,ftp,https,file,mailto等等,mysql等都是类似这样写
host:port
www.baidu.com:80 80端口是默认端口可以不写,域名会使用DNS解析,域名会解析成IP才能使用,实际上会对解析后返回的IP的TCP的80端口发起访问
/path/to/resource
path,指向资源的路径
?key1=value1&key2=value2
query string,查询字符串,问号分割,后面key=value形式,且使用&符号分割
参数处理和资源路径的处理是重中之重
HTTP消息
消息分为Request,Response
Request:浏览器向服务器发起的请求
Response:服务器向客户端请求的响应
请求和响应消息都是由请求行,Header消息报头,Body消息正文组成
请求
请求消息行(第一行):请求方法Method 请求路径 协议版本CRLF(中间是空格隔开 CRLF表示回车换行)
请求方法Method(重点)
推荐工具 postman
常见传递消息的方式
1.GET方法使用Query String
通过查询字符串在URL中传递参数 将请求到的资源全部放在Header部分,具体在请求行第一行
2.POST方法提交数据
3.URL中本身就包含信息
响应
响应消息行: 协议版本 状态码 消息描述CRLF
status code状态码
无状态,有连接和短连接
无状态之前提到过,指的是服务器无法知道2次请求之间的联系,即使是前后2次同一个浏览器也没有任何数据能够判断出是同一个浏览器的请求,后来可以通过cookie,session来判断
有连接,是因为它基于TCP协议,是面向连接的,需要三次握手,四次断开
短连接,HTTP1.1之前,都是一个请求一个连接,而TCP的连接创建销毁成本高,对服务器有很大的影响,所以自HTTP1.1开始,支持keep-alive,默认也开启(设置为True),一个连接打开后,会保持一段时间(可设置),浏览器再访问该服务器就是用这个TCP连接,减轻了服务器压力,提高了效率
二、WSGI概述和APP端开发(搞不懂)
WSGI主要规定了服务器端和应用程序(app)间的接口 WSGI:Web服务器网关接口(Web Server Gateway Interface)
WSGI服务器------wsgiref
wsgiref是python关于WSGI的参考实现库 ref表示参考的意思(reference)
WSGI服务器作用
1.监听HTTP服务端口(TCPServer,默认端口80)
2.接收浏览器端的HTTP请求并解析封装成environ环境数据
3.负责调用应用程序,将environ和start_response方法传入
4.将应用程序响应的正文封装成HTTP响应报文返回浏览器端
WSGI APP应用程序端
1.应用程序应该是一个可调用对象
Python中应该是函数,类,实现了_call_f方法的类的实例
2.这个可调用对象应该接收两个参数
3.以上的可调用对象实现,都必须返回一个可迭代对象
environ和start_response这两个参数名可以是任何合法名,但是一般默认都是这两个名字
应用程序端还有其他的规定,暂且不用关心
environ
environ是包含HTTP请求信息的dict对象
start_response
三、类Flask框架请求封装
服务器端
服务器程序需要调用符合上述定义的可调用对象APP,传入environ,start_response,APP处理后,返回响应头和可迭代对象的正文,由服务器封装返回浏览器端
simple_server只是参考用,不能用于生产
测试用命令
-I使用HEAD方法
-X指定方法 -d传输数据
到这里就完成了一个简单的web程序开发
为了更好的理解WSGI框架的工作原理,现在开始动手自己写一个web框架
类Flask框架实现
从这里开始将一步步完成一个WSGI的web框架,从而了解web框架的内部机制
WSGI请求environ处理
WSGI服务器程序会帮我们处理HTTP请求报文,但是提供的environ还是一个用起来不方便的字典
最重要的是倒数第三四行的内容
QUERY_STRING查询字符串的解析
WSGI服务器程序处理过HTTP报文后,返回一个字典,可以得到查询字符串('QUERY_STRING','id=1234&name=tom')。这个键值对用起来不方便
1.编程序解析
2.使用cgi模块 已过期,不建议使用
可以看到使用这个库,可以解析查询字符串,一定要注意到value是列表,why?
这是因为同一个key可以有多个值
cgi模块过期了,建议使用urllib
3.使用urllib库
parse_qs函数,将同一个名称的多值保存在字典中,使用了列表保存
comment=1,a,c这不是多值,这是一个值
age是多值
environ的解析----webob库
环境数据有很多,都是存在字典中的,字典的存取方式没有对象的属性访问方便
使用第三方库webob,可以把环境数据的解析,封装成对象\
webob简介
Python下,可以对WSGI请求进行解析,并提供对响应进行高级封装的库
安装直接使用pip命令即可 pip install webob
webob.Request对象
将环境参数解析并封装成requests对象
GET方法,发送的数据是URL中Query string,在Request Header中
request.GET就是一个字典MultiDict,里面就封装着查询字符串
POST方法,“提交”的数据是放在Request Body里面,但是也可以同时使用Query String。
request.POST可以获取Request Body中的数据,也是个字典MultiDict
若不关心什么方法提交,只关心数据,可以使用request.params,它里面是所有提交数据的封装
MultiDict
MultiDict允许一个key存了好几个值
导入方式: from webob.multidict import MultiDict
webob.response对象
html='<h1>欢迎光临</h1>'.encode("utf-8")
return [html]
wsgify.dec装饰器
from webob.dec import wsgify
然后在模块上面 @wsgify便完成了装饰