Make request.debug be backward-compatible with old Zope 2 code as

suggested by Florent in http://mail.zope.org/pipermail/zope-dev/2006-April/027424.html.

request.debug will resolve to a form variable for all code except
code that lies in a 'zope.*' package. Eventually, we should deprecate
form variable access through getattr. I'm leaving a big comment to remind
us of that.
parent 05ae045d
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
__version__='$Revision: 1.96 $'[11:-2] __version__='$Revision: 1.96 $'[11:-2]
import re, sys, os, time, random, codecs import re, sys, os, time, random, codecs, inspect
from types import StringType, UnicodeType from types import StringType, UnicodeType
from BaseRequest import BaseRequest from BaseRequest import BaseRequest
from HTTPResponse import HTTPResponse from HTTPResponse import HTTPResponse
...@@ -258,13 +258,13 @@ class HTTPRequest(BaseRequest): ...@@ -258,13 +258,13 @@ class HTTPRequest(BaseRequest):
have_env=environ.has_key have_env=environ.has_key
get_env=environ.get get_env=environ.get
self.response=response self.response=response
other=self.other={'RESPONSE': response, other=self.other={'RESPONSE': response}
'debug': DebugFlags()}
self.form={} self.form={}
self.taintedform={} self.taintedform={}
self.steps=[] self.steps=[]
self._steps=[] self._steps=[]
self._lazies={} self._lazies={}
self._debug = DebugFlags()
if environ.has_key('REMOTE_ADDR'): if environ.has_key('REMOTE_ADDR'):
...@@ -1216,7 +1216,18 @@ class HTTPRequest(BaseRequest): ...@@ -1216,7 +1216,18 @@ class HTTPRequest(BaseRequest):
raise KeyError, key raise KeyError, key
return v return v
# Using the getattr protocol to retrieve form values and similar
# is discouraged and is likely to be deprecated in the future.
# request.get(key) or request[key] should be used instead
def __getattr__(self, key, default=_marker, returnTaints=0): def __getattr__(self, key, default=_marker, returnTaints=0):
# ugly hack to make request.debug work for Zope 3 code (the
# ZPT engine, to be exact) while retaining request.debug
# functionality for all other code
if key == 'debug':
lastframe = inspect.currentframe().f_back
if lastframe.f_globals['__name__'].startswith('zope.'):
return self._debug
v = self.get(key, default, returnTaints=returnTaints) v = self.get(key, default, returnTaints=returnTaints)
if v is _marker: if v is _marker:
raise AttributeError, key raise AttributeError, key
......
...@@ -701,6 +701,45 @@ class RequestTests( unittest.TestCase ): ...@@ -701,6 +701,45 @@ class RequestTests( unittest.TestCase ):
f.seek(0) f.seek(0)
self.assertEqual(f.xreadlines(),f) self.assertEqual(f.xreadlines(),f)
def testDebug(self):
TEST_ENVIRON = {
'REQUEST_METHOD': 'GET',
'SERVER_NAME': 'localhost',
'SERVER_PORT': '80',
}
from StringIO import StringIO
from ZPublisher.HTTPRequest import HTTPRequest
s = StringIO('')
# accessing request.debug from non-Zope3 code will raise an
# AttributeError
env = TEST_ENVIRON.copy()
request = HTTPRequest(s, env, None)
request.processInputs()
self.assertRaises(AttributeError, getattr, request, 'debug')
# or it will actually yield a 'debug' form variable if it
# exists
env = TEST_ENVIRON.copy()
env['QUERY_STRING'] = 'debug=1'
request = HTTPRequest(s, env, None)
request.processInputs()
self.assertEqual(request.debug, '1')
# if we access request.debug from a Zope 3 package, however,
# we will see the DebugFlags instance
def getDebug(request):
return request.debug
# make a forged copy of getDebug that looks as if its module
# was a Zope 3 package
z3globals = globals().copy()
z3globals['__name__'] = 'zope.apackage'
import new
getDebugFromZope3 = new.function(getDebug.func_code, z3globals)
from zope.publisher.base import DebugFlags
self.assertEqual(getDebug(request), '1')
self.assert_(isinstance(getDebugFromZope3(request), DebugFlags))
def test_suite(): def test_suite():
suite = unittest.TestSuite() suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(AuthCredentialsTestsa, 'test')) suite.addTest(unittest.makeSuite(AuthCredentialsTestsa, 'test'))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment