many pep8 improvements
This commit is contained in:
+48
-45
@@ -22,21 +22,22 @@ import urllib
|
||||
import urllib2
|
||||
|
||||
DEFAULT_HEADERS = {
|
||||
'user-agent': 'Mozilla/4.0', # some servers are picky
|
||||
'user-agent': 'Mozilla/4.0', # some servers are picky
|
||||
'accept-language': 'en',
|
||||
}
|
||||
}
|
||||
|
||||
FORM_REGEX = re.compile('(\<input name\="_formkey" type\="hidden" value\="(?P<formkey>.+?)" \/\>)?\<input name\="_formname" type\="hidden" value\="(?P<formname>.+?)" \/\>')
|
||||
|
||||
SESSION_REGEX = 'session_id_(?P<name>.+)'
|
||||
|
||||
|
||||
class WebClient(object):
|
||||
|
||||
def __init__(self,
|
||||
app = '',
|
||||
postbacks = True,
|
||||
default_headers = DEFAULT_HEADERS,
|
||||
session_regex = SESSION_REGEX):
|
||||
app='',
|
||||
postbacks=True,
|
||||
default_headers=DEFAULT_HEADERS,
|
||||
session_regex=SESSION_REGEX):
|
||||
self.app = app
|
||||
self.postbacks = postbacks
|
||||
self.forms = {}
|
||||
@@ -46,18 +47,18 @@ class WebClient(object):
|
||||
self.sessions = {}
|
||||
self.session_regex = session_regex and re.compile(session_regex)
|
||||
|
||||
def get(self,url,cookies=None,headers=None,auth=None):
|
||||
return self.post(url,data=None,cookies=cookies,headers=headers)
|
||||
def get(self, url, cookies=None, headers=None, auth=None):
|
||||
return self.post(url, data=None, cookies=cookies, headers=headers)
|
||||
|
||||
def post(self,url,data=None,cookies=None,headers=None,auth=None):
|
||||
self.url = self.app+url
|
||||
def post(self, url, data=None, cookies=None, headers=None, auth=None):
|
||||
self.url = self.app + url
|
||||
|
||||
# if this POST form requires a postback do it
|
||||
if data and '_formname' in data and self.postbacks and \
|
||||
self.history and self.history[-1][1]!=self.url:
|
||||
self.history and self.history[-1][1] != self.url:
|
||||
# to bypass the web2py CSRF need to get formkey
|
||||
# before submitting the form
|
||||
self.get(url,cookies=cookies,headers=headers,auth=auth)
|
||||
self.get(url, cookies=cookies, headers=headers, auth=auth)
|
||||
|
||||
# unless cookies are specified, recycle cookies
|
||||
if cookies is None:
|
||||
@@ -75,22 +76,23 @@ class WebClient(object):
|
||||
|
||||
# copy headers from dict to list of key,value
|
||||
headers_list = []
|
||||
for key,value in self.default_headers.iteritems():
|
||||
for key, value in self.default_headers.iteritems():
|
||||
if not key in headers:
|
||||
headers[key] = value
|
||||
for key,value in headers.iteritems():
|
||||
if isinstance(value,(list,tuple)):
|
||||
for v in value: headers_list.append((key,v))
|
||||
for key, value in headers.iteritems():
|
||||
if isinstance(value, (list, tuple)):
|
||||
for v in value:
|
||||
headers_list.append((key, v))
|
||||
else:
|
||||
headers_list.append((key,value))
|
||||
headers_list.append((key, value))
|
||||
|
||||
# move cookies to headers
|
||||
for key,value in cookies.iteritems():
|
||||
headers_list.append(('Cookie','%s=%s' % (key,value)))
|
||||
for key, value in cookies.iteritems():
|
||||
headers_list.append(('Cookie', '%s=%s' % (key, value)))
|
||||
|
||||
# add headers to request
|
||||
for key,value in headers_list:
|
||||
opener.addheaders.append((key,str(value)))
|
||||
for key, value in headers_list:
|
||||
opener.addheaders.append((key, str(value)))
|
||||
|
||||
# assume everything is ok and make http request
|
||||
error = None
|
||||
@@ -99,7 +101,7 @@ class WebClient(object):
|
||||
self.method = 'POST'
|
||||
|
||||
# if there is only one form, set _formname automatically
|
||||
if not '_formname' in data and len(self.forms)==1:
|
||||
if not '_formname' in data and len(self.forms) == 1:
|
||||
data['_formname'] = self.forms.keys()[0]
|
||||
|
||||
# if there is no formkey but it is known, set it
|
||||
@@ -110,18 +112,18 @@ class WebClient(object):
|
||||
# time the POST request
|
||||
data = urllib.urlencode(data)
|
||||
t0 = time.time()
|
||||
self.response = opener.open(self.url,data)
|
||||
self.time = time.time()-t0
|
||||
self.response = opener.open(self.url, data)
|
||||
self.time = time.time() - t0
|
||||
else:
|
||||
self.method = 'GET'
|
||||
|
||||
# time the GET request
|
||||
t0 = time.time()
|
||||
self.response = opener.open(self.url)
|
||||
self.time = time.time()-t0
|
||||
self.time = time.time() - t0
|
||||
except urllib2.HTTPError, error:
|
||||
# catch HTTP errors
|
||||
self.time = time.time()-t0
|
||||
self.time = time.time() - t0
|
||||
self.response = error
|
||||
|
||||
self.status = self.response.getcode()
|
||||
@@ -131,7 +133,7 @@ class WebClient(object):
|
||||
# treat web2py tickets as special types of errors
|
||||
if error is not None:
|
||||
if 'web2py_error' in self.headers:
|
||||
raise RuntimeError, self.headers['web2py_error']
|
||||
raise RuntimeError(self.headers['web2py_error'])
|
||||
else:
|
||||
raise error
|
||||
|
||||
@@ -139,8 +141,8 @@ class WebClient(object):
|
||||
self.cookies = {}
|
||||
if 'set-cookie' in self.headers:
|
||||
for item in self.headers['set-cookie'].split(','):
|
||||
key,value = item[:item.find(';')].split('=')
|
||||
self.cookies[key.strip()]=value.strip()
|
||||
key, value = item[:item.find(';')].split('=')
|
||||
self.cookies[key.strip()] = value.strip()
|
||||
|
||||
# check is a new session id has been issued, symptom of broken session
|
||||
if self.session_regex is not None:
|
||||
@@ -148,8 +150,8 @@ class WebClient(object):
|
||||
match = self.session_regex.match(cookie)
|
||||
if match:
|
||||
name = match.group('name')
|
||||
if name in self.sessions and self.sessions[name]!=value:
|
||||
raise RuntimeError, 'Broken sessions %s' % name
|
||||
if name in self.sessions and self.sessions[name] != value:
|
||||
raise RuntimeError('Broken sessions %s' % name)
|
||||
self.sessions[name] = value
|
||||
|
||||
# find all forms and formkeys in page
|
||||
@@ -158,7 +160,8 @@ class WebClient(object):
|
||||
self.forms[match.group('formname')] = match.group('formkey')
|
||||
|
||||
# log this request
|
||||
self.history.append((self.method,self.url,self.status,self.time))
|
||||
self.history.append((self.method, self.url, self.status, self.time))
|
||||
|
||||
|
||||
def test_web2py_registration_and_login():
|
||||
# from gluon.contrib.webclient import WebClient
|
||||
@@ -168,13 +171,13 @@ def test_web2py_registration_and_login():
|
||||
client.get('index')
|
||||
|
||||
# register
|
||||
data = dict(first_name = 'Homer',
|
||||
last_name = 'Simpson',
|
||||
email = 'homer@web2py.com',
|
||||
password = 'test',
|
||||
password_two = 'test',
|
||||
_formname = 'register')
|
||||
client.post('user/register',data = data)
|
||||
data = dict(first_name='Homer',
|
||||
last_name='Simpson',
|
||||
email='homer@web2py.com',
|
||||
password='test',
|
||||
password_two='test',
|
||||
_formname='register')
|
||||
client.post('user/register', data=data)
|
||||
|
||||
# logout
|
||||
client.get('user/logout')
|
||||
@@ -182,18 +185,18 @@ def test_web2py_registration_and_login():
|
||||
# login
|
||||
data = dict(email='homer@web2py.com',
|
||||
password='test',
|
||||
_formname = 'login')
|
||||
client.post('user/login',data = data)
|
||||
_formname='login')
|
||||
client.post('user/login', data=data)
|
||||
|
||||
# check registration and login were successful
|
||||
client.get('user/profile')
|
||||
assert 'Welcome Homer' in client.text
|
||||
|
||||
# print some variables
|
||||
print '\nsessions:\n',client.sessions
|
||||
print '\nheaders:\n',client.headers
|
||||
print '\ncookies:\n',client.cookies
|
||||
print '\nforms:\n',client.forms
|
||||
print '\nsessions:\n', client.sessions
|
||||
print '\nheaders:\n', client.headers
|
||||
print '\ncookies:\n', client.cookies
|
||||
print '\nforms:\n', client.forms
|
||||
print
|
||||
for method, url, status, t in client.history:
|
||||
print method, url, status, t
|
||||
|
||||
Reference in New Issue
Block a user