|
中华网络安全联盟 作者:未知 来源:转载 时间:2006-4-12
4.6util-工具箱
util模块提供了类似于cgi模块的多种实用工具。util模块的实现也是非常有效率的,直接调用Apache的API,并且通过环境变量传递信息。
推荐的使用这个模块的方式:
from mod_python import util
参考CGI文档:
http://CGI-spec.golux.com
4.6.1FieldStorage类
通过FieldStorage类传递数据,这个类类似于标准模块cgi FieldStorage。
class FieldStorage(req[,keep_blank_values,strict_parsing])
这个类提供了处理从客户端提交的HTML。req是mod_python请求对象的实例。
可选参数keep_blank_values是一个标志选项,判定是否把从数据编码而得的URL中的空值作为空字符串处理。缺省值为False,代表忽略空值,好像他们没有出现过一样。
可选参数strict_parsing还没有实现。
初始化时,FieldStorage类读取所有从客户端提交的信息。当所有客户端信息处理完成时,只剩下一个对应一个请求的FieldStorage类的实例。你也可以尝试在FieldStorage实例化之前和之后访问客户端数据。
从客户端读取的数据将会被转换成Field对象,每项数据一个字段。从HTML提交的输入类型file,将会被以临时文件的形式稍后提交成Field对象的file属性。
FieldStorage类有一个映射对象接口,可以作为词典来处理。当使用映射时,键名是输入字段名,返回的词典值可能是如下的:
StringField的实例,包含输入值。仅限输入一个值的时候。StringField是str的子类提供了value属性来兼容cgi模块。
Field类的实例,如果输入是一个上传文件。
StringField或者/和Field对象的列表。当输入多个值时,比如HTML标签<select>的元素。
注意:不同于标准库cgi模块的FieldStorage类,一个Field对象只能返回上传文件。其他情况返回StringField的实例。这意味着不需要使用.value属性就可以存取字段值,在大多数时候。
除了普通的映射对象方法(指词典),FieldStorage对象还有如下属性:
list
这是Field对象的列表,对应每个输入。如果具有同名的多个输入,则列表中也会拥有多个对象。
FieldStorage类的方法:
getfirst(name[,default])
总是返回表单数据名name的一个值。如果没有对应的字段则返回default指定的值。缺省返回None如果未指定default。
getlist(name)
返回表单字段name的值列表。如果没有对应字段则返回空列表。即使只有一个值也会返回包含这个值的列表。
4.6.2Field类
class Field()
这个类用于FieldStorage的内部实现。每个Field类实例对应一个HTML表单的输入。
Field实例包含如下属性:
name
输入名
value
输入值。这个属性用于读取数据上传文件的数据。但是注意处理大文件,因为整个文件都会被读入内存。
file
类似文件对象,指向上传的临时文件TemporaryFile实例。(更多信息参考python标准tempfile模块中的TemporaryFile类)
简单的来说,它是一个StringIO对象,所以你可以使用这个属性读取字符串值来更好的代替value属性。
filename
客户端提供的文件名。
type
客户端提交的content-type内容类型。
type_options
真实的内容类型,从客户端提交头的content-type提供的。这是一个词典。
disposition
提交头的content-disposition的第一部分的值。
disposition_options
提交头的content-disposition的第二部分的值,词典。
参考:
RFC1867,HTML表单提交文件,"Form-based File Upload in HTML"
4.6.3其他函数
parse_qs(qs[,keep_blank_values,strict_parsing])
这个函数的功能等同于标准库cgi parse_qs,但是是用C语言写的,运行更快。
转换一个query字符串(URL中附加的提交数据)作为字符串参数。数据以词典返回。词典的键名是query变量的变量名,值是对应变量的值的列表。
可选参数keep_blank_values是一个标志变量指定URL编码中的空值是否作为空字符串处理。True指定空值转换为空白字符串。缺省值是False指定空值被忽略。
注意:strict_parsing参数尚未实现。
parse_qsl(qs[,keep_blank_values,strict_parsing])
这个函数功能等同于标准库cgi parse_qsl,但是是用C语言写的,速度更快。
转换一个query字符串,返回一个列表的数据,变量名和变量值对。
可选参数keep_blank_values和strict_parsing同上。
与上面函数的不同就是返回数据的格式。
redirect(req,location[,permanent=0,text=None])
这是一个可以方便的重定向浏览器到另外一个地址的函数。当permanent为True时,MOVED_PERMANENTLY状态被发送到客户端,或者是MOVED_TEMPORARILY。并发送一段简短的文本告知浏览器,文档已经被移走(当这个罕见的浏览器不支持重定向时);提示文本可以被text参数覆盖。
如果这个函数在响应头已经被发送之后调用,会触发IOError异常。
这个函数触发apache.SERVER_RETURN异常放弃之后的处理。如果不想这样,可以在redirect之外套一个try/except块来捕捉异常。
4.7Cookie-HTTP状态管理
Cookie模块提供了方便的(convenient)的方法来创建,分析,发送和接收HTTP Cookies,按照Netscape的定义。
注意:尽管RFC工作组描述了如何使用Cookie,但是实际上还是只有Netscape原始浏览器支持。而且,很多流行的浏览器还是兼容IETF标准的,而且即便声称RFC兼容的。因此,这个模块支持当前范例,而不是完全RFC兼容的。
在特殊情况下,Netscape与RFC的Cookie有很大的区别,比如路径和域名。Cookie模块忽略这种引入的属性,所以所以所有引入的cookie以Netscape风格的cookie告终,没有属性的定义。
参考:
客户端持久化状态-HTTP Cookies
http://wp.netscape.com/newref/std/cookie_spec.html
RFC 2109,"HTTP状态管理机制"
RFC 2964,"使用HTTP状态管理"
RFC 2965,"HTTP状态管理机制"
HTTP Cookies:标准,秘密与政见
http://arxiv.org/abs/cs.SE/0105018
4.7.1类定义
class Cookie(name,value[,attributes])
这个类用于构造一个单一的cookie名为name,值为value。在Netscape和RFC2109中定义的属性将作为关键字参数。
属性描述了cookie的属性,而他们的字符串将会成为cookie的一部分。Cookie类限定了属性名必须是有效值,如下是可用的属性名:name、 value、version、path、domain、secure、comment、expires、max_age 、commentURL、discard、port、__data__。
__data__属性是一个通用的词典可用于存储任意值,如果需要。在使用Cookie的子集时很重要。
expires属性。按照如下格式解释'Wdy, DD-Mon-YYYY HH:MM:S GMT' (按照每个Netscape cookie的定义),或者按照新纪元开始的秒数(自动转换为GMT时间字符串)。无效的expires值会抛出ValueError异常。
当转换到字符串时,一个Cookie将会被转换到Cookie或Set-Cookie头。
注意:不像Python标准库Cookie类,这个类指定单一cookie,等同于Python标准库中的Morsel。
parse(string)
这是一个类方法,用于从一个cookie字符串创建Cookie实例并传递到响应头的值。转换过程中,属性名将会转换为小写。
因为这是个类方法,所以必须通过类来调用。
这个方法返回Cookie实例的词典,不是单一的Cookie实例。
如下是获取单一Cookie实例的示例:
mycookies=Cookie.parse("spam=eggs; expires=Sat, \
14-Jun-2003 02:42:36 GMT")
spamcookie=mycookies["spam"]
注意:因为这个方法使用词典,所以不可能返回同名cookies。如果需要多个值在同一个cookie中,考虑使用MarshalCookie。
class SignedCookie(name,value,secret[,attributes])
这是Cookie的子类。这个类按照name和value自动创建一个经过HMAC (md5)签名过的Cookie,secret必须是非空字符串。
parse(string,secret)
这个方法同Cookie.parse(),但是cookie要被验证。如果签名的验证失败,则返回Cookie类。
注意:通常检查SignedCookie.parse()的返回类型。如果返回类型是Cookie(而不是SignedCookie),则签名验证失败:
#假设spam是一个签名过的cookie
if type(spam) is not Cookie.SignedCookie:
#签名验证失败的处理
class MarshalCookie(name,value,secret[,attributes])
这是SignedCookie的子类。允许value是任何的集结(marshallable)对象。Python核心(core)类型如字符串,整数,列表等,都是集结类型对象。完整的列表查看marshal模块文档。
转换过程中会检查签名,不正确的签名的cookie无法被集结(unmarshalled)。
4.7.2函数
add_cookie(req,cookie[,value,attributes])
向响应头方便的设置一个cookie。req是mod_python请求对象。如果cookie是一个Cookie类或其子类的实例。则cookie被设置,否则cookie参数必须是一个字符串,用于构造Cookie类的实例。cookie用作名字,value作为值,有效的Cookie属性作为关键字参数。
这个函数同时设置'Cache-Control: no-cache="set-cookie"'头来通知(inform)cookie值不需要缓存。
如下是使用这个函数的一种方法:
c=Cookie.Cookie('spam','eggs',expires=time.time()+300)
Cookie.add_cookie(req,c)
如下是另一个例子:
Cookie.add_cookie(req,'spam','eggs',expires=time.time()+\
300)
get_cookies(req[,Class,data])
从输入头获取(retrieving)cookie的方法。req是mod_python请求对象。Class是一个拥有parse()方法的用于转换成的cookie类,缺省是Cookie类。Data可以是任何关键字参数,将会被传递到parse()方法。对SignedCookie和MarshalCookie类等需要secret参数的parse()方法非常有用。
4.7.3例子
如下例子设置一个持续(expires)300秒的cookie:
from mod_python import Cookie,apache
import time
def handler(req):
cookie=Cookie.Cookie('eggs','spam')
cookie.expires=time.time()+300
Cookie.add_cookie(req,cookie)
req.write('此响应包含cookie!\n')
return apache.OK
如下例子检查输入的集结cookie并显示到客户端。如果输入没有cookie则设置一个cookie。这个例子使用'secret007'作为HMAC签名。
from mod_python import apache,Cookie
def handler(req):
cookies=Cookie.get_cookies(req,Cookie.MarshalCookie,\
secret='secret007')
if cookies.has_key('spam'):
spamcookie=cookies['spam']
req.write('Great, a spam cookie was found: %s\n'\
% str(spamcookie))
if type(spamcookie) is Cookie.MarshalCookie:
req.write('Here is what it looks like decoded'\
+':%s=%s\n'%(spamcookie.name,\
spamcookie.value))
else:
req.write('WARNING: The cookie found is not a \
MarshalCookie, it may have been tapered\
with!')
else:
#MarshalCookie允许值为任何集结对象
value={'egg_count':32, 'color':'white'}
Cookie.add_cookie(req,Cookie.MarshalCookie('spam',\
value,'secret007'))
req.write('Spam cookie not found, but we just\
set one!\n')
return apache.OK
上一页 [1] [2] [3] [4] [5] [6] [7] [8] 下一页 |