根据 HTTP header 收集客户端相关信息
【课程】 web2.0程序设计
【作业要求】 用 tornado 编写一段小程序,根据 HTTP header 收集客户端相关信息:是否手机、操作系统、浏览器等信息*。
【作业提示】 主要解析 Request header[“User-Agent”] 。该字符串格式可通过 wiki 链接 查 到 ; 通 过 tornado 英 文 网 站 文 档 , 知 道 用 self.request 获 取
tornado.httputil.HTTPServerRequest 对象实例,该实例有 headers 字典类型的属性。
【参考文档】 User-Agent定义及字符串格式(wiki) tornado 英 文 网 站 文 档 常见的相关字符串和代表的版本信息
【实验环境】 操作系统:Ubantu 13.10 浏览器:firefox python:2.7.5+ tornado:1.2.1版本
1.根据tonardo英文网站文档,了解到用self.request可以获取到客户端的相关信息。在这里,我先将request的比较重要的一些属性列出来,并作诠释
method
HTTP 的请求方法:GET或POST
uri
被请求的uri, 统一资源标识符,用来唯一的标识一个资源(关于uri)
path
uri的路径部分
query
uri的请求部分
version
HTTP协议的版本,如“HTTP/1.1”
headers
这是一个字典类型的属性,带有许多丰富的信息,HTTP headers是 HTTP请求和相应的核心,它承载了关于客户端浏览器,请求页面,服务器等相关的信息。
接下来我们来一起看下这里面有哪些信息:
‘Accept-Language‘: ‘zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3‘, //表示浏览器默认的语言设置,q表示优先级,q值越大等级越高
‘Accept-Encoding‘: ‘gzip, deflate‘, //表示浏览器支持的的压缩方式
‘Connection‘: ‘keep-alive‘, //表示浏览器和主机一直保持连接
‘Accept‘: ‘text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8‘,//表示浏览器支持的MIME类型
‘User-Agent‘: ‘Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:29.0) Gecko/20100101 Firefox/29.0‘,//浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 渲染引擎标识 版本信息
‘Host‘: ‘localhost:8000‘, //主机名
‘Cookie‘: ‘user=ZmZm|1417654344|5de24afe2a1e8c302f29211dfd4a726186bdc9af‘,//客户端存储的少量用户信息
‘Cache-Control‘: ‘max-age=0‘//响应缓存的有效秒速
headers[‘User-Agent‘]
浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 渲染引擎标识 版本信息
body
请求内容的主体,如果存在,是一个string类型。
remote_ip
一个表示客户端IP地址的字符串。
protocol
程序所遵守的协议
host
被请求的主机名
arguments
用来存储表示GET/POST的参数字典
files
上传的文件
connection
单个连接可以连接多个请求,通过该属性可以访问HTTP的请求
2.以下是我的这个小程序的核心代码(命名为t1.py):
#coding:utf-8 import tornado.httpserver import tornado.ioloop import tornado.options import tornado.web from tornado.httpclient import AsyncHTTPClient from tornado.options import define, options define("port", default=8000, help="run on the given port", type=int) class IndexHandler(tornado.web.RequestHandler): def get(self): print "**************NOW let me show you something about HTTPServerRequest**********" print "#method#:" print self.request.method print "#uri#:" print self.request.uri print "#path#:" print self.request.path print "#query#:" print self.request.query print "#version#:" print self.request.version print "#headers#:" print self.request.headers print "#headers[‘User-Agent‘]#:" print self.request.headers[‘User-Agent‘] print "#body#:" print self.request.body print "#remote_ip#:" print self.request.remote_ip print "#protocol#:" print self.request.protocol print "#host#:" print self.request.host print "#arguments#:" print self.request.arguments print "#files#:" print self.request.files print "#connection#:" print self.request.connection if __name__ == "__main__": tornado.options.parse_command_line() application = tornado.web.Application( handlers = [(r"/", IndexHandler)]) HTTP_SERVER = tornado.httpserver.HTTPServer(application) HTTP_SERVER.listen(options.port) tornado.ioloop.IOLoop.instance().start()
打开终端,输入以下命令行:
~$ python t1.py
打开浏览器 并打开链接:localhost:8000
这时候可以在终端看见以下输出
从headers[‘User-Agent‘]可看出, 我的实验中,
操作系统是linux,浏览器是firefox,版本是29.0 其中Gecko 是 Firefox 的呈现引擎,版本是20100101
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。