python中的BaseHTTPServer模块学习二
时间:2009-02-02 来源:hkebao
看了刚才的那个翻译,现在来分析一下如何来自己写这样的模块,对此模块的深入理解学习!
1.类变量与实例变量的区别
类变量是static变量,一个对象对其进行修改会影响到其他对象的访问处理
而实例变量的话是指单独针对某个对象而言的变量。一个对象修改了它不会影响到其他对象的值。
通过实例来分析一下吧:
class Person(object):
objectCount=0 #这个就是类变量
def __init__(self,name):#构造方法
self.name=name
self.objectCount=0 #这个就是实例变量
def pick(self) :
self.objectCount += 1 #实例变量调用方法是self.实例变量名
#调用类变量直接用 类名.类变量名
Person.objectCount += 1 #self.__class__.count_beans += 1
print '%s pick a bean. He picked %d beans, and we all picked %d beans.' % (self.name, self.objectCount, Person.objectCount)
如果调用的话 如果想调用 类变量就要这样来写的:Person.类变量名
如果 想调用实例变量的话可以这样来写的 对象名.实例变量名
2.实现JAVA中的static方法如何在PYTHON中实现呢?
class Person:
def __init__(self,name):
self.name=name
def sum(a,b): #看到没有 没有self参数的,要实现静态方法
return a+b
sum = staticmethod(sum) #表示这个方法为静态方法了!
alex=Person("jack")
print "%sTest"%Person.sum(1, 3) #要通过类名进行调用的,直接调用这个静态方法就OK了!
在JAVA中实现起来相当简单的:
public static void sum()
因为我在BaseHTTPServer 模块中会有两个类其中的一个就会用到上面这些概念的!
BaseHTTPRequestHandler 有下列实例变量:
client_address
包含关连的客户端地址这样格式(host, port)的一个元组。
command
包含的命令 (请求类型)。例如,'GET'。
path
包含的请求路径。
request_version
包含请求版本的字符串。例如,'HTTP/1.0'。
headers
控制(Holds)由MessageClass 类变量指定的类的一个实例。这个实例解析和管理 HTTP 请求中的头。
rfile
包含一个输入流,定位在可选的输入数据开头。
wfile
包含写到客户端响应的输出流。当写给这个流时坚持使用正确的HTTP协议。
[将基本的概念学精了,那才能学得更快些的]
BaseHTTPRequestHandler 有下列类变量:
server_version
指定服务器软件版本。你可能想要重载它。格式是多个空格分隔的字符串,每个字符串的格式是name[/version]。例如,'BaseHTTP/0.2'。
sys_version
包含Python系统版本,通过 version_string 方法和 server_version 类变量,以一种方便可用的格式。例如,'Python/1.4'。
error_message_format
为构建响应到客户端的错误构建一个格式字符串。它使用括号, 关键的格式区分符,因此该格式操作对象必须是一个字典。code 关键字应该是一个整数,指定数字的 HTTP 错误代码值。message 应该是一个包含 (详细的) 发生的错误信息的字符串,explain 应该是错误代码号的解释。缺省 message 和 explain 值可以在 responses 类变量中找到。
protocol_version
这指定在响应中使用的 HTTP 协议版本。如果设置为 'HTTP/1.1', 服务器将允许 HTTP 持续连接;然而,那么你的服务器必须 在所有它到客户端响应中包含一个正确的Content-Length 头 (使用 send_header())。为了向下的兼容性,缺省设置为 'HTTP/1.0'。
MessageClass
指定一个类似于rfc822.Message 的类解析 HTTP 头。典型地,不被重载,并且缺省为 mimetools.Message。
responses
这个变量包含一个错误代码整数到包含一个短的和一个长的信息的两个元素的元组的映射。例如 {code: (shortmessage, longmessage)}。 shortmessage 通常被用作错误响应中 message 关键字,longmessage 用作 explain 关键字 (参阅 error_message_format 类变量)。
[例如:我在调试了如下的代码]
from BaseHTTPServer import BaseHTTPRequestHandler
print BaseHTTPRequestHandler.responses
可以打印出来HTTP常见的服务器返回的状态码信息的。包括了401 402 403 404等相关的状态码信息的!
BaseHTTPRequestHandler 实例有下列方法:
[这个类的实例的方法如下的:]
handle()
调用 handle_one_request()一次 (或,如果能够持续连接,多次) 处理进来的 HTTP 请求。你从不需要重载它;替代,实现对应的 do_*() 方法。
handle_one_request()
这个方法将解析和分派请求到对应的 do_*() 方法。你从不需要重载它。
send_error(code[, message])
发送并记录一个完整的错误回复到客户端。数字的 code 指定 HTTP 错误代码,以 message 作为可选的,更多指定的文本。全套的头被发送,后面紧跟使用 the error_message_format 类变量组成的文本。
send_response(code[, message])
发送一个响应头并记录已接收的请求。HTTP 响应行被发送,后面紧跟 Server 和 Date 头。这两个头的值分别地从 version_string() 和 date_time_string() 方法中获得。
send_header(keyword, value)
编写一个指定的 HTTP 头到输出流。 keyword 应该指定头关键字,value 指定它的值。
end_headers()
发送一个空白行,表示响应中的 HTTP 头结束。
log_request([code[, size]])
记录一个已接收的 (成功的) 请求。code 指定关联响应的数字的 HTTP 代码。如果响应的大小可用,那么它应该作为 size 参数被传递。
log_error(...)
当一个请求不能被完成时记录一个错误。缺省,它传递信息给 log_message(),因此它取相同的参数 (format 和 附加值)。
log_message( format,...)
记录一个随机信息给 sys.stderr。典型地重载创建自定义的错误日志结构。 format 参数是一个标准的printf风格的格式化字符串,附加参数给 log_message() 用于输出格式。客户端地址和当前的日期时间被作为记录的每个信息的前缀。
version_string()
返回服务器软件的版本字符串。这是一个 server_version 和 sys_version 类变量的联合。
date_time_string([timestamp])
返回通过 timestamp 给定的日期和时间(必须是由 time.time()返回的格式),格式化一个信息头。如果 timestamp 被省略,它使用当前的日期和时间。
结果像 'Sun, 06 Nov 1994 08:49:37 GMT'。2.5 版本中的新特性: timestamp 参数。
log_date_time_string()
返回当前的日期和时间,格式化日志。
address_string()
返回客户端地址,格式化日志。一个名称的查找被执行在客户端的IP地址上。
[学习模块的好方法就是能够灵活运用这些方法来做事情的!真正的高手是写出来这些方法的具体实现代码]
1.类变量与实例变量的区别
类变量是static变量,一个对象对其进行修改会影响到其他对象的访问处理
而实例变量的话是指单独针对某个对象而言的变量。一个对象修改了它不会影响到其他对象的值。
通过实例来分析一下吧:
class Person(object):
objectCount=0 #这个就是类变量
def __init__(self,name):#构造方法
self.name=name
self.objectCount=0 #这个就是实例变量
def pick(self) :
self.objectCount += 1 #实例变量调用方法是self.实例变量名
#调用类变量直接用 类名.类变量名
Person.objectCount += 1 #self.__class__.count_beans += 1
print '%s pick a bean. He picked %d beans, and we all picked %d beans.' % (self.name, self.objectCount, Person.objectCount)
如果调用的话 如果想调用 类变量就要这样来写的:Person.类变量名
如果 想调用实例变量的话可以这样来写的 对象名.实例变量名
2.实现JAVA中的static方法如何在PYTHON中实现呢?
class Person:
def __init__(self,name):
self.name=name
def sum(a,b): #看到没有 没有self参数的,要实现静态方法
return a+b
sum = staticmethod(sum) #表示这个方法为静态方法了!
alex=Person("jack")
print "%sTest"%Person.sum(1, 3) #要通过类名进行调用的,直接调用这个静态方法就OK了!
在JAVA中实现起来相当简单的:
public static void sum()
因为我在BaseHTTPServer 模块中会有两个类其中的一个就会用到上面这些概念的!
BaseHTTPRequestHandler 有下列实例变量:
client_address
包含关连的客户端地址这样格式(host, port)的一个元组。
command
包含的命令 (请求类型)。例如,'GET'。
path
包含的请求路径。
request_version
包含请求版本的字符串。例如,'HTTP/1.0'。
headers
控制(Holds)由MessageClass 类变量指定的类的一个实例。这个实例解析和管理 HTTP 请求中的头。
rfile
包含一个输入流,定位在可选的输入数据开头。
wfile
包含写到客户端响应的输出流。当写给这个流时坚持使用正确的HTTP协议。
[将基本的概念学精了,那才能学得更快些的]
BaseHTTPRequestHandler 有下列类变量:
server_version
指定服务器软件版本。你可能想要重载它。格式是多个空格分隔的字符串,每个字符串的格式是name[/version]。例如,'BaseHTTP/0.2'。
sys_version
包含Python系统版本,通过 version_string 方法和 server_version 类变量,以一种方便可用的格式。例如,'Python/1.4'。
error_message_format
为构建响应到客户端的错误构建一个格式字符串。它使用括号, 关键的格式区分符,因此该格式操作对象必须是一个字典。code 关键字应该是一个整数,指定数字的 HTTP 错误代码值。message 应该是一个包含 (详细的) 发生的错误信息的字符串,explain 应该是错误代码号的解释。缺省 message 和 explain 值可以在 responses 类变量中找到。
protocol_version
这指定在响应中使用的 HTTP 协议版本。如果设置为 'HTTP/1.1', 服务器将允许 HTTP 持续连接;然而,那么你的服务器必须 在所有它到客户端响应中包含一个正确的Content-Length 头 (使用 send_header())。为了向下的兼容性,缺省设置为 'HTTP/1.0'。
MessageClass
指定一个类似于rfc822.Message 的类解析 HTTP 头。典型地,不被重载,并且缺省为 mimetools.Message。
responses
这个变量包含一个错误代码整数到包含一个短的和一个长的信息的两个元素的元组的映射。例如 {code: (shortmessage, longmessage)}。 shortmessage 通常被用作错误响应中 message 关键字,longmessage 用作 explain 关键字 (参阅 error_message_format 类变量)。
[例如:我在调试了如下的代码]
from BaseHTTPServer import BaseHTTPRequestHandler
print BaseHTTPRequestHandler.responses
可以打印出来HTTP常见的服务器返回的状态码信息的。包括了401 402 403 404等相关的状态码信息的!
BaseHTTPRequestHandler 实例有下列方法:
[这个类的实例的方法如下的:]
handle()
调用 handle_one_request()一次 (或,如果能够持续连接,多次) 处理进来的 HTTP 请求。你从不需要重载它;替代,实现对应的 do_*() 方法。
handle_one_request()
这个方法将解析和分派请求到对应的 do_*() 方法。你从不需要重载它。
send_error(code[, message])
发送并记录一个完整的错误回复到客户端。数字的 code 指定 HTTP 错误代码,以 message 作为可选的,更多指定的文本。全套的头被发送,后面紧跟使用 the error_message_format 类变量组成的文本。
send_response(code[, message])
发送一个响应头并记录已接收的请求。HTTP 响应行被发送,后面紧跟 Server 和 Date 头。这两个头的值分别地从 version_string() 和 date_time_string() 方法中获得。
send_header(keyword, value)
编写一个指定的 HTTP 头到输出流。 keyword 应该指定头关键字,value 指定它的值。
end_headers()
发送一个空白行,表示响应中的 HTTP 头结束。
log_request([code[, size]])
记录一个已接收的 (成功的) 请求。code 指定关联响应的数字的 HTTP 代码。如果响应的大小可用,那么它应该作为 size 参数被传递。
log_error(...)
当一个请求不能被完成时记录一个错误。缺省,它传递信息给 log_message(),因此它取相同的参数 (format 和 附加值)。
log_message( format,...)
记录一个随机信息给 sys.stderr。典型地重载创建自定义的错误日志结构。 format 参数是一个标准的printf风格的格式化字符串,附加参数给 log_message() 用于输出格式。客户端地址和当前的日期时间被作为记录的每个信息的前缀。
version_string()
返回服务器软件的版本字符串。这是一个 server_version 和 sys_version 类变量的联合。
date_time_string([timestamp])
返回通过 timestamp 给定的日期和时间(必须是由 time.time()返回的格式),格式化一个信息头。如果 timestamp 被省略,它使用当前的日期和时间。
结果像 'Sun, 06 Nov 1994 08:49:37 GMT'。2.5 版本中的新特性: timestamp 参数。
log_date_time_string()
返回当前的日期和时间,格式化日志。
address_string()
返回客户端地址,格式化日志。一个名称的查找被执行在客户端的IP地址上。
[学习模块的好方法就是能够灵活运用这些方法来做事情的!真正的高手是写出来这些方法的具体实现代码]
相关阅读 更多 +