根据 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

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。