many pep8 improvements
This commit is contained in:
1 parent
b716df1a05
commit
4b2ba185ae
117 files changed
+7160
-5670
No files matched your search
+113
-87
@@ -61,6 +61,7 @@ less_template = '<link href="%s" rel="stylesheet/less" type="text/css" />'
|
||||
css_inline = '<style type="text/css">\n%s\n</style>'
|
||||
js_inline = '<script type="text/javascript">\n%s\n</script>'
|
||||
|
||||
|
||||
class Request(Storage):
|
||||
|
||||
"""
|
||||
@@ -82,7 +83,7 @@ class Request(Storage):
|
||||
|
||||
def __init__(self):
|
||||
Storage.__init__(self)
|
||||
self.wsgi = Storage() # hooks to environ and start_response
|
||||
self.wsgi = Storage() # hooks to environ and start_response
|
||||
self.env = Storage()
|
||||
self.cookies = Cookie.SimpleCookie()
|
||||
self.get_vars = Storage()
|
||||
@@ -116,8 +117,8 @@ class Request(Storage):
|
||||
if session:
|
||||
session._user_agent = user_agent
|
||||
user_agent = Storage(user_agent)
|
||||
for key,value in user_agent.items():
|
||||
if isinstance(value,dict):
|
||||
for key, value in user_agent.items():
|
||||
if isinstance(value, dict):
|
||||
user_agent[key] = Storage(value)
|
||||
return user_agent
|
||||
|
||||
@@ -133,25 +134,26 @@ class Request(Storage):
|
||||
current.session.secure()
|
||||
|
||||
def restful(self):
|
||||
def wrapper(action,self=self):
|
||||
def f(_action=action,_self=self,*a,**b):
|
||||
def wrapper(action, self=self):
|
||||
def f(_action=action, _self=self, *a, **b):
|
||||
self.is_restful = True
|
||||
method = _self.env.request_method
|
||||
if len(_self.args) and '.' in _self.args[-1]:
|
||||
_self.args[-1],_self.extension = _self.args[-1].rsplit('.',1)
|
||||
_self.args[-
|
||||
1], _self.extension = _self.args[-1].rsplit('.', 1)
|
||||
current.response.headers['Content-Type'] = \
|
||||
contenttype(_self.extension.lower())
|
||||
if not method in ['GET','POST','DELETE','PUT']:
|
||||
raise HTTP(400,"invalid method")
|
||||
rest_action = _action().get(method,None)
|
||||
if not method in ['GET', 'POST', 'DELETE', 'PUT']:
|
||||
raise HTTP(400, "invalid method")
|
||||
rest_action = _action().get(method, None)
|
||||
if not rest_action:
|
||||
raise HTTP(400,"method not supported")
|
||||
raise HTTP(400, "method not supported")
|
||||
try:
|
||||
return rest_action(*_self.args,**_self.vars)
|
||||
return rest_action(*_self.args, **_self.vars)
|
||||
except TypeError, e:
|
||||
exc_type, exc_value, exc_traceback = sys.exc_info()
|
||||
if len(traceback.extract_tb(exc_traceback))==1:
|
||||
raise HTTP(400,"invalid arguments")
|
||||
if len(traceback.extract_tb(exc_traceback)) == 1:
|
||||
raise HTTP(400, "invalid arguments")
|
||||
else:
|
||||
raise e
|
||||
f.__doc__ = action.__doc__
|
||||
@@ -180,8 +182,8 @@ class Response(Storage):
|
||||
self.meta = Storage() # used by web2py_ajax.html
|
||||
self.menu = [] # used by the default view layout
|
||||
self.files = [] # used by web2py_ajax.html
|
||||
self.generic_patterns = [] # patterns to allow generic views
|
||||
self.delimiters = ('{{','}}')
|
||||
self.generic_patterns = [] # patterns to allow generic views
|
||||
self.delimiters = ('{{', '}}')
|
||||
self._vars = None
|
||||
self._caller = lambda f: f()
|
||||
self._view_environment = None
|
||||
@@ -197,7 +199,8 @@ class Response(Storage):
|
||||
def render(self, *a, **b):
|
||||
from compileapp import run_view_in
|
||||
if len(a) > 2:
|
||||
raise SyntaxError, 'Response.render can be called with two arguments, at most'
|
||||
raise SyntaxError(
|
||||
'Response.render can be called with two arguments, at most')
|
||||
elif len(a) == 2:
|
||||
(view, self._vars) = (a[0], a[1])
|
||||
elif len(a) == 1 and isinstance(a[0], str):
|
||||
@@ -225,9 +228,9 @@ class Response(Storage):
|
||||
|
||||
def include_meta(self):
|
||||
s = '\n'.join(
|
||||
'<meta name="%s" content="%s" />\n' % (k,xmlescape(v))
|
||||
for k,v in (self.meta or {}).iteritems())
|
||||
self.write(s,escape=False)
|
||||
'<meta name="%s" content="%s" />\n' % (k, xmlescape(v))
|
||||
for k, v in (self.meta or {}).iteritems())
|
||||
self.write(s, escape=False)
|
||||
|
||||
def include_files(self, extensions=None):
|
||||
|
||||
@@ -256,44 +259,52 @@ class Response(Storage):
|
||||
# cache for 5 minutes by default
|
||||
key = hashlib.md5(repr(files)).hexdigest()
|
||||
|
||||
cache = self.cache_includes or (current.cache.ram, 60*5)
|
||||
cache = self.cache_includes or (current.cache.ram, 60 * 5)
|
||||
|
||||
def call_minify(files=files):
|
||||
return minify.minify(files,
|
||||
URL('static','temp'),
|
||||
URL('static', 'temp'),
|
||||
current.request.folder,
|
||||
self.optimize_css,
|
||||
self.optimize_js)
|
||||
if cache:
|
||||
cache_model, time_expire = cache
|
||||
files = cache_model('response.files.minified/'+key,
|
||||
files = cache_model('response.files.minified/' + key,
|
||||
call_minify,
|
||||
time_expire)
|
||||
else:
|
||||
files = call_minify()
|
||||
s = ''
|
||||
for item in files:
|
||||
if isinstance(item,str):
|
||||
if isinstance(item, str):
|
||||
f = item.lower().split('?')[0]
|
||||
if self.static_version:
|
||||
item = item.replace('/static/', '/static/_%s/' % self.static_version, 1)
|
||||
if f.endswith('.css'): s += css_template % item
|
||||
elif f.endswith('.js'): s += js_template % item
|
||||
elif f.endswith('.coffee'): s += coffee_template % item
|
||||
elif f.endswith('.less'): s += less_template % item
|
||||
elif isinstance(item,(list,tuple)):
|
||||
item = item.replace(
|
||||
'/static/', '/static/_%s/' % self.static_version, 1)
|
||||
if f.endswith('.css'):
|
||||
s += css_template % item
|
||||
elif f.endswith('.js'):
|
||||
s += js_template % item
|
||||
elif f.endswith('.coffee'):
|
||||
s += coffee_template % item
|
||||
elif f.endswith('.less'):
|
||||
s += less_template % item
|
||||
elif isinstance(item, (list, tuple)):
|
||||
f = item[0]
|
||||
if f=='css:inline': s += css_inline % item[1]
|
||||
elif f=='js:inline': s += js_inline % item[1]
|
||||
if f == 'css:inline':
|
||||
s += css_inline % item[1]
|
||||
elif f == 'js:inline':
|
||||
s += js_inline % item[1]
|
||||
self.write(s, escape=False)
|
||||
|
||||
def stream(
|
||||
self,
|
||||
stream,
|
||||
chunk_size = DEFAULT_CHUNK_SIZE,
|
||||
chunk_size=DEFAULT_CHUNK_SIZE,
|
||||
request=None,
|
||||
attachment=False,
|
||||
filename=None,
|
||||
):
|
||||
):
|
||||
"""
|
||||
if a controller function::
|
||||
|
||||
@@ -347,7 +358,7 @@ class Response(Storage):
|
||||
|
||||
env = request.env
|
||||
# Internet Explorer < 9.0 will not allow downloads over SSL unless caching is enabled
|
||||
if request.is_https and isinstance(env.http_user_agent,str) and \
|
||||
if request.is_https and isinstance(env.http_user_agent, str) and \
|
||||
not re.search(r'Opera', env.http_user_agent) and \
|
||||
re.search(r'MSIE [5-8][^0-9]', env.http_user_agent):
|
||||
headers['Pragma'] = 'cache'
|
||||
@@ -359,7 +370,7 @@ class Response(Storage):
|
||||
wrapped = streamer(stream, chunk_size=chunk_size)
|
||||
return wrapped
|
||||
|
||||
def download(self, request, db, chunk_size = DEFAULT_CHUNK_SIZE, attachment=True):
|
||||
def download(self, request, db, chunk_size=DEFAULT_CHUNK_SIZE, attachment=True):
|
||||
"""
|
||||
example of usage in controller::
|
||||
|
||||
@@ -373,7 +384,7 @@ class Response(Storage):
|
||||
raise HTTP(404)
|
||||
name = request.args[-1]
|
||||
items = re.compile('(?P<table>.*?)\.(?P<field>.*?)\..*')\
|
||||
.match(name)
|
||||
.match(name)
|
||||
if not items:
|
||||
raise HTTP(404)
|
||||
(t, f) = (items.group('table'), items.group('field'))
|
||||
@@ -389,9 +400,8 @@ class Response(Storage):
|
||||
'attachment; filename=%s' % filename
|
||||
return self.stream(stream, chunk_size=chunk_size, request=request)
|
||||
|
||||
|
||||
def json(self, data, default=None):
|
||||
return json(data, default = default or custom_json)
|
||||
return json(data, default=default or custom_json)
|
||||
|
||||
def xmlrpc(self, request, methods):
|
||||
"""
|
||||
@@ -408,7 +418,8 @@ class Response(Storage):
|
||||
the add function. Example::
|
||||
|
||||
import xmlrpclib
|
||||
connection = xmlrpclib.ServerProxy('http://hostname/app/contr/func')
|
||||
connection = xmlrpclib.ServerProxy(
|
||||
'http://hostname/app/contr/func')
|
||||
print connection.add(3, 4)
|
||||
|
||||
"""
|
||||
@@ -418,14 +429,14 @@ class Response(Storage):
|
||||
def toolbar(self):
|
||||
from html import DIV, SCRIPT, BEAUTIFY, TAG, URL, A
|
||||
BUTTON = TAG.button
|
||||
admin = URL("admin","default","design",
|
||||
admin = URL("admin", "default", "design",
|
||||
args=current.request.application)
|
||||
from gluon.dal import THREAD_LOCAL
|
||||
if hasattr(THREAD_LOCAL,'instances'):
|
||||
dbstats = [TABLE(*[TR(PRE(row[0]),'%.2fms' % (row[1]*1000)) \
|
||||
for row in i.db._timings]) \
|
||||
for i in THREAD_LOCAL.instances]
|
||||
dbtables = dict([(regex_nopasswd.sub('******',i.uri),
|
||||
if hasattr(THREAD_LOCAL, 'instances'):
|
||||
dbstats = [TABLE(*[TR(PRE(row[0]), '%.2fms' % (row[1] * 1000))
|
||||
for row in i.db._timings])
|
||||
for i in THREAD_LOCAL.instances]
|
||||
dbtables = dict([(regex_nopasswd.sub('******', i.uri),
|
||||
{'defined':
|
||||
sorted(list(set(i.db.tables) -
|
||||
set(i.db._LAZY_TABLES.keys()))) or
|
||||
@@ -434,25 +445,35 @@ class Response(Storage):
|
||||
'[no lazy tables]'})
|
||||
for i in THREAD_LOCAL.instances])
|
||||
else:
|
||||
dbstats = [] # if no db or on GAE
|
||||
dbstats = [] # if no db or on GAE
|
||||
dbtables = {}
|
||||
u = web2py_uuid()
|
||||
backtotop = A('Back to top', _href="#totop-%s" % u)
|
||||
return DIV(
|
||||
BUTTON('design',_onclick="document.location='%s'" % admin),
|
||||
BUTTON('request',_onclick="jQuery('#request-%s').slideToggle()"%u),
|
||||
BUTTON('response',_onclick="jQuery('#response-%s').slideToggle()"%u),
|
||||
BUTTON('session',_onclick="jQuery('#session-%s').slideToggle()"%u),
|
||||
BUTTON('db tables',_onclick="jQuery('#db-tables-%s').slideToggle()"%u),
|
||||
BUTTON('db stats',_onclick="jQuery('#db-stats-%s').slideToggle()"%u),
|
||||
DIV(BEAUTIFY(current.request), backtotop,_class="hidden",_id="request-%s"%u),
|
||||
DIV(BEAUTIFY(current.session), backtotop, _class="hidden",_id="session-%s"%u),
|
||||
DIV(BEAUTIFY(current.response), backtotop, _class="hidden",_id="response-%s"%u),
|
||||
DIV(BEAUTIFY(dbtables), backtotop, _class="hidden",_id="db-tables-%s"%u),
|
||||
DIV(BEAUTIFY(dbstats), backtotop, _class="hidden",_id="db-stats-%s"%u),
|
||||
SCRIPT("jQuery('.hidden').hide()")
|
||||
,_id="totop-%s" % u
|
||||
)
|
||||
BUTTON('design', _onclick="document.location='%s'" % admin),
|
||||
BUTTON('request',
|
||||
_onclick="jQuery('#request-%s').slideToggle()" % u),
|
||||
BUTTON('response',
|
||||
_onclick="jQuery('#response-%s').slideToggle()" % u),
|
||||
BUTTON('session',
|
||||
_onclick="jQuery('#session-%s').slideToggle()" % u),
|
||||
BUTTON('db tables',
|
||||
_onclick="jQuery('#db-tables-%s').slideToggle()" % u),
|
||||
BUTTON('db stats',
|
||||
_onclick="jQuery('#db-stats-%s').slideToggle()" % u),
|
||||
DIV(BEAUTIFY(current.request), backtotop,
|
||||
_class="hidden", _id="request-%s" % u),
|
||||
DIV(BEAUTIFY(current.session), backtotop,
|
||||
_class="hidden", _id="session-%s" % u),
|
||||
DIV(BEAUTIFY(current.response), backtotop,
|
||||
_class="hidden", _id="response-%s" % u),
|
||||
DIV(BEAUTIFY(dbtables), backtotop, _class="hidden",
|
||||
_id="db-tables-%s" % u),
|
||||
DIV(BEAUTIFY(
|
||||
dbstats), backtotop, _class="hidden", _id="db-stats-%s" % u),
|
||||
SCRIPT("jQuery('.hidden').hide()"), _id="totop-%s" % u
|
||||
)
|
||||
|
||||
|
||||
class Session(Storage):
|
||||
|
||||
@@ -468,19 +489,21 @@ class Session(Storage):
|
||||
tablename='web2py_session',
|
||||
masterapp=None,
|
||||
migrate=True,
|
||||
separate = None,
|
||||
separate=None,
|
||||
check_client=False,
|
||||
cookie_key=None,
|
||||
cookie_expires=None,
|
||||
compression_level=None
|
||||
):
|
||||
):
|
||||
"""
|
||||
separate can be separate=lambda(session_name): session_name[-2:]
|
||||
and it is used to determine a session prefix.
|
||||
separate can be True and it is set to session_name[-2:]
|
||||
"""
|
||||
if request is None: request = current.request
|
||||
if response is None: response = current.response
|
||||
if request is None:
|
||||
request = current.request
|
||||
if response is None:
|
||||
response = current.response
|
||||
if separate == True:
|
||||
separate = lambda session_name: session_name[-2:]
|
||||
self._unlock(response)
|
||||
@@ -512,7 +535,8 @@ class Session(Storage):
|
||||
response.session_cookie_key = cookie_key
|
||||
response.session_cookie_compression_level = compression_level
|
||||
if session_cookie_data:
|
||||
data = secure_loads(session_cookie_data,cookie_key,compression_level=compression_level)
|
||||
data = secure_loads(session_cookie_data, cookie_key,
|
||||
compression_level=compression_level)
|
||||
if data:
|
||||
self.update(data)
|
||||
# else if we are supposed to use file based sessions
|
||||
@@ -527,7 +551,7 @@ class Session(Storage):
|
||||
if regex_session_id.match(response.session_id):
|
||||
response.session_filename = \
|
||||
os.path.join(up(request.folder), masterapp,
|
||||
'sessions', response.session_id)
|
||||
'sessions', response.session_id)
|
||||
else:
|
||||
response.session_id = None
|
||||
# do not try load the data from file is these was data in cookie
|
||||
@@ -543,8 +567,8 @@ class Session(Storage):
|
||||
response.session_file.seek(0)
|
||||
oc = response.session_filename.split('/')[-1]\
|
||||
.split('-')[0]
|
||||
if check_client and client!=oc:
|
||||
raise Exception, "cookie attack"
|
||||
if check_client and client != oc:
|
||||
raise Exception("cookie attack")
|
||||
finally:
|
||||
pass
|
||||
#This causes admin login to break. Must find out why.
|
||||
@@ -557,7 +581,7 @@ class Session(Storage):
|
||||
if separate:
|
||||
prefix = separate(response.session_id)
|
||||
response.session_id = '%s/%s' % \
|
||||
(prefix,response.session_id)
|
||||
(prefix, response.session_id)
|
||||
response.session_filename = \
|
||||
os.path.join(up(request.folder), masterapp,
|
||||
'sessions', response.session_id)
|
||||
@@ -585,25 +609,25 @@ class Session(Storage):
|
||||
Field('locked', 'boolean', default=False),
|
||||
Field('client_ip', length=64),
|
||||
Field('created_datetime', 'datetime',
|
||||
default=request.now),
|
||||
default=request.now),
|
||||
Field('modified_datetime', 'datetime'),
|
||||
Field('unique_key', length=64),
|
||||
Field('session_data', 'blob'),
|
||||
migrate=table_migrate,
|
||||
)
|
||||
table = db[tname] # to allow for lazy table
|
||||
)
|
||||
table = db[tname] # to allow for lazy table
|
||||
try:
|
||||
|
||||
# Get session data out of the database
|
||||
(record_id, unique_key) = response.session_id.split(':')
|
||||
if record_id == '0':
|
||||
raise Exception, 'record_id == 0'
|
||||
raise Exception('record_id == 0')
|
||||
# Select from database
|
||||
if not session_cookie_data:
|
||||
rows = db(table.id == record_id).select()
|
||||
# Make sure the session data exists in the database
|
||||
if len(rows) == 0 or rows[0].unique_key != unique_key:
|
||||
raise Exception, 'No record'
|
||||
raise Exception('No record')
|
||||
# rows[0].update_record(locked=True)
|
||||
# Unpickle the data
|
||||
session_data = cPickle.loads(rows[0].session_data)
|
||||
@@ -620,7 +644,8 @@ class Session(Storage):
|
||||
rcookies[response.session_id_name] = response.session_id
|
||||
rcookies[response.session_id_name]['path'] = '/'
|
||||
if cookie_expires:
|
||||
rcookies[response.session_id_name]['expires'] = cookie_expires.strftime(FMT)
|
||||
rcookies[response.session_id_name][
|
||||
'expires'] = cookie_expires.strftime(FMT)
|
||||
# if not cookie_key, but session_data_name in cookies
|
||||
# expire session_data_name from cookies
|
||||
if session_cookie_data:
|
||||
@@ -637,10 +662,10 @@ class Session(Storage):
|
||||
self._start_timestamp = datetime.datetime.today()
|
||||
return True
|
||||
|
||||
def is_expired(self, seconds = 3600):
|
||||
def is_expired(self, seconds=3600):
|
||||
now = datetime.datetime.today()
|
||||
if not self._last_timestamp or \
|
||||
self._last_timestamp + datetime.timedelta(seconds = seconds) > now:
|
||||
self._last_timestamp + datetime.timedelta(seconds=seconds) > now:
|
||||
self._last_timestamp = now
|
||||
return False
|
||||
else:
|
||||
@@ -654,12 +679,13 @@ class Session(Storage):
|
||||
self._forget = True
|
||||
|
||||
def _try_store_in_cookie(self, request, response):
|
||||
if response.session_storage_type!='cookie': return False
|
||||
if response.session_storage_type != 'cookie':
|
||||
return False
|
||||
name = response.session_data_name
|
||||
value = secure_dumps(dict(self),response.session_cookie_key, compression_level=response.session_cookie_compression_level)
|
||||
value = secure_dumps(dict(self), response.session_cookie_key, compression_level=response.session_cookie_compression_level)
|
||||
expires = response.session_cookie_expires
|
||||
rcookies = response.cookies
|
||||
rcookies.pop(name,None)
|
||||
rcookies.pop(name, None)
|
||||
rcookies[name] = value
|
||||
rcookies[name]['path'] = '/'
|
||||
if expires:
|
||||
@@ -667,7 +693,7 @@ class Session(Storage):
|
||||
return True
|
||||
|
||||
def _unchanged(self):
|
||||
previous_session_hash = self.pop('_session_hash',None)
|
||||
previous_session_hash = self.pop('_session_hash', None)
|
||||
if not previous_session_hash and not \
|
||||
any(value is not None for value in self.itervalues()):
|
||||
return True
|
||||
@@ -683,7 +709,7 @@ class Session(Storage):
|
||||
# don't save if file-based sessions,
|
||||
# no session id, or session being forgotten
|
||||
# or no changes to session
|
||||
if response.session_storage_type!='db' or not response.session_id \
|
||||
if response.session_storage_type != 'db' or not response.session_id \
|
||||
or self._forget or self._unchanged():
|
||||
return False
|
||||
|
||||
@@ -692,7 +718,7 @@ class Session(Storage):
|
||||
unique_key = response.session_db_unique_key
|
||||
|
||||
dd = dict(locked=False,
|
||||
client_ip=request.client.replace(':','.'),
|
||||
client_ip=request.client.replace(':', '.'),
|
||||
modified_datetime=request.now,
|
||||
session_data=cPickle.dumps(dict(self)),
|
||||
unique_key=unique_key)
|
||||
@@ -708,11 +734,11 @@ class Session(Storage):
|
||||
|
||||
def _try_store_in_cookie_or_file(self, request, response):
|
||||
return \
|
||||
self._try_store_in_cookie(request,response) or \
|
||||
self._try_store_in_file(request,response)
|
||||
self._try_store_in_cookie(request, response) or \
|
||||
self._try_store_in_file(request, response)
|
||||
|
||||
def _try_store_in_file(self, request, response):
|
||||
if response.session_storage_type!='file':
|
||||
if response.session_storage_type != 'file':
|
||||
return False
|
||||
|
||||
try:
|
||||
@@ -740,7 +766,7 @@ class Session(Storage):
|
||||
try:
|
||||
portalocker.unlock(response.session_file)
|
||||
response.session_locked = False
|
||||
except: ### this should never happen but happens in Windows
|
||||
except: # this should never happen but happens in Windows
|
||||
pass
|
||||
|
||||
def _close(self, response):
|
||||
|
||||
Reference in new issue
Block a user