首页 > 编程 > Python > 正文

Python(17):Web应用

2019-11-06 06:39:55
字体:
来源:转载
供稿:网友
REST框架:Web框架由它的创始人之一Roy Fielding于2000年定义。成为REST(RePResentational State Transfer,表示状态转移)。架构最基础的特性是其用途,如果不以用途为指导,将没有办法区分好的架构和坏的架构。Web服务器没有必要指导客户端之前发出的请求,由于这个原因,Web浏览器在发出的每个请求中都要向站点传递cookie和身份验证凭据,而不是在每个长会话开始时只传递一次。HTTP会话的生存时间就是客户端与服务端之间的一次来回的事务处理时间:客户端向服务端请求一个文档,服务端发出响应,响应中要么包含请求文档,要么解释服务器为什么不能够传送该文档。在FTP和SSH等协议中,客户端与服务器在每个会话中药多次通信,所以服务端必须保存通信的状态信息,这样可以根据上一次通信的状态理解下一次通信。REST将这些状态信息放在客户端上。HTTP的4个基本操作:GET 检索资源的表示形式POST 修改资源使其符合新的表现形式PUT 依据提供的表示形式创建新资源DELETE 删除某个已经存在的新资源Python自带了Web服务器的模块,只需要激活就能用一个简单的Web服务器代码:
#!/usr/bin/env python 3.4import http.serverfrom http.server import HTTPServerfrom http.server import BaseHTTPRequestHandlerdef run(server_class = HTTPServer, handler_class = BaseHTTPRequestHandler):    server_address = ('',8000)#设置端口    httpd = server_class(server_address, handler_class)    httpd.serve_forever()if __name__ == '__main__':    run()再看一个复杂一点的服务端,打印出接受的请求以及发回去的内容:
#!/usr/bin/env python 3.4import http.serverfrom http.server import SimpleHTTPRequestHandlerfrom http.server import HTTPServerPORT = 8000 #端口号class VisibleHTTPRequestHandler(SimpleHTTPRequestHandler):    def log_request(self, code='-', size='-'):        "在do_GET的时候调用到"        print(self._heading("HTTP Request"))        print(self.raw_requestline,)        for header, value in self.headers.items():#http头的内容            print(header + ":", value)    def do_GET(self, method='GET'):        self.wfile = FileWrapper(self.wfile)        SimpleHTTPRequestHandler.do_GET(self)#处理客户端的请求        print("")        print(self._heading("HTTP Response"))        print(self.wfile)#将内容打印出来    def _heading(self, s):        line = '=' * len(s)        return line + '/n' + s + '/n' + line#对文件进行一层封装class FileWrapper:    def __init__(self, wfile):        self.wfile = wfile        self.contents = []    def __getattr__(self, key):        return getattr(self.wfile, key)    def write(self, s):        self.contents.append(s)        self.wfile.write(s)    def __str__(self):        print(self.contents)        return ''.join(str(s) for s in self.contents)if __name__ == '__main__':    httpd = HTTPServer(('localhost', PORT), VisibleHTTPRequestHandler)    httpd.serve_forever()

看一看打印的日志,
============HTTP Request============b'GET /index.html HTTP/1.1/r/n' #这是一条命令。GET是动词,资源标识符是/index.html,http版本号:HTTP/1.1#下面是一系列头的键值对,提供了关于请求的额外信息Host: localhost:8000 #目标主机的地址和端口Connection: keep-alive #链接的方式,持久链接Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8#客户端希望接受的数据类型Upgrade-Insecure-Requests: 1 #让浏览器自动从http升级到https。User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0#包含了操作系统版本,CPU类型,浏览器版本等信息Accept-Encoding: gzip, deflate, sdch #表明浏览器有能力解码的编码类型Accept-Language: zh-CN,zh;q=0.8 #表示浏览器所支持的语言类型
=============HTTP Response=============b'HTTP/1.0 200 OK/r/n #响应状态Server: SimpleHTTP/0.6 Python/3.4.0/r/n #服务器版本Date: Mon, 06 Mar 2017 04:06:04 GMT/r/n #日期Content-type: text/html/r/n #文件类型Content-Length: 137/r/n #文件长度Last-Modified: Thu, 02 Mar 2017 07:33:15 GMT/r/n/r/n'b'#最后更改日期#<!DOCTYPE HTML>/r/n<html>/r/n<body>/r/n<h1> fable /xb3/xcc/xd0/xf2/xd4/xb1 http://blog.csdn.net/u012175089</h1>/r/nxxxxxxxxx fable xxxxxxxxxx/r/n/r/n</body>/r/n</html>/r/n'
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表