Welcome to web2py’s API documentation!¶
Contents:
admin
Module¶
Utility functions for the Admin application¶
-
gluon.admin.
apath
(path='', r=None)[source]¶ Builds a path inside an application folder
Parameters: - path (str) – path within the application folder
- r – the global request object
-
gluon.admin.
app_cleanup
(app, request)[source]¶ Removes session, cache and error files
Parameters: - app (str) – application name
- request – the global request object
Returns: True if everything went ok, False otherwise
-
gluon.admin.
app_compile
(app, request)[source]¶ Compiles the application
Parameters: - app (str) – application name
- request – the global request object
Returns: None if everything went ok, traceback text if errors are found
-
gluon.admin.
app_create
(app, request, force=False, key=None, info=False)[source]¶ Create a copy of welcome.w2p (scaffolding) app
Parameters: - app (str) – application name
- request – the global request object
-
gluon.admin.
app_install
(app, fobj, request, filename, overwrite=None)[source]¶ Installs an application:
- Identifies file type by filename
- Writes fobj contents to the ../deposit/ folder
- Calls w2p_unpack() to do the job.
Parameters: - app (str) – new application name
- fobj (obj) – file object containing the application to be installed
- request – the global request object
- filename (str) – original filename of the fobj, required to determine extension
- overwrite (bool) – force overwrite of existing application
Returns: name of the file where app is temporarily stored or None on failure
-
gluon.admin.
app_pack
(app, request, raise_ex=False, filenames=None)[source]¶ Builds a w2p package for the application
Parameters: - app (str) – application name
- request – the global request object
Returns: filename of the w2p file or None on error
-
gluon.admin.
app_pack_compiled
(app, request, raise_ex=False)[source]¶ Builds a w2p bytecode-compiled package for the application
Parameters: - app (str) – application name
- request – the global request object
Returns: filename of the w2p file or None on error
-
gluon.admin.
app_uninstall
(app, request)[source]¶ Uninstalls the application.
Parameters: - app (str) – application name
- request – the global request object
Returns: True on success, False on failure
-
gluon.admin.
check_new_version
(myversion, version_url)[source]¶ Compares current web2py’s version with the latest stable web2py version.
Parameters: - myversion – the current version as stored in file web2py/VERSION
- version_URL – the URL that contains the version of the latest stable release
Returns: state, version
- state : True if upgrade available, False if current version is up-to-date, -1 on error
- version : the most up-to-version available
Return type: tuple
-
gluon.admin.
plugin_install
(app, fobj, request, filename)[source]¶ Installs a plugin:
- Identifies file type by filename
- Writes fobj contents to the ../deposit/ folder
- Calls w2p_unpack_plugin() to do the job.
Parameters: - app (str) – new application name
- fobj – file object containing the application to be installed
- request – the global request object
- filename – original filename of the fobj, required to determine extension
Returns: name of the file where plugin is temporarily stored or False on failure
-
gluon.admin.
plugin_pack
(app, plugin_name, request)[source]¶ Builds a w2p package for the plugin
Parameters: - app (str) – application name
- plugin_name (str) – the name of the plugin without plugin_ prefix
- request – the current request app
Returns: filename of the w2p file or False on error
-
gluon.admin.
unzip
(filename, dir, subfolder='')[source]¶ Unzips filename into dir (.zip only, no .gz etc)
Parameters: - filename (str) – archive
- dir (str) – destination
- subfolder (str) – if != ‘’ unzips only files in subfolder
-
gluon.admin.
upgrade
(request, url='http://web2py.com')[source]¶ Upgrades web2py (src, osx, win) if a new version is posted. It detects whether src, osx or win is running and downloads the right one
Parameters: - request – the current request object (required to determine version and path)
- url – the incomplete url where to locate the latest web2py (actual url is url+’/examples/static/web2py_(src|osx|win).zip’)
- Returns
tuple: completed, traceback
- completed: True on success, False on failure (network problem or old version)
- traceback: None on success, raised exception details on failure
cache
Module¶
Basic caching classes and methods¶
- Cache - The generic caching object interfacing with the others
- CacheInRam - providing caching in ram
- CacheOnDisk - provides caches on disk
Memcache is also available via a different module (see gluon.contrib.memcache)
When web2py is running on Google App Engine, caching will be provided by the GAE memcache (see gluon.contrib.gae_memcache)
-
class
gluon.cache.
Cache
(request)[source]¶ Bases:
object
Sets up generic caching, creating an instance of both CacheInRam and CacheOnDisk. In case of GAE will make use of gluon.contrib.gae_memcache.
- self.ram is an instance of CacheInRam
- self.disk is an instance of CacheOnDisk
-
action
(time_expire=300, cache_model=None, prefix=None, session=False, vars=True, lang=True, user_agent=False, public=True, valid_statuses=None, quick=None)[source]¶ Better fit for caching an action
Warning
Experimental!
Currently only HTTP 1.1 compliant reference : http://code.google.com/p/doctype-mirror/wiki/ArticleHttpCaching
Parameters: - time_expire (int) – same as @cache
- cache_model (str) – same as @cache
- prefix (str) – add a prefix to the calculated key
- session (bool) – adds response.session_id to the key
- vars (bool) – adds request.env.query_string
- lang (bool) – adds T.accepted_language
- user_agent (bool or dict) – if True, adds is_mobile and is_tablet to the key. Pass a dict to use all the needed values (uses str(.items())) (e.g. user_agent=request.user_agent()). Used only if session is not True
- public (bool) – if False forces the Cache-Control to be ‘private’
- valid_statuses – by default only status codes starting with 1,2,3 will be cached. pass an explicit list of statuses on which turn the cache on
- quick – Session,Vars,Lang,User-agent,Public: fast overrides with initials, e.g. ‘SVLP’ or ‘VLP’, or ‘VLP’
-
autokey
= ':%(name)s:%(args)s:%(vars)s'¶
-
gluon.cache.
lazy_cache
(key=None, time_expire=None, cache_model='ram')[source]¶ Can be used to cache any function including ones in modules, as long as the cached function is only called within a web2py request
If a key is not provided, one is generated from the function name time_expire defaults to None (no cache expiration)
If cache_model is “ram” then the model is current.cache.ram, etc.
cfs
Module¶
Functions required to execute app components¶
Note
FOR INTERNAL USE ONLY
-
gluon.cfs.
getcfs
(key, filename, filter=None)[source]¶ Caches the filtered file filename with key until the file is modified.
Parameters: - key (str) – the cache key
- filename – the file to cache
- filter – is the function used for filtering. Normally filename is a .py file and filter is a function that bytecode compiles the file. In this way the bytecode compiled file is cached. (Default = None)
This is used on Google App Engine since pyc files cannot be saved.
compileapp
Module¶
Functions required to execute app components¶
Note
FOR INTERNAL USE ONLY
-
gluon.compileapp.
LOAD
(c=None, f='index', args=None, vars=None, extension=None, target=None, ajax=False, ajax_trap=False, url=None, user_signature=False, timeout=None, times=1, content='loading...', post_vars=<Storage {}>, **attr)[source]¶ LOADs a component into the action’s document
Parameters: - c (str) – controller
- f (str) – function
- args (tuple or list) – arguments
- vars (dict) – vars
- extension (str) – extension
- target (str) – id of the target
- ajax (bool) – True to enable AJAX bahaviour
- ajax_trap (bool) – True if ajax is set to True, traps both links and forms “inside” the target
- url (str) – overrides c,`f`,`args` and vars
- user_signature (bool) – adds hmac signature to all links with a key that is different for every user
- timeout (int) – in milliseconds, specifies the time to wait before starting the request or the frequency if times is greater than 1 or “infinity”
- times (integer or str) – how many times the component will be requested “infinity” or “continuous” are accepted to reload indefinitely the component
-
class
gluon.compileapp.
LoadFactory
(environment)[source]¶ Bases:
object
Attention: this helper is new and experimental
-
gluon.compileapp.
build_environment
(request, response, session, store_current=True)[source]¶ Build the environment dictionary into which web2py files are executed.
-
gluon.compileapp.
compile_application
(folder)[source]¶ Compiles all models, views, controller for the application in folder.
-
gluon.compileapp.
compile_controllers
(folder)[source]¶ Compiles all the controllers in the application specified by folder
-
gluon.compileapp.
compile_models
(folder)[source]¶ Compiles all the models in the application specified by folder
-
gluon.compileapp.
compile_views
(folder)[source]¶ Compiles all the views in the application specified by folder
-
gluon.compileapp.
local_import_aux
(name, reload_force=False, app='welcome')[source]¶ In apps, instead of importing a local module (in applications/app/modules) with:
import a.b.c as d
you should do:
d = local_import('a.b.c')
or (to force a reload):
d = local_import(‘a.b.c’, reload=True)This prevents conflict between applications and un-necessary execs. It can be used to import any module, including regular Python modules.
-
class
gluon.compileapp.
mybuiltin
[source]¶ Bases:
object
NOTE could simple use a dict and populate it, NOTE not sure if this changes things though if monkey patching import.....
-
gluon.compileapp.
read_pyc
(filename)[source]¶ Read the code inside a bytecode compiled file if the MAGIC number is compatible
Returns: a code object
-
gluon.compileapp.
remove_compiled_application
(folder)[source]¶ Deletes the folder compiled containing the compiled application.
-
gluon.compileapp.
run_controller_in
(controller, function, environment)[source]¶ Runs the controller.function() (for the app specified by the current folder). It tries pre-compiled controller_function.pyc first before compiling it.
-
gluon.compileapp.
run_models_in
(environment)[source]¶ Runs all models (in the app specified by the current folder) It tries pre-compiled models first before compiling them.
contenttype
Module¶
CONTENT_TYPE dictionary created against freedesktop.org’s shared mime info database version 1.1.
- Deviations from official standards:
- .md: application/x-genesis-rom –> text/x-markdown
- .png: image/x-apple-ios-png –> image/png
- Additions:
- .load: text/html
- .json: application/json
- .jsonp: application/jsonp
- .pickle: application/python-pickle
- .w2p’: application/w2p
custom_import
Module¶
Support for smart import syntax for web2py applications¶
-
class
gluon.custom_import.
TrackImporter
[source]¶ Bases:
object
An importer tracking the date of the module files and reloading them when they are changed.
-
PACKAGE_PATH_SUFFIX
= '/__init__.py'¶
-
THREAD_LOCAL
= <thread._local object>¶
-
-
gluon.custom_import.
custom_importer
(name, globals=None, locals=None, fromlist=None, level=-1)[source]¶ web2py’s custom importer. It behaves like the standard Python importer but it tries to transform import statements as something like “import applications.app_name.modules.x”. If the import fails, it falls back on naive_importer
dal
Module¶
Go to http://pydal.readthedocs.org/en/latest/ for docs on pyDAL
Takes care of adapting pyDAL to web2py’s needs¶
debug
Module¶
Debugger support classes¶
-
class
gluon.debug.
WebDebugger
(pipe, completekey='tab', stdin=None, stdout=None)[source]¶ Bases:
gluon.contrib.qdb.Frontend
Qdb web2py interface
decoder
Module¶
Caller will hand this library a buffer and ask it to either convert it or auto-detect the type.
Based on http://code.activestate.com/recipes/52257/
Licensed under the PSF License
fileutils
Module¶
File operations¶
-
gluon.fileutils.
read_file
(filename, mode='r')[source]¶ Returns content from filename, making sure to close the file explicitly on exit.
-
gluon.fileutils.
write_file
(filename, value, mode='w')[source]¶ Writes <value> to filename, making sure to close the file explicitly on exit.
-
gluon.fileutils.
readlines_file
(filename, mode='r')[source]¶ Applies .split(‘ ‘) to the output of read_file()
-
gluon.fileutils.
abspath
(*relpath, **base)[source]¶ Converts relative path to absolute path based (by default) on applications_parent
-
gluon.fileutils.
listdir
(path, expression='^.+$', drop=True, add_dirs=False, sort=True, maxnum=None, exclude_content_from=None)[source]¶ Like os.listdir() but you can specify a regex pattern to filter files. If add_dirs is True, the returned items will have the full path.
-
gluon.fileutils.
recursive_unlink
(f)[source]¶ Deletes f. If it’s a folder, also its contents will be deleted
-
gluon.fileutils.
cleanpath
(path)[source]¶ Turns any expression/path into a valid filename. replaces / with _ and removes special characters.
-
gluon.fileutils.
tar
(file, dir, expression='^.+$', filenames=None, exclude_content_from=None)[source]¶ Tars dir into file, only tars file that match expression
-
gluon.fileutils.
tar_compiled
(file, dir, expression='^.+$', exclude_content_from=None)[source]¶ Used to tar a compiled application. The content of models, views, controllers is not stored in the tar file.
-
gluon.fileutils.
get_session
(request, other_application='admin')[source]¶ Checks that user is authorized to access other_application
-
gluon.fileutils.
check_credentials
(request, other_application='admin', expiration=3600, gae_login=True)[source]¶ Checks that user is authorized to access other_application
-
gluon.fileutils.
w2p_pack
(filename, path, compiled=False, filenames=None)[source]¶ Packs a web2py application.
Parameters: - filename (str) – path to the resulting archive
- path (str) – path to the application
- compiled (bool) – if True packs the compiled version
- filenames (list) – adds filenames to the archive
globals
Module¶
Contains the classes for the global used variables:
- Request
- Response
- Session
-
class
gluon.globals.
Request
(env)[source]¶ Bases:
gluon.storage.Storage
Defines the request object and the default values of its members
- env: environment variables, by gluon.main.wsgibase()
- cookies
- get_vars
- post_vars
- vars
- folder
- application
- function
- args
- extension
- now: datetime.datetime.now()
- utcnow : datetime.datetime.utcnow()
- is_local
- is_https
- restful()
-
body
¶
-
get_vars
¶ Lazily parses the query string into get_vars
-
parse_post_vars
()[source]¶ Takes the body of the request and unpacks it into post_vars. application/json is also automatically parsed
-
post_vars
¶ Lazily parse the body into post_vars
-
requires_https
()[source]¶ If request comes in over HTTP, redirects it to HTTPS and secures the session.
-
uuid
¶ Lazily uuid
-
vars
¶ Lazily parses all get_vars and post_vars to fill vars
-
class
gluon.globals.
Response
[source]¶ Bases:
gluon.storage.Storage
Defines the response object and the default values of its members response.write( ) can be used to write in the output html
-
download
(request, db, chunk_size=65536, attachment=True, download_filename=None)[source]¶ Example of usage in controller:
def download(): return response.download(request, db)
Downloads from http://..../download/filename
-
include_files
(extensions=None)[source]¶ Includes files (usually in the head). Can minify and cache local files By default, caches in ram for 5 minutes. To change, response.cache_includes = (cache_method, time_expire). Example: (cache.disk, 60) # caches to disk for 1 minute.
-
stream
(stream, chunk_size=65536, request=None, attachment=False, filename=None)[source]¶ If in a controller function:
return response.stream(file, 100)
the file content will be streamed at 100 bytes at the time
Parameters: - stream – filename or read()able content
- chunk_size (int) – Buffer size
- request – the request object
- attachment (bool) – prepares the correct headers to download the file as an attachment. Usually creates a pop-up download window on browsers
- filename (str) – the name for the attachment
Note
for using the stream name (filename) with attachments the option must be explicitly set as function parameter (will default to the last request argument otherwise)
-
xmlrpc
(request, methods)[source]¶ assuming:
def add(a, b): return a+b
if a controller function “func”:
return response.xmlrpc(request, [add])
the controller will be able to handle xmlrpc requests for the add function. Example:
import xmlrpclib connection = xmlrpclib.ServerProxy( 'http://hostname/app/contr/func') print connection.add(3, 4)
-
-
class
gluon.globals.
Session
[source]¶ Bases:
gluon.storage.Storage
Defines the session object and the default values of its members (None)
- session_storage_type : ‘file’, ‘db’, or ‘cookie’
- session_cookie_compression_level :
- session_cookie_expires : cookie expiration
- session_cookie_key : for encrypted sessions in cookies
- session_id : a number or None if no session
- session_id_name :
- session_locked :
- session_masterapp :
- session_new : a new session obj is being created
- session_hash : hash of the pickled loaded session
- session_pickled : picked session
if session in cookie:
- session_data_name : name of the cookie for session data
if session in db:
- session_db_record_id
- session_db_table
- session_db_unique_key
if session in file:
- session_file
- session_filename
-
connect
(request=None, response=None, db=None, tablename='web2py_session', masterapp=None, migrate=True, separate=None, check_client=False, cookie_key=None, cookie_expires=None, compression_level=None)[source]¶ Used in models, allows to customize Session handling
Parameters: - request – the request object
- response – the response object
- db – to store/retrieve sessions in db (a table is created)
- tablename (str) – table name
- masterapp (str) – points to another’s app sessions. This enables a “SSO” environment among apps
- migrate – passed to the underlying db
- separate –
with True, creates a folder with the 2 initials of the session id. Can also be a function, e.g.
separate=lambda(session_name): session_name[-2:]
- check_client – if True, sessions can only come from the same ip
- cookie_key (str) – secret for cookie encryption
- cookie_expires – sets the expiration of the cookie
- compression_level (int) – 0-9, sets zlib compression on the data before the encryption
highlight
Module¶
html
Module¶
Template helpers¶
-
class
gluon.html.
A
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
Generates an A() link. A() in web2py is really important and with the included web2py.js allows lots of Ajax interactions in the page
On top of “usual” _attributes, it takes
Parameters: - callback – an url to call but not redirect to
- cid – if you want to load the _href into an element of the page (component) pass its id (without the #) here
- delete – element to delete after calling callback
- target – same thing as cid
- confirm – text to display upon a callback with a delete
- noconfirm – don’t display alert upon a callback with delete
-
tag
= 'a'¶
-
class
gluon.html.
B
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'b'¶
-
-
class
gluon.html.
BEAUTIFY
(component, **attributes)[source]¶ Bases:
gluon.html.DIV
Turns any list, dictionary, etc into decent looking html.
Two special attributes are
- sorted: a function that takes the dict and returned sorted keys
- keyfilter: a function that takes a key and returns its representation or None if the key is to be skipped. By default key[:1]==’_’ is skipped.
Examples:
>>> BEAUTIFY(['a', 'b', {'hello': 'world'}]).xml() '<div><table><tr><td><div>a</div></td></tr><tr><td><div>b</div></td></tr><tr><td><div><table><tr><td style="font-weight:bold;vertical-align:top;">hello</td><td style="vertical-align:top;">:</td><td><div>world</div></td></tr></table></div></td></tr></table></div>'
-
tag
= 'div'¶
-
class
gluon.html.
BODY
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'body'¶
-
-
class
gluon.html.
BR
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'br/'¶
-
-
class
gluon.html.
BUTTON
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'button'¶
-
-
class
gluon.html.
CENTER
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'center'¶
-
-
class
gluon.html.
CAT
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= ''¶
-
-
class
gluon.html.
CODE
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
Displays code in HTML with syntax highlighting.
Parameters: - language – indicates the language, otherwise PYTHON is assumed
- link – can provide a link
- styles – for styles
Examples:
- {{=CODE(“print ‘hello world’”, language=’python’, link=None,
- counter=1, styles={}, highlight_line=None)}}
supported languages are
“python”, “html_plain”, “c”, “cpp”, “web2py”, “html”The “html” language interprets {{ and }} tags as “web2py” code, “html_plain” doesn’t.
if a link=’/examples/global/vars/’ is provided web2py keywords are linked to the online docs.
the counter is used for line numbering, counter can be None or a prompt string.
-
class
gluon.html.
COL
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'col/'¶
-
-
class
gluon.html.
COLGROUP
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'colgroup'¶
-
-
class
gluon.html.
DIV
(*components, **attributes)[source]¶ Bases:
gluon.html.XmlComponent
HTML helper, for easy generating and manipulating a DOM structure. Little or no validation is done.
Behaves like a dictionary regarding updating of attributes. Behaves like a list regarding inserting/appending components.
Examples:
>>> DIV('hello', 'world', _style='color:red;').xml() '<div style="color:red;">helloworld</div>'
All other HTML helpers are derived from DIV.
_something=”value” attributes are transparently translated into something=”value” HTML attributes
-
append
(value)[source]¶ list style appending of components
Examples:
>>> a=DIV() >>> a.append(SPAN('x')) >>> print a <div><span>x</span></div>
-
element
(*args, **kargs)[source]¶ Finds the first component that matches the supplied attribute dictionary, or None if nothing could be found
Also the components of the components are searched.
-
elements
(*args, **kargs)[source]¶ Find all components that match the supplied attribute dictionary, or None if nothing could be found
All components of the components are searched.
Examples:
>>> a = DIV(DIV(SPAN('x'),3,DIV(SPAN('y')))) >>> for c in a.elements('span',first_only=True): c[0]='z' >>> print a <div><div><span>z</span>3<div><span>y</span></div></div></div> >>> for c in a.elements('span'): c[0]='z' >>> print a <div><div><span>z</span>3<div><span>z</span></div></div></div>
It also supports a syntax compatible with jQuery
Examples:
>>> a=TAG('<div><span><a id="1-1" u:v=$>hello</a></span><p class="this is a test">world</p></div>') >>> for e in a.elements('div a#1-1, p.is'): print e.flatten() hello world >>> for e in a.elements('#1-1'): print e.flatten() hello >>> a.elements('a[u:v=$]')[0].xml() '<a id="1-1" u:v="$">hello</a>' >>> a=FORM( INPUT(_type='text'), SELECT(range(1)), TEXTAREA() ) >>> for c in a.elements('input, select, textarea'): c['_disabled'] = 'disabled' >>> a.xml() '<form action="#" enctype="multipart/form-data" method="post"><input disabled="disabled" type="text" /><select disabled="disabled"><option value="0">0</option></select><textarea cols="40" disabled="disabled" rows="10"></textarea></form>'
Elements that are matched can also be replaced or removed by specifying a “replace” argument (note, a list of the original matching elements is still returned as usual).
Examples:
>>> a = DIV(DIV(SPAN('x', _class='abc'), DIV(SPAN('y', _class='abc'), SPAN('z', _class='abc')))) >>> b = a.elements('span.abc', replace=P('x', _class='xyz')) >>> print a <div><div><p class="xyz">x</p><div><p class="xyz">x</p><p class="xyz">x</p></div></div></div>
“replace” can be a callable, which will be passed the original element and should return a new element to replace it.
Examples:
>>> a = DIV(DIV(SPAN('x', _class='abc'), DIV(SPAN('y', _class='abc'), SPAN('z', _class='abc')))) >>> b = a.elements('span.abc', replace=lambda el: P(el[0], _class='xyz')) >>> print a <div><div><p class="xyz">x</p><div><p class="xyz">y</p><p class="xyz">z</p></div></div></div>
If replace=None, matching elements will be removed completely.
Examples:
>>> a = DIV(DIV(SPAN('x', _class='abc'), DIV(SPAN('y', _class='abc'), SPAN('z', _class='abc')))) >>> b = a.elements('span', find='y', replace=None) >>> print a <div><div><span class="abc">x</span><div><span class="abc">z</span></div></div></div>
If a “find_text” argument is specified, elements will be searched for text components that match find_text, and any matching text components will be replaced (find_text is ignored if “replace” is not also specified). Like the “find” argument, “find_text” can be a string or a compiled regex.
Examples:
>>> a = DIV(DIV(SPAN('x', _class='abc'), DIV(SPAN('y', _class='abc'), SPAN('z', _class='abc')))) >>> b = a.elements(find_text=re.compile('x|y|z'), replace='hello') >>> print a <div><div><span class="abc">hello</span><div><span class="abc">hello</span><span class="abc">hello</span></div></div></div>
If other attributes are specified along with find_text, then only components that match the specified attributes will be searched for find_text.
Examples:
>>> a = DIV(DIV(SPAN('x', _class='abc'), DIV(SPAN('y', _class='efg'), SPAN('z', _class='abc')))) >>> b = a.elements('span.efg', find_text=re.compile('x|y|z'), replace='hello') >>> print a <div><div><span class="abc">x</span><div><span class="efg">hello</span><span class="abc">z</span></div></div></div>
-
flatten
(render=None)[source]¶ Returns the text stored by the DIV object rendered by the render function the render function must take text, tagname, and attributes render=None is equivalent to render=lambda text, tag, attr: text
Examples:
>>> markdown = lambda text,tag=None,attributes={}: {None: re.sub('\s+',' ',text), 'h1':'#'+text+'\n\n', 'p':text+'\n'}.get(tag,text) >>> a=TAG('<h1>Header</h1><p>this is a test</p>') >>> a.flatten(markdown) '#Header\n\nthis is a test\n'
-
insert
(i, value)[source]¶ List-style inserting of components
Examples:
>>> a=DIV() >>> a.insert(0,SPAN('x')) >>> print a <div><span>x</span></div>
-
regex_attr
= <_sre.SRE_Pattern object>¶
-
regex_class
= <_sre.SRE_Pattern object>¶
-
regex_id
= <_sre.SRE_Pattern object>¶
-
regex_tag
= <_sre.SRE_Pattern object>¶
-
sibling
(*args, **kargs)[source]¶ Finds the first sibling component that match the supplied argument list and attribute dictionary, or None if nothing could be found
-
siblings
(*args, **kargs)[source]¶ Finds all sibling components that match the supplied argument list and attribute dictionary, or None if nothing could be found
-
tag
= 'div'¶
-
-
class
gluon.html.
EM
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'em'¶
-
-
class
gluon.html.
EMBED
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'embed/'¶
-
-
class
gluon.html.
FIELDSET
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'fieldset'¶
-
-
class
gluon.html.
FORM
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
Examples:
>>> from validators import IS_NOT_EMPTY >>> form=FORM(INPUT(_name="test", requires=IS_NOT_EMPTY())) >>> form.xml() '<form action="#" enctype="multipart/form-data" method="post"><input name="test" type="text" /></form>'
a FORM is container for INPUT, TEXTAREA, SELECT and other helpers
form has one important method:
form.accepts(request.vars, session)
if form is accepted (and all validators pass) form.vars contains the accepted vars, otherwise form.errors contains the errors. in case of errors the form is modified to present the errors to the user.
-
REDIRECT_JS
= "window.location='%s';return false"¶
-
accepts
(request_vars, session=None, formname='default', keepvalues=False, onvalidation=None, hideerror=False, **kwargs)[source]¶ kwargs is not used but allows to specify the same interface for FORM and SQLFORM
-
as_dict
(flat=False, sanitize=True)[source]¶ EXPERIMENTAL
Sanitize is naive. It should catch any unsafe value for client retrieval.
-
process
(**kwargs)[source]¶ Perform the .validate() method but returns the form
Usage in controllers:
# directly on return def action(): #some code here return dict(form=FORM(...).process(...))
You can use it with FORM, SQLFORM or FORM based plugins:
# response.flash messages def action(): form = SQLFORM(db.table).process(message_onsuccess='Sucess!') return dict(form=form) # callback function # callback receives True or False as first arg, and a list of args. def my_callback(status, msg): response.flash = "Success! "+msg if status else "Errors occured" # after argument can be 'flash' to response.flash messages # or a function name to use as callback or None to do nothing. def action(): return dict(form=SQLFORM(db.table).process(onsuccess=my_callback)
-
tag
= 'form'¶
-
validate
(**kwargs)[source]¶ This function validates the form, you can use it instead of directly form.accepts.
Usage: In controller:
def action(): form=FORM(INPUT(_name="test", requires=IS_NOT_EMPTY())) form.validate() #you can pass some args here - see below return dict(form=form)
This can receive a bunch of arguments
- onsuccess = ‘flash’ - will show message_onsuccess in response.flash
- None - will do nothing can be a function (lambda form: pass)
- onfailure = ‘flash’ - will show message_onfailure in response.flash
- None - will do nothing can be a function (lambda form: pass)
- onchange = ‘flash’ - will show message_onchange in response.flash
- None - will do nothing can be a function (lambda form: pass)
message_onsuccess message_onfailure message_onchange next = where to redirect in case of success any other kwargs will be passed for form.accepts(...)
-
-
class
gluon.html.
H1
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'h1'¶
-
-
class
gluon.html.
H2
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'h2'¶
-
-
class
gluon.html.
H3
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'h3'¶
-
-
class
gluon.html.
H4
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'h4'¶
-
-
class
gluon.html.
H5
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'h5'¶
-
-
class
gluon.html.
H6
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'h6'¶
-
-
class
gluon.html.
HEAD
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'head'¶
-
-
class
gluon.html.
HR
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'hr/'¶
-
-
class
gluon.html.
HTML
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
There are four predefined document type definitions. They can be specified in the ‘doctype’ parameter:
- ‘strict’ enables strict doctype
- ‘transitional’ enables transitional doctype (default)
- ‘frameset’ enables frameset doctype
- ‘html5’ enables HTML 5 doctype
- any other string will be treated as user’s own doctype
‘lang’ parameter specifies the language of the document. Defaults to ‘en’.
See also DIV
-
frameset
= '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">\n'¶
-
html5
= '<!DOCTYPE HTML>\n'¶
-
strict
= '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">\n'¶
-
tag
= 'html'¶
-
transitional
= '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">\n'¶
-
class
gluon.html.
I
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'i'¶
-
-
class
gluon.html.
IFRAME
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'iframe'¶
-
-
class
gluon.html.
IMG
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'img/'¶
-
-
class
gluon.html.
INPUT
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
INPUT Component
Takes two special attributes value= and requires=.
Parameters: - value – used to pass the initial value for the input field. value differs from _value because it works for checkboxes, radio, textarea and select/option too. For a checkbox value should be ‘’ or ‘on’. For a radio or select/option value should be the _value of the checked/selected item.
- requires – should be None, or a validator or a list of validators for the value of the field.
Examples:
>>> INPUT(_type='text', _name='name', value='Max').xml() '<input name="name" type="text" value="Max" />'
>>> INPUT(_type='checkbox', _name='checkbox', value='on').xml() '<input checked="checked" name="checkbox" type="checkbox" value="on" />'
>>> INPUT(_type='radio', _name='radio', _value='yes', value='yes').xml() '<input checked="checked" name="radio" type="radio" value="yes" />'
>>> INPUT(_type='radio', _name='radio', _value='no', value='yes').xml() '<input name="radio" type="radio" value="no" />'
-
tag
= 'input/'¶
-
class
gluon.html.
LABEL
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'label'¶
-
-
class
gluon.html.
LEGEND
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'legend'¶
-
-
class
gluon.html.
LI
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'li'¶
-
-
class
gluon.html.
LINK
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'link/'¶
-
-
class
gluon.html.
OL
(*components, **attributes)[source]¶ Bases:
gluon.html.UL
-
tag
= 'ol'¶
-
-
class
gluon.html.
UL
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
UL Component.
If subcomponents are not LI-components they will be wrapped in a LI
-
tag
= 'ul'¶
-
-
class
gluon.html.
MARKMIN
(text, extra=None, allowed=None, sep='p', url=None, environment=None, latex='google', autolinks='default', protolinks='default', class_prefix='', id_prefix='markmin_', **kwargs)[source]¶ Bases:
gluon.html.XmlComponent
For documentation: http://web2py.com/examples/static/markmin.html
-
class
gluon.html.
MENU
(data, **args)[source]¶ Bases:
gluon.html.DIV
Used to build menus
Parameters: - _class – defaults to ‘web2py-menu web2py-menu-vertical’
- ul_class – defaults to ‘web2py-menu-vertical’
- li_class – defaults to ‘web2py-menu-expand’
- li_first – defaults to ‘web2py-menu-first’
- li_last – defaults to ‘web2py-menu-last’
Use like:
menu = MENU([['name', False, URL(...), [submenu]], ...]) {{=menu}}
-
tag
= 'ul'¶
-
class
gluon.html.
META
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'meta/'¶
-
-
class
gluon.html.
OBJECT
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'object'¶
-
-
class
gluon.html.
OPTION
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'option'¶
-
-
class
gluon.html.
P
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
Will replace
\n
by<br />
if the cr2br attribute is provided.see also DIV
-
tag
= 'p'¶
-
-
class
gluon.html.
PRE
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'pre'¶
-
-
class
gluon.html.
SCRIPT
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'script'¶
-
-
class
gluon.html.
OPTGROUP
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'optgroup'¶
-
-
class
gluon.html.
SELECT
(*components, **attributes)[source]¶ Bases:
gluon.html.INPUT
Examples:
>>> from validators import IS_IN_SET >>> SELECT('yes', 'no', _name='selector', value='yes', ... requires=IS_IN_SET(['yes', 'no'])).xml() '<select name="selector"><option selected="selected" value="yes">yes</option><option value="no">no</option></select>'
-
tag
= 'select'¶
-
-
class
gluon.html.
SPAN
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'span'¶
-
-
class
gluon.html.
STRONG
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'strong'¶
-
-
class
gluon.html.
STYLE
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'style'¶
-
-
class
gluon.html.
TABLE
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
TABLE Component.
If subcomponents are not TR/TBODY/THEAD/TFOOT-components they will be wrapped in a TR
-
tag
= 'table'¶
-
-
gluon.html.
TAG
¶ TAG factory
Examples:
>>> print TAG.first(TAG.second('test'), _key = 3) <first key="3"><second>test</second></first>
-
class
gluon.html.
TD
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'td'¶
-
-
class
gluon.html.
TEXTAREA
(*components, **attributes)[source]¶ Bases:
gluon.html.INPUT
Examples:
TEXTAREA(_name='sometext', value='blah ' * 100, requires=IS_NOT_EMPTY())
‘blah blah blah ...’ will be the content of the textarea field.
-
tag
= 'textarea'¶
-
-
class
gluon.html.
TH
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'th'¶
-
-
class
gluon.html.
THEAD
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'thead'¶
-
-
class
gluon.html.
TBODY
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'tbody'¶
-
-
class
gluon.html.
TFOOT
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'tfoot'¶
-
-
class
gluon.html.
TITLE
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'title'¶
-
-
class
gluon.html.
TR
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
TR Component.
If subcomponents are not TD/TH-components they will be wrapped in a TD
-
tag
= 'tr'¶
-
-
class
gluon.html.
TT
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
-
tag
= 'tt'¶
-
-
gluon.html.
URL
(a=None, c=None, f=None, r=None, args=None, vars=None, anchor='', extension=None, env=None, hmac_key=None, hash_vars=True, salt=None, user_signature=None, scheme=None, host=None, port=None, encode_embedded_slash=False, url_encode=True, language=None)[source]¶ generates a url ‘/a/c/f’ corresponding to application a, controller c and function f. If r=request is passed, a, c, f are set, respectively, to r.application, r.controller, r.function.
The more typical usage is:
URL(‘index’)that generates a url for the index function within the present application and controller.
Parameters: - a – application (default to current if r is given)
- c – controller (default to current if r is given)
- f – function (default to current if r is given)
- r – request (optional)
- args – any arguments (optional). Additional “path” elements
- vars – any variables (optional). Querystring elements
- anchor – anchorname, without # (optional)
- extension – force an extension
- hmac_key – key to use when generating hmac signature (optional)
- hash_vars – which of the vars to include in our hmac signature True (default) - hash all vars, False - hash none of the vars, iterable - hash only the included vars [‘key1’,’key2’]
- salt – salt hashing with this string
- user_signature – signs automatically the URL in such way that only the user can access the URL (use with URL.verify or auth.requires_signature())
- scheme – URI scheme (True, ‘http’ or ‘https’, etc); forces absolute URL (optional)
- host – string to force absolute URL with host (True means http_host)
- port – optional port number (forces absolute URL)
- encode_embedded_slash – encode slash characters included in args
- url_encode – encode characters included in vars
Raises: SyntaxError
– when no application, controller or function is available or when a CRLF is found in the generated urlExamples:
>>> str(URL(a='a', c='c', f='f', args=['x', 'y', 'z'], ... vars={'p':1, 'q':2}, anchor='1')) '/a/c/f/x/y/z?p=1&q=2#1'
>>> str(URL(a='a', c='c', f='f', args=['x', 'y', 'z'], ... vars={'p':(1,3), 'q':2}, anchor='1')) '/a/c/f/x/y/z?p=1&p=3&q=2#1'
>>> str(URL(a='a', c='c', f='f', args=['x', 'y', 'z'], ... vars={'p':(3,1), 'q':2}, anchor='1')) '/a/c/f/x/y/z?p=3&p=1&q=2#1'
>>> str(URL(a='a', c='c', f='f', anchor='1+2')) '/a/c/f#1%2B2'
>>> str(URL(a='a', c='c', f='f', args=['x', 'y', 'z'], ... vars={'p':(1,3), 'q':2}, anchor='1', hmac_key='key')) '/a/c/f/x/y/z?p=1&p=3&q=2&_signature=a32530f0d0caa80964bb92aad2bedf8a4486a31f#1'
>>> str(URL(a='a', c='c', f='f', args=['w/x', 'y/z'])) '/a/c/f/w/x/y/z'
>>> str(URL(a='a', c='c', f='f', args=['w/x', 'y/z'], encode_embedded_slash=True)) '/a/c/f/w%2Fx/y%2Fz'
>>> str(URL(a='a', c='c', f='f', args=['%(id)d'], url_encode=False)) '/a/c/f/%(id)d'
>>> str(URL(a='a', c='c', f='f', args=['%(id)d'], url_encode=True)) '/a/c/f/%25%28id%29d'
>>> str(URL(a='a', c='c', f='f', vars={'id' : '%(id)d' }, url_encode=False)) '/a/c/f?id=%(id)d'
>>> str(URL(a='a', c='c', f='f', vars={'id' : '%(id)d' }, url_encode=True)) '/a/c/f?id=%25%28id%29d'
>>> str(URL(a='a', c='c', f='f', anchor='%(id)d', url_encode=False)) '/a/c/f#%(id)d'
>>> str(URL(a='a', c='c', f='f', anchor='%(id)d', url_encode=True)) '/a/c/f#%25%28id%29d'
-
class
gluon.html.
XHTML
(*components, **attributes)[source]¶ Bases:
gluon.html.DIV
This is XHTML version of the HTML helper.
There are three predefined document type definitions. They can be specified in the ‘doctype’ parameter:
- ‘strict’ enables strict doctype
- ‘transitional’ enables transitional doctype (default)
- ‘frameset’ enables frameset doctype
- any other string will be treated as user’s own doctype
‘lang’ parameter specifies the language of the document and the xml document. Defaults to ‘en’.
‘xmlns’ parameter specifies the xml namespace. Defaults to ‘http://www.w3.org/1999/xhtml‘.
See also DIV
-
frameset
= '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">\n'¶
-
strict
= '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n'¶
-
tag
= 'html'¶
-
transitional
= '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">\n'¶
-
xmlns
= 'http://www.w3.org/1999/xhtml'¶
-
class
gluon.html.
XML
(text, sanitize=False, permitted_tags=['a', 'b', 'blockquote', 'br/', 'i', 'li', 'ol', 'ul', 'p', 'cite', 'code', 'pre', 'img/', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'table', 'tr', 'td', 'div', 'strong', 'span'], allowed_attributes={'a': ['href', 'title', 'target'], 'td': ['colspan'], 'blockquote': ['type'], 'img': ['src', 'alt']})[source]¶ Bases:
gluon.html.XmlComponent
use it to wrap a string that contains XML/HTML so that it will not be escaped by the template
Examples:
>>> XML('<h1>Hello</h1>').xml() '<h1>Hello</h1>'
-
elements
(*args, **kargs)[source]¶ to be considered experimental since the behavior of this method is questionable another option could be TAG(self.text).elements(*args,**kwargs)
-
http
Module¶
HTTP statuses helpers¶
-
exception
gluon.http.
HTTP
(status, body='', cookies=None, **headers)[source]¶ Bases:
exceptions.Exception
Raises an HTTP response
Parameters: - status – usually an integer. If it’s a well known status code, the ERROR message will be automatically added. A string can also be passed as 510 Foo Bar and in that case the status code and the error message will be parsed accordingly
- body – what to return as body. If left as is, will return the error code and the status message in the body itself
- cookies – pass cookies along (usually not needed)
- headers – pass headers as usual dict mapping
-
message
¶ compose a message describing this exception
“status defined_status [web2py_error]”message elements that are not defined are omitted
-
gluon.http.
redirect
(location='', how=303, client_side=False, headers=None)[source]¶ Raises a redirect (303)
Parameters: - location – the url where to redirect
- how – what HTTP status code to use when redirecting
- client_side – if set to True, it triggers a reload of the entire page when the fragment has been loaded as a component
languages
Module¶
Translation system¶
-
class
gluon.languages.
translator
(langpath, http_accept_language)[source]¶ Bases:
object
This class is instantiated by gluon.compileapp.build_environment as the T object
Example
T.force(None) # turns off translation T.force(‘fr, it’) # forces web2py to translate using fr.py or it.py
T(“Hello World”) # translates “Hello World” using the selected file
Note
- there is no need to force since, by default, T uses http_accept_language to determine a translation file.
- en and en-en are considered different languages!
- if language xx-yy is not found force() probes other similar languages using such algorithm: xx-yy.py -> xx.py -> xx-yy*.py -> xx*.py
-
M
(message, symbols={}, language=None, lazy=None, filter=None, ftag=None, ns=None)[source]¶ Gets cached translated markmin-message with inserted parametes if lazy==True lazyT object is returned
-
force
(*languages)[source]¶ Selects language(s) for translation
if a list of languages is passed as a parameter, the first language from this list that matches the ones from the possible_languages dictionary will be selected
default language will be selected if none of them matches possible_languages.
-
get_possible_languages_info
(lang=None)[source]¶ Returns info for selected language or dictionary with all possible languages info from APP/languages/*.py It Returns:
a tuple containing:
langcode, langname, langfile_mtime, pluraldict_fname, pluraldict_mtime, prules_langcode, nplurals, get_plural_id, construct_plural_form or None
if lang is NOT defined a dictionary with all possible languages:
{ langcode(from filename): ( langcode, # language code from !langcode! langname, # language name in national spelling from !langname! langfile_mtime, # m_time of language file pluraldict_fname,# name of plural dictionary file or None (when default.py is not exist) pluraldict_mtime,# m_time of plural dictionary file or 0 if file is not exist prules_langcode, # code of plural rules language or 'default' nplurals, # nplurals for current language get_plural_id, # get_plural_id() for current language construct_plural_form) # construct_plural_form() for current language }
Parameters: lang (str) – language
-
get_t
(message, prefix='')[source]¶ Use ## to add a comment into a translation string the comment can be useful do discriminate different possible translations for the same string (for example different locations):
T(' hello world ') -> ' hello world ' T(' hello world ## token') -> ' hello world ' T('hello ## world## token') -> 'hello ## world'
the ## notation is ignored in multiline strings and strings that start with ##. This is needed to allow markmin syntax to be translated
-
params_substitution
(message, symbols)[source]¶ Substitutes parameters from symbols into message using %. also parse %%{} placeholders for plural-forms processing.
Returns: string with parameters Note
symbols MUST BE OR tuple OR dict of parameters!
-
plural
(word, n)[source]¶ Gets plural form of word for number n invoked from T()/T.M() in %%{} tag
Note
“word” MUST be defined in current language (T.accepted_language)
Parameters: - word (str) – word in singular
- n (numeric) – number plural form created for
Returns: word – word in appropriate singular/plural form
Return type: str
main
Module¶
The gluon wsgi application¶
-
gluon.main.
wsgibase
(environ, responder)[source]¶ The gluon wsgi application. The first function called when a page is requested (static or dynamic). It can be called by paste.httpserver or by apache mod_wsgi (or any WSGI-compatible server).
- fills request with info
- the environment variables, replacing ‘.’ with ‘_’
- adds web2py path and version info
- compensates for fcgi missing path_info and query_string
- validates the path in url
The url path must be either:
- for static pages:
- /<application>/static/<file>
- for dynamic pages:
- /<application>[/<controller>[/<function>[/<sub>]]][.<extension>]
The naming conventions are:
- application, controller, function and extension may only contain [a-zA-Z0-9_]
- file and sub may also contain ‘-‘, ‘=’, ‘.’ and ‘/’
-
gluon.main.
save_password
(password, port)[source]¶ Used by main() to save the password in the parameters_port.py file.
-
gluon.main.
appfactory
(wsgiapp=<function wsgibase>, logfilename='httpserver.log', profiler_dir=None, profilerfilename=None)[source]¶ generates a wsgi application that does logging and profiling and calls wsgibase
Parameters: - wsgiapp – the base application
- logfilename – where to store apache-compatible requests log
- profiler_dir – where to store profile files
-
class
gluon.main.
HttpServer
(ip='127.0.0.1', port=8000, password='', pid_filename='httpserver.pid', log_filename='httpserver.log', profiler_dir=None, ssl_certificate=None, ssl_private_key=None, ssl_ca_certificate=None, min_threads=None, max_threads=None, server_name=None, request_queue_size=5, timeout=10, socket_timeout=1, shutdown_timeout=None, path=None, interfaces=None)[source]¶ Bases:
object
the web2py web server (Rocket)
messageboxhandler
Module¶
myregex
Module¶
Useful regexes¶
newcron
Module¶
Cron-style interface
-
class
gluon.newcron.
Token
(path)[source]¶ Bases:
object
-
acquire
(startup=False)[source]¶ Returns the time when the lock is acquired or None if cron already running
lock is implemented by writing a pickle (start, stop) in cron.master start is time when cron job starts and stop is time when cron completed stop == 0 if job started but did not yet complete if a cron job started within less than 60 seconds, acquire returns None if a cron job started before 60 seconds and did not stop, a warning is issue “Stale cron.master detected”
-
-
gluon.newcron.
absolute_path_link
(path)[source]¶ Returns an absolute path for the destination of a symlink
portalocker
Module¶
Cross-platform (posix/nt) API for flock-style file locking.
Synopsis:
import portalocker
file = open("somefile", "r+")
portalocker.lock(file, portalocker.LOCK_EX)
file.seek(12)
file.write("foo")
file.close()
If you know what you’re doing, you may choose to:
portalocker.unlock(file)
before closing the file, but why?
Methods:
lock( file, flags )
unlock( file )
Constants:
LOCK_EX
LOCK_SH
LOCK_NB
I learned the win32 technique for locking files from sample code provided by John Nielsen <nielsenjf@my-deja.com> in the documentation that accompanies the win32 modules.
Author: Jonathan Feinberg <jdf@pobox.com> Version: $Id: portalocker.py,v 1.3 2001/05/29 18:47:55 Administrator Exp $
recfile
Module¶
restricted
Module¶
Restricted environment to execute application’s code¶
-
exception
gluon.restricted.
RestrictedError
(layer='', code='', output='', environment=None)[source]¶ Bases:
exceptions.Exception
Class used to wrap an exception that occurs in the restricted environment below. The traceback is used to log the exception and generate a ticket.
-
gluon.restricted.
restricted
(code, environment=None, layer='Unknown')[source]¶ Runs code in environment and returns the output. If an exception occurs in code it raises a RestrictedError containing the traceback. Layer is passed to RestrictedError to identify where the error occurred.
-
class
gluon.restricted.
TicketStorage
(db=None, tablename='web2py_ticket')[source]¶ Bases:
gluon.storage.Storage
Defines the ticket object and the default values of its members (None)
rewrite
Module¶
gluon.rewrite parses incoming URLs and formats outgoing URLs for gluon.html.URL.
In addition, it rewrites both incoming and outgoing URLs based on the (optional) user-supplied routes.py, which also allows for rewriting of certain error messages.
routes.py supports two styles of URL rewriting, depending on whether ‘routers’ is defined. Refer to router.example.py and routes.example.py for additional documentation.
-
class
gluon.rewrite.
MapUrlIn
(request=None, env=None)[source]¶ Bases:
object
Logic for mapping incoming URLs
-
arg0
¶ Returns first arg
-
harg0
¶ Returns first arg with optional hyphen mapping
-
map_root_static
()[source]¶ Handles root-static files (no hyphen mapping)
a root-static file is one whose incoming URL expects it to be at the root, typically robots.txt & favicon.ico
-
-
class
gluon.rewrite.
MapUrlOut
(request, env, application, controller, function, args, other, scheme, host, port, language)[source]¶ Bases:
object
Logic for mapping outgoing URLs
-
gluon.rewrite.
compile_regex
(k, v, env=None)[source]¶ Preprocess and compile the regular expressions in routes_app/in/out The resulting regex will match a pattern of the form:
[remote address]:[protocol]://[host]:[method] [path]
We allow abbreviated regexes on input; here we try to complete them.
-
gluon.rewrite.
filter_err
(status, application='app', ticket='tkt')[source]¶ doctest/unittest interface to routes_onerror
-
gluon.rewrite.
filter_url
(url, method='get', remote='0.0.0.0', out=False, app=False, lang=None, domain=(None, None), env=False, scheme=None, host=None, port=None, language=None)[source]¶ doctest/unittest interface to regex_filter_in() and regex_filter_out()
-
gluon.rewrite.
get_effective_router
(appname)[source]¶ Returns a private copy of the effective router for the specified application
-
gluon.rewrite.
load
(routes='routes.py', app=None, data=None, rdict=None)[source]¶ load: read (if file) and parse routes store results in params (called from main.py at web2py initialization time) If data is present, it’s used instead of the routes.py contents. If rdict is present, it must be a dict to be used for routers (unit test)
-
gluon.rewrite.
map_url_out
(request, env, application, controller, function, args, other, scheme, host, port, language=None)[source]¶ Supply /a/c/f (or /a/lang/c/f) portion of outgoing url
The basic rule is that we can only make transformations that map_url_in can reverse.
Suppose that the incoming arguments are a,c,f,args,lang and that the router defaults are da, dc, df, dl.
We can perform these transformations trivially if args=[] and lang=None or dl:
/da/dc/df => / /a/dc/df => /a /a/c/df => /a/c
We would also like to be able to strip the default application or application/controller from URLs with function/args present, thus:
/da/c/f/args => /c/f/args /da/dc/f/args => /f/args
We use [applications] and [controllers] and {functions} to suppress ambiguous omissions.
We assume that language names do not collide with a/c/f names.
-
gluon.rewrite.
regex_select
(env=None, app=None, request=None)[source]¶ Selects a set of regex rewrite params for the current request
-
gluon.rewrite.
regex_uri
(e, regexes, tag, default=None)[source]¶ Filters incoming URI against a list of regexes
-
gluon.rewrite.
try_redirect_on_error
(http_object, request, ticket=None)[source]¶ Called from main.wsgibase to rewrite the http response
sanitizer
Module¶
Cross-site scripting (XSS) defense¶
-
gluon.sanitizer.
sanitize
(text, permitted_tags=['a', 'b', 'blockquote', 'br/', 'i', 'li', 'ol', 'ul', 'p', 'cite', 'code', 'pre', 'img/', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'table', 'tbody', 'thead', 'tfoot', 'tr', 'td', 'div', 'strong', 'span'], allowed_attributes={'a': ['href', 'title'], 'td': ['colspan'], 'blockquote': ['type'], 'img': ['src', 'alt']}, escape=True)[source]¶
scheduler
Module¶
Background processes made simple¶
-
class
gluon.scheduler.
JobGraph
(db, job_name)[source]¶ Bases:
object
Experimental: with JobGraph you can specify dependencies amongs tasks
-
class
gluon.scheduler.
MetaScheduler
[source]¶ Bases:
threading.Thread
Base class documenting scheduler’s base methods
-
class
gluon.scheduler.
Scheduler
(db, tasks=None, migrate=True, worker_name=None, group_names=None, heartbeat=3, max_empty_runs=0, discard_results=False, utc_time=False)[source]¶ Bases:
gluon.scheduler.MetaScheduler
Scheduler object
Parameters: - db – DAL connection where Scheduler will create its tables
- tasks (dict) – either a dict containing name–>func or None. If None, functions will be searched in the environment
- migrate (bool) – turn migration on/off for the Scheduler’s tables
- worker_name (str) – force worker_name to identify each process. Leave it to None to autoassign a name (hostname#pid)
- group_names (list) – process tasks belonging to this group defaults to [‘main’] if nothing gets passed
- heartbeat (int) – how many seconds the worker sleeps between one execution and the following one. Indirectly sets how many seconds will pass between checks for new tasks
- max_empty_runs (int) – how many loops are allowed to pass without processing any tasks before exiting the process. 0 to keep always the process alive
- discard_results (bool) – Scheduler stores executions’s details into the scheduler_run table. By default, only if there is a result the details are kept. Turning this to True means discarding results even for tasks that return something
- utc_time (bool) – do all datetime calculations assuming UTC as the timezone. Remember to pass start_time and stop_time to tasks accordingly
-
assign_tasks
(db)[source]¶ Assigns task to workers, that can then pop them from the queue
Deals with group_name(s) logic, in order to assign linearly tasks to available workers for those groups
-
being_a_ticker
()[source]¶ Elects a TICKER process that assigns tasks to available workers. Does its best to elect a worker that is not busy processing other tasks to allow a proper distribution of tasks among all active workers ASAP
-
disable
(group_names=None, limit=None, worker_name=None)[source]¶ Sets DISABLED on the workers processing group_names tasks. A DISABLED worker will be kept alive but it won’t be able to process any waiting tasks, essentially putting it to sleep. By default, all group_names of Scheduler’s instantation are selected
-
get_workers
(only_ticker=False)[source]¶ Returns a dict holding worker_name : {**columns} representing all “registered” workers only_ticker returns only the workers running as a TICKER, if there are any
-
kill
(group_names=None, limit=None, worker_name=None)[source]¶ Sets KILL as worker status. The worker will be killed even if it’s processing a task.
-
loop
(worker_name=None)[source]¶ Main loop
This works basically as a neverending loop that:
- checks if the worker is ready to process tasks (is not DISABLED)
- pops a task from the queue
- if there is a task:
- spawns the executor background process
- waits for the process to be finished
- sleeps heartbeat seconds
- if there is not a task:
- checks for max_empty_runs
- sleeps heartbeat seconds
-
queue_task
(function, pargs=[], pvars={}, **kwargs)[source]¶ Queue tasks. This takes care of handling the validation of all parameters
Parameters: - function – the function (anything callable with a __name__)
- pargs – “raw” args to be passed to the function. Automatically jsonified.
- pvars – “raw” kwargs to be passed to the function. Automatically jsonified
- kwargs – all the parameters available (basically, every scheduler_task column). If args and vars are here, they should be jsonified already, and they will override pargs and pvars
Returns: a dict just as a normal validate_and_insert(), plus a uuid key holding the uuid of the queued task. If validation is not passed ( i.e. some parameters are invalid) both id and uuid will be None, and you’ll get an “error” dict holding the errors found.
-
report_task
(task, task_report)[source]¶ Takes care of storing the result according to preferences and deals with logic for repeating tasks
-
resume
(group_names=None, limit=None, worker_name=None)[source]¶ Wakes a worker up (it will be able to process queued tasks)
-
send_heartbeat
(counter)[source]¶ This function is vital for proper coordination among available workers. It:
sends the heartbeat
- elects a ticker among available workers (the only process that
effectively dispatch tasks to workers)
deals with worker’s statuses
does “housecleaning” for dead workers
triggers tasks assignment to workers
-
set_worker_status
(group_names=None, action='ACTIVE', exclude=None, limit=None, worker_name=None)[source]¶ Internal function to set worker’s status
-
sleep
()[source]¶ Calculates the number of seconds to sleep according to worker’s status and heartbeat parameter
-
stop_task
(ref)[source]¶ Shortcut for task termination.
If the task is RUNNING it will terminate it, meaning that status will be set as FAILED.
- If the task is QUEUED, its stop_time will be set as to “now”,
- the enabled flag will be set to False, and the status to STOPPED
Parameters: ref – can be
- an integer : lookup will be done by scheduler_task.id
- a string : lookup will be done by scheduler_task.uuid
Returns: - 1 if task was stopped (meaning an update has been done)
- None if task was not found, or if task was not RUNNING or QUEUED
Note
Experimental
-
task_status
(ref, output=False)[source]¶ Retrieves task status and optionally the result of the task
Parameters: - ref –
can be
- an integer : lookup will be done by scheduler_task.id
- a string : lookup will be done by scheduler_task.uuid
- a Query : lookup as you wish, e.g.
db.scheduler_task.task_name == 'test1'
- output (bool) – if True, fetch also the scheduler_run record
Returns: a single Row object, for the last queued task. If output == True, returns also the last scheduler_run record. The scheduler_run record is fetched by a left join, so it can have all fields == None
- ref –
-
terminate
(group_names=None, limit=None, worker_name=None)[source]¶ Sets TERMINATE as worker status. The worker will wait for any currently running tasks to be executed and then it will exit gracefully
-
wrapped_assign_tasks
(db)[source]¶ Commodity function to call assign_tasks and trap exceptions If an exception is raised, assume it happened because of database contention and retries assign_task after 0.5 seconds
-
class
gluon.scheduler.
TYPE
(myclass=<type 'list'>, parse=False)[source]¶ Bases:
object
Validator that checks whether field is valid json and validates its type. Used for args and vars of the scheduler_task table
-
class
gluon.scheduler.
Task
(app, function, timeout, args='[]', vars='{}', **kwargs)[source]¶ Bases:
object
Defines a “task” object that gets passed from the main thread to the executor’s one
-
class
gluon.scheduler.
TaskReport
(status, result=None, output=None, tb=None)[source]¶ Bases:
object
Defines a “task report” object that gets passed from the executor’s thread to the main one
serializers
Module¶
This file is part of the web2py Web Framework Copyrighted by Massimo Di Pierro <mdipierro@cs.depaul.edu> License: LGPLv3 (http://www.gnu.org/licenses/lgpl.html)
-
gluon.serializers.
cast_keys
(o, cast=<type 'str'>, encoding='utf-8')[source]¶ Builds a new object with <cast> type keys. Use this function if you are in Python < 2.6.5 This avoids syntax errors when unpacking dictionary arguments.
Parameters: - o – is the object input
- cast –
(defaults to str) is an object type or function which supports conversion such as:
converted = cast(o) - encoding – (defaults to utf-8) is the encoding for unicode keys. This is not used for custom cast functions
settings
Module¶
shell
Module¶
Web2py environment in the shell¶
-
gluon.shell.
env
(a, import_models=False, c=None, f=None, dir='', extra_request={})[source]¶ Returns web2py execution environment for application (a), controller (c), function (f). If import_models is True the exec all application models into the environment.
extra_request allows you to pass along any extra variables to the request object before your models get executed. This was mainly done to support web2py_utils.test_runner, however you can use it with any wrapper scripts that need access to the web2py environment.
-
gluon.shell.
exec_environment
(pyfile='', request=None, response=None, session=None)[source]¶ Environment builder and module loader.
Builds a web2py environment and optionally executes a Python file into the environment.
A Storage dictionary containing the resulting environment is returned. The working directory must be web2py root – this is the web2py default.
-
gluon.shell.
parse_path_info
(path_info, av=False)[source]¶ Parses path info formatted like a/c/f where c and f are optional and a leading / is accepted. Return tuple (a, c, f). If invalid path_info a is set to None. If c or f are omitted they are set to None. If av=True, parse args and vars
-
gluon.shell.
run
(appname, plain=False, import_models=False, startfile=None, bpython=False, python_code=False, cronjob=False)[source]¶ Start interactive shell or run Python script (startfile) in web2py controller environment. appname is formatted like:
- a : web2py application name
- a/c : exec the controller c into the application environment
-
gluon.shell.
test
(testpath, import_models=True, verbose=False)[source]¶ Run doctests in web2py environment. testpath is formatted like:
- a: tests all controllers in application a
- a/c: tests controller c in application a
- a/c/f test function f in controller c, application a
Where a, c and f are application, controller and function names respectively. If the testpath is a file name the file is tested. If a controller is specified models are executed by default.
sql
Module¶
Just for backward compatibility¶
-
class
gluon.sql.
DAL
(uri='sqlite://dummy.db', pool_size=0, folder=None, db_codec='UTF-8', check_reserved=None, migrate=True, fake_migrate=False, migrate_enabled=True, fake_migrate_all=False, decode_credentials=False, driver_args=None, adapter_args=None, attempts=5, auto_import=False, bigint_id=False, debug=False, lazy_tables=False, db_uid=None, do_connect=True, after_connection=None, tables=None, ignore_field_case=True, entity_quoting=False, table_hash=None)[source]¶ Bases:
pydal.helpers.classes.Serializable
,pydal.helpers.classes.BasicStorage
An instance of this class represents a database connection
Parameters: - uri (str) –
contains information for connecting to a database. Defaults to ‘sqlite://dummy.db’
Note
experimental: you can specify a dictionary as uri parameter i.e. with:
db = DAL({"uri": "sqlite://storage.sqlite", "tables": {...}, ...})
for an example of dict input you can check the output of the scaffolding db model with
db.as_dict()Note that for compatibility with Python older than version 2.6.5 you should cast your dict input keys to str due to a syntax limitation on kwarg names. for proper DAL dictionary input you can use one of:
obj = serializers.cast_keys(dict, [encoding="utf-8"]) #or else (for parsing json input) obj = serializers.loads_json(data, unicode_keys=False)
- pool_size – How many open connections to make to the database object.
- folder – where .table files will be created. Automatically set within web2py. Use an explicit path when using DAL outside web2py
- db_codec – string encoding of the database (default: ‘UTF-8’)
- table_hash – database identifier with .tables. If your connection hash change you can still using old .tables if they have db_hash as prefix
- check_reserved –
list of adapters to check tablenames and column names against sql/nosql reserved keywords. Defaults to None
- ‘common’ List of sql keywords that are common to all database types such as “SELECT, INSERT”. (recommended)
- ‘all’ Checks against all known SQL keywords
- ‘<adaptername>’’ Checks against the specific adapters list of keywords
- ‘<adaptername>_nonreserved’ Checks against the specific adapters list of nonreserved keywords. (if available)
- migrate – sets default migrate behavior for all tables
- fake_migrate – sets default fake_migrate behavior for all tables
- migrate_enabled – If set to False disables ALL migrations
- fake_migrate_all – If set to True fake migrates ALL tables
- attempts – Number of times to attempt connecting
- auto_import – If set to True, tries import automatically table definitions from the databases folder (works only for simple models)
- bigint_id – If set, turn on bigint instead of int for id and reference fields
- lazy_tables – delaya table definition until table access
- after_connection – can a callable that will be executed after the connection
Example
Use as:
db = DAL('sqlite://test.db')
or:
db = DAL(**{"uri": ..., "tables": [...]...}) # experimental db.define_table('tablename', Field('fieldname1'), Field('fieldname2'))
-
class
Field
(fieldname, type='string', length=None, default=<function <lambda>>, required=False, requires=<function <lambda>>, ondelete='CASCADE', notnull=False, unique=False, uploadfield=True, widget=None, label=None, comment=None, writable=True, readable=True, update=None, authorize=None, autodelete=False, represent=None, uploadfolder=None, uploadseparate=False, uploadfs=None, compute=None, custom_store=None, custom_retrieve=None, custom_retrieve_file_properties=None, custom_delete=None, filter_in=None, filter_out=None, custom_qualifier=None, map_none=None, rname=None)¶ Bases:
pydal.objects.Expression
,pydal.helpers.classes.Serializable
-
Lazy
¶ alias of
FieldMethod
-
Method
¶ alias of
FieldMethod
-
Virtual
¶ alias of
FieldVirtual
-
as_dict
(flat=False, sanitize=True)¶
-
clone
(point_self_references_to=False, **args)¶
-
count
(distinct=None)¶
-
formatter
(value)¶
-
retrieve
(name, path=None, nameonly=False)¶ If nameonly==True return (filename, fullfilename) instead of (filename, stream)
-
retrieve_file_properties
(name, path=None)¶
-
set_attributes
(*args, **attributes)¶
-
sqlsafe
¶
-
sqlsafe_name
¶
-
store
(file, filename=None, path=None)¶
-
validate
(value)¶
-
-
class
DAL.
Table
(db, tablename, *fields, **args)¶ Bases:
pydal.helpers.classes.Serializable
,pydal.helpers.classes.BasicStorage
Represents a database table
- Example::
- You can create a table as::
- db = DAL(...) db.define_table(‘users’, Field(‘name’))
And then:
db.users.insert(name='me') # print db.users._insert(...) to see SQL db.users.drop()
-
as_dict
(flat=False, sanitize=True)¶
-
bulk_insert
(items)¶ here items is a list of dictionaries
-
drop
(mode='')¶
-
fields
¶
-
import_from_csv_file
(csvfile, id_map=None, null='<NULL>', unique='uuid', id_offset=None, *args, **kwargs)¶ Import records from csv file. Column headers must have same names as table fields. Field ‘id’ is ignored. If column names read ‘table.file’ the ‘table.’ prefix is ignored.
- ‘unique’ argument is a field which must be unique (typically a uuid field)
- ‘restore’ argument is default False; if set True will remove old values in table first.
- ‘id_map’ if set to None will not map ids
The import will keep the id numbers in the restored table. This assumes that there is an field of type id that is integer and in incrementing order. Will keep the id numbers in restored table.
-
insert
(**fields)¶
-
on
(query)¶
-
sqlsafe
¶
-
sqlsafe_alias
¶
-
truncate
(mode=None)¶
-
update
(*args, **kwargs)¶
-
update_or_insert
(_key=<function <lambda>>, **values)¶
-
validate_and_insert
(**fields)¶
-
validate_and_update
(_key=<function <lambda>>, **fields)¶
-
validate_and_update_or_insert
(_key=<function <lambda>>, **fields)¶
-
with_alias
(alias)¶
-
DAL.
check_reserved_keyword
(name)[source]¶ Validates name against SQL keywords Uses self.check_reserve which is a list of operators to use.
-
DAL.
executesql
(query, placeholders=None, as_dict=False, fields=None, colnames=None, as_ordered_dict=False)[source]¶ Executes an arbitrary query
Parameters: - query (str) – the query to submit to the backend
- placeholders – is optional and will always be None. If using raw SQL with placeholders, placeholders may be a sequence of values to be substituted in or, (if supported by the DB driver), a dictionary with keys matching named placeholders in your SQL.
- as_dict – will always be None when using DAL. If using raw SQL can be set to True and the results cursor returned by the DB driver will be converted to a sequence of dictionaries keyed with the db field names. Results returned with as_dict=True are the same as those returned when applying .to_list() to a DAL query. If “as_ordered_dict”=True the behaviour is the same as when “as_dict”=True with the keys (field names) guaranteed to be in the same order as returned by the select name executed on the database.
- fields –
list of DAL Fields that match the fields returned from the DB. The Field objects should be part of one or more Table objects defined on the DAL object. The “fields” list can include one or more DAL Table objects in addition to or instead of including Field objects, or it can be just a single table (not in a list). In that case, the Field objects will be extracted from the table(s).
Note
if either fields or colnames is provided, the results will be converted to a DAL Rows object using the db._adapter.parse() method
- colnames – list of field names in tablename.fieldname format
Note
It is also possible to specify both “fields” and the associated “colnames”. In that case, “fields” can also include DAL Expression objects in addition to Field objects. For Field objects in “fields”, the associated “colnames” must still be in tablename.fieldname format. For Expression objects in “fields”, the associated “colnames” can be any arbitrary labels.
DAL Table objects referred to by “fields” or “colnames” can be dummy tables and do not have to represent any real tables in the database. Also, note that the “fields” and “colnames” must be in the same order as the fields in the results cursor returned from the DB.
-
static
DAL.
get_instances
()[source]¶ Returns a dictionary with uri as key with timings and defined tables:
{'sqlite://storage.sqlite': { 'dbstats': [(select auth_user.email from auth_user, 0.02009)], 'dbtables': { 'defined': ['auth_cas', 'auth_event', 'auth_group', 'auth_membership', 'auth_permission', 'auth_user'], 'lazy': '[]' } } }
-
DAL.
import_from_csv_file
(ifile, id_map=None, null='<NULL>', unique='uuid', map_tablenames=None, ignore_missing_tables=False, *args, **kwargs)[source]¶
-
DAL.
logger
= <logging.Logger object>¶
-
DAL.
parse_as_rest
(patterns, args, vars, queries=None, nested_select=True)[source]¶ Example
Use as:
db.define_table('person',Field('name'),Field('info')) db.define_table('pet', Field('ownedby',db.person), Field('name'),Field('info') ) @request.restful() def index(): def GET(*args,**vars): patterns = [ "/friends[person]", "/{person.name}/:field", "/{person.name}/pets[pet.ownedby]", "/{person.name}/pets[pet.ownedby]/{pet.name}", "/{person.name}/pets[pet.ownedby]/{pet.name}/:field", ("/dogs[pet]", db.pet.info=='dog'), ("/dogs[pet]/{pet.name.startswith}", db.pet.info=='dog'), ] parser = db.parse_as_rest(patterns,args,vars) if parser.status == 200: return dict(content=parser.response) else: raise HTTP(parser.status,parser.error) def POST(table_name,**vars): if table_name == 'person': return db.person.validate_and_insert(**vars) elif table_name == 'pet': return db.pet.validate_and_insert(**vars) else: raise HTTP(400) return locals()
-
DAL.
representers
= {'rows_xml': <class 'gluon.sqlhtml.SQLTABLE'>, 'rows_render': <function represent at 0x7f5a40475f50>}¶
-
DAL.
serializers
= {'xml': <function xml at 0x7f5a3cde0758>, 'json': <function custom_json at 0x7f5a3cde0668>}¶
-
DAL.
tables
¶
-
DAL.
uuid
(x)¶
-
DAL.
validators
= None¶
-
DAL.
validators_method
(db, field)¶ Field type validation, using web2py’s validators mechanism.
makes sure the content of a field is in line with the declared fieldtype
- uri (str) –
-
class
gluon.sql.
Field
(fieldname, type='string', length=None, default=<function <lambda>>, required=False, requires=<function <lambda>>, ondelete='CASCADE', notnull=False, unique=False, uploadfield=True, widget=None, label=None, comment=None, writable=True, readable=True, update=None, authorize=None, autodelete=False, represent=None, uploadfolder=None, uploadseparate=False, uploadfs=None, compute=None, custom_store=None, custom_retrieve=None, custom_retrieve_file_properties=None, custom_delete=None, filter_in=None, filter_out=None, custom_qualifier=None, map_none=None, rname=None)[source]¶ Bases:
pydal.objects.Expression
,pydal.helpers.classes.Serializable
-
Lazy
¶ alias of
FieldMethod
-
Method
¶ alias of
FieldMethod
-
Virtual
¶ alias of
FieldVirtual
-
retrieve
(name, path=None, nameonly=False)[source]¶ If nameonly==True return (filename, fullfilename) instead of (filename, stream)
-
sqlsafe
¶
-
sqlsafe_name
¶
-
sqlhtml
Module¶
Holds:
- SQLFORM: provide a form for a table (with/without record)
- SQLTABLE: provides a table for a set of records
- form_factory: provides a SQLFORM for an non-db backed table
-
class
gluon.sqlhtml.
AutocompleteWidget
(request, field, id_field=None, db=None, orderby=None, limitby=(0, 10), distinct=False, keyword='_autocomplete_%(tablename)s_%(fieldname)s', min_length=2, help_fields=None, help_string=None, at_beginning=True)[source]¶ Bases:
object
-
class
gluon.sqlhtml.
BooleanWidget
[source]¶ Bases:
gluon.sqlhtml.FormWidget
-
class
gluon.sqlhtml.
CheckboxesWidget
[source]¶ Bases:
gluon.sqlhtml.OptionsWidget
-
class
gluon.sqlhtml.
DateWidget
[source]¶ Bases:
gluon.sqlhtml.StringWidget
-
class
gluon.sqlhtml.
DatetimeWidget
[source]¶ Bases:
gluon.sqlhtml.StringWidget
-
class
gluon.sqlhtml.
DecimalWidget
[source]¶ Bases:
gluon.sqlhtml.StringWidget
-
class
gluon.sqlhtml.
DoubleWidget
[source]¶ Bases:
gluon.sqlhtml.StringWidget
-
class
gluon.sqlhtml.
ExportClass
(rows)[source]¶ Bases:
object
-
content_type
= None¶
-
file_ext
= None¶
-
label
= None¶
-
-
class
gluon.sqlhtml.
ExporterCSV
(rows)[source]¶ Bases:
gluon.sqlhtml.ExportClass
-
content_type
= 'text/csv'¶
-
file_ext
= 'csv'¶
-
label
= 'CSV'¶
-
Bases:
gluon.sqlhtml.ExportClass
-
class
gluon.sqlhtml.
ExporterHTML
(rows)[source]¶ Bases:
gluon.sqlhtml.ExportClass
-
content_type
= 'text/html'¶
-
file_ext
= 'html'¶
-
label
= 'HTML'¶
-
-
class
gluon.sqlhtml.
ExporterJSON
(rows)[source]¶ Bases:
gluon.sqlhtml.ExportClass
-
content_type
= 'application/json'¶
-
file_ext
= 'json'¶
-
label
= 'JSON'¶
-
-
class
gluon.sqlhtml.
ExporterTSV
(rows)[source]¶ Bases:
gluon.sqlhtml.ExportClass
-
content_type
= 'text/tab-separated-values'¶
-
file_ext
= 'csv'¶
-
label
= 'TSV'¶
-
-
class
gluon.sqlhtml.
ExporterXML
(rows)[source]¶ Bases:
gluon.sqlhtml.ExportClass
-
content_type
= 'text/xml'¶
-
file_ext
= 'xml'¶
-
label
= 'XML'¶
-
-
class
gluon.sqlhtml.
FormWidget
[source]¶ Bases:
object
Helper for SQLFORM to generate form input fields (widget), related to the fieldtype
-
classmethod
widget
(field, value, **attributes)[source]¶ Generates the widget for the field.
When serialized, will provide an INPUT tag:
- id = tablename_fieldname
- class = field.type
- name = fieldname
Parameters: - field – the field needing the widget
- value – value
- attributes – any other attributes to be applied
-
classmethod
-
class
gluon.sqlhtml.
IntegerWidget
[source]¶ Bases:
gluon.sqlhtml.StringWidget
-
class
gluon.sqlhtml.
JSONWidget
[source]¶ Bases:
gluon.sqlhtml.FormWidget
-
class
gluon.sqlhtml.
ListWidget
[source]¶ Bases:
gluon.sqlhtml.StringWidget
-
class
gluon.sqlhtml.
MultipleOptionsWidget
[source]¶ Bases:
gluon.sqlhtml.OptionsWidget
-
class
gluon.sqlhtml.
OptionsWidget
[source]¶ Bases:
gluon.sqlhtml.FormWidget
-
class
gluon.sqlhtml.
PasswordWidget
[source]¶ Bases:
gluon.sqlhtml.FormWidget
-
class
gluon.sqlhtml.
RadioWidget
[source]¶ Bases:
gluon.sqlhtml.OptionsWidget
-
class
gluon.sqlhtml.
SQLFORM
(table, record=None, deletable=False, linkto=None, upload=None, fields=None, labels=None, col3={}, submit_button='Submit', delete_label='Check to delete', showid=True, readonly=False, comments=True, keepopts=[], ignore_rw=False, record_id=None, formstyle=None, buttons=['submit'], separator=None, extra_fields=None, **attributes)[source]¶ Bases:
gluon.html.FORM
SQLFORM is used to map a table (and a current record) into an HTML form.
Given a Table like db.table
Generates an insert form:
SQLFORM(db.table)
Generates an update form:
record=db.table[some_id] SQLFORM(db.table, record)
Generates an update with a delete button:
SQLFORM(db.table, record, deletable=True)
Parameters: - table – Table object
- record – either an int if the id is an int, or the record fetched from the table
- deletable – adds the delete checkbox
- linkto – the URL of a controller/function to access referencedby records
- upload – the URL of a controller/function to download an uploaded file
- fields – a list of fields that should be placed in the form, default is all.
- labels – a dictionary with labels for each field, keys are the field names.
- col3 – a dictionary with content for an optional third column (right of each field). keys are field names.
- submit_button – text to show in the submit button
- delete_label – text to show next to the delete checkbox
- showid – shows the id of the record
- readonly – doesn’t allow for any modification
- comments – show comments (stored in col3 or in Field definition)
- ignore_rw – overrides readable/writable attributes
- record_id – used to create session key against CSRF
- formstyle – what to use to generate the form layout
- buttons – override buttons as you please (will be also stored in form.custom.submit)
- separator – character as separator between labels and inputs
any named optional attribute is passed to the <form> tag for example _class, _id, _style, _action, _method, etc.
-
AUTOTYPES
= {<type 'datetime.datetime'>: ('datetime', <gluon.validators.IS_DATETIME object at 0x7f5a404943d0>), <type 'list'>: ('list:string', None), <type 'datetime.date'>: ('date', <gluon.validators.IS_DATE object at 0x7f5a40494390>), <type 'float'>: ('double', <gluon.validators.IS_FLOAT_IN_RANGE object at 0x7f5a40494310>), <type 'str'>: ('string', None), <type 'int'>: ('integer', <gluon.validators.IS_INT_IN_RANGE object at 0x7f5a404942d0>), <type 'unicode'>: ('string', None), <type 'bool'>: ('boolean', None)}¶
-
FIELDKEY_DELETE_RECORD
= 'delete_record'¶
-
FIELDNAME_REQUEST_DELETE
= 'delete_this_record'¶
-
ID_LABEL_SUFFIX
= '__label'¶
-
ID_ROW_SUFFIX
= '__row'¶
-
accepts
(request_vars, session=None, formname='%(tablename)s/%(record_id)s', keepvalues=None, onvalidation=None, dbio=True, hideerror=False, detect_record_change=False, **kwargs)[source]¶ Similar to FORM.accepts but also does insert, update or delete in DAL. If detect_record_change is True than:
- form.record_changed = False (record is properly validated/submitted)
- form.record_changed = True (record cannot be submitted because changed)
If detect_record_change == False than:
- form.record_changed = None
-
static
factory
(*fields, **attributes)[source]¶ Generates a SQLFORM for the given fields.
Internally will build a non-database based data model to hold the fields.
-
formstyles
= <Storage {'bootstrap3_stacked': <function formstyle_bootstrap3_stacked at 0x7f5a40490e60>, 'bootstrap': <function formstyle_bootstrap at 0x7f5a40490de8>, 'bootstrap3_inline': <function _inner at 0x7f5a40415050>, 'table2cols': <function formstyle_table2cols at 0x7f5a40490c08>, 'table3cols': <function formstyle_table3cols at 0x7f5a404902a8>, 'inline': <function formstyle_inline at 0x7f5a40490cf8>, 'divs': <function formstyle_divs at 0x7f5a40490c80>, 'ul': <function formstyle_ul at 0x7f5a40490d70>}>¶
-
static
grid
(query, fields=None, field_id=None, left=None, headers={}, orderby=None, groupby=None, searchable=True, sortable=True, paginate=20, deletable=True, editable=True, details=True, selectable=None, create=True, csv=True, links=None, links_in_grid=True, upload='<default>', args=[], user_signature=True, maxtextlengths={}, maxtextlength=20, onvalidation=None, onfailure=None, oncreate=None, onupdate=None, ondelete=None, sorter_icons=(<gluon.html.XML object at 0x7f5a40494410>, <gluon.html.XML object at 0x7f5a40494450>), ui='web2py', showbuttontext=True, _class='web2py_grid', formname='web2py_grid', search_widget='default', advanced_search=True, ignore_rw=False, formstyle=None, exportclasses=None, formargs={}, createargs={}, editargs={}, viewargs={}, selectable_submit_button='Submit', buttons_placement='right', links_placement='right', noconfirm=False, cache_count=None, client_side_delete=False, ignore_common_filters=None, auto_pagination=True, use_cursor=False)[source]¶
-
static
smartgrid
(table, constraints=None, linked_tables=None, links=None, links_in_grid=True, args=None, user_signature=True, divider='>', breadcrumbs_class='', **kwargs)[source]¶ Builds a system of SQLFORM.grid(s) between any referenced tables
Parameters: - table – main table
- constraints (dict) – {‘table’:query} that limits which records can be accessible
- links (dict) – like {‘tablename’:[lambda row: A(....), ...]} that will add buttons when table tablename is displayed
- linked_tables (list) – list of tables to be linked
Example
given you defined a model as:
db.define_table('person', Field('name'), format='%(name)s') db.define_table('dog', Field('name'), Field('owner', db.person), format='%(name)s') db.define_table('comment', Field('body'), Field('dog', db.dog)) if db(db.person).isempty(): from gluon.contrib.populate import populate populate(db.person, 300) populate(db.dog, 300) populate(db.comment, 1000)
in a controller, you can do:
@auth.requires_login() def index(): form=SQLFORM.smartgrid(db[request.args(0) or 'person']) return dict(form=form)
-
widgets
= <Storage {'multiple': <class 'gluon.sqlhtml.MultipleOptionsWidget'>, 'string': <class 'gluon.sqlhtml.StringWidget'>, 'text': <class 'gluon.sqlhtml.TextWidget'>, 'datetime': <class 'gluon.sqlhtml.DatetimeWidget'>, 'boolean': <class 'gluon.sqlhtml.BooleanWidget'>, 'radio': <class 'gluon.sqlhtml.RadioWidget'>, 'date': <class 'gluon.sqlhtml.DateWidget'>, 'integer': <class 'gluon.sqlhtml.IntegerWidget'>, 'password': <class 'gluon.sqlhtml.PasswordWidget'>, 'double': <class 'gluon.sqlhtml.DoubleWidget'>, 'decimal': <class 'gluon.sqlhtml.DecimalWidget'>, 'list': <class 'gluon.sqlhtml.ListWidget'>, 'upload': <class 'gluon.sqlhtml.UploadWidget'>, 'autocomplete': <class 'gluon.sqlhtml.AutocompleteWidget'>, 'json': <class 'gluon.sqlhtml.JSONWidget'>, 'checkboxes': <class 'gluon.sqlhtml.CheckboxesWidget'>, 'time': <class 'gluon.sqlhtml.TimeWidget'>, 'options': <class 'gluon.sqlhtml.OptionsWidget'>, 'blob': None}>¶
-
class
gluon.sqlhtml.
SQLTABLE
(sqlrows, linkto=None, upload=None, orderby=None, headers={}, truncate=16, columns=None, th_link='', extracolumns=None, selectid=None, renderstyle=False, cid=None, colgroup=False, **attributes)[source]¶ Bases:
gluon.html.TABLE
Given with a Rows object, as returned by a db().select(), generates an html table with the rows.
Parameters: - sqlrows – the Rows object
- linkto – URL (or lambda to generate a URL) to edit individual records
- upload – URL to download uploaded files
- orderby – Add an orderby link to column headers.
- headers – dictionary of headers to headers redefinions headers can also be a string to generate the headers from data for now only headers=”fieldname:capitalize”, headers=”labels” and headers=None are supported
- truncate – length at which to truncate text in table cells. Defaults to 16 characters.
- columns – a list or dict contaning the names of the columns to be shown Defaults to all
- th_link – base link to support orderby headers
- extracolumns – a list of dicts
- selectid – The id you want to select
- renderstyle – Boolean render the style with the table
- cid – use this cid for all links
- colgroup – #FIXME
Extracolumns example
[{'label':A('Extra', _href='#'), 'class': '', #class name of the header 'width':'', #width in pixels or % 'content':lambda row, rc: A('Edit', _href='edit/%s'%row.id), 'selected': False #agregate class selected to this column}]
-
class
gluon.sqlhtml.
StringWidget
[source]¶ Bases:
gluon.sqlhtml.FormWidget
-
class
gluon.sqlhtml.
TextWidget
[source]¶ Bases:
gluon.sqlhtml.FormWidget
-
class
gluon.sqlhtml.
TimeWidget
[source]¶ Bases:
gluon.sqlhtml.StringWidget
-
class
gluon.sqlhtml.
UploadWidget
[source]¶ Bases:
gluon.sqlhtml.FormWidget
-
DEFAULT_WIDTH
= '150px'¶
-
DELETE_FILE
= 'delete'¶
-
GENERIC_DESCRIPTION
= 'file ## download'¶
-
ID_DELETE_SUFFIX
= '__delete'¶
-
static
is_image
(value)[source]¶ Tries to check if the filename provided references to an image
- Checking is based on filename extension. Currently recognized:
- gif, png, jp(e)g, bmp
Parameters: value – filename
-
classmethod
represent
(field, value, download_url=None)[source]¶ How to represent the file:
- with download url and if it is an image: <A href=...><IMG ...></A>
- otherwise with download url: <A href=...>file</A>
- otherwise: file
Parameters: - field – the field
- value – the field value
- download_url – url for the file download (default = None)
-
classmethod
widget
(field, value, download_url=None, **attributes)[source]¶ generates a INPUT file tag.
Optionally provides an A link to the file, including a checkbox so the file can be deleted.
All is wrapped in a DIV.
see also: FormWidget.widget
Parameters: - field – the field
- value – the field value
- download_url – url for the file download (default = None)
-
-
gluon.sqlhtml.
form_factory
(*fields, **attributes)¶ Generates a SQLFORM for the given fields.
Internally will build a non-database based data model to hold the fields.
-
gluon.sqlhtml.
formstyle_bootstrap3_inline_factory
(col_label_size=3)[source]¶ bootstrap 3 horizontal form layout
Note
Experimental!
storage
Module¶
Provides:
- List; like list but returns None instead of IndexOutOfBounds
- Storage; like dictionary allowing also for obj.foo for obj[‘foo’]
-
class
gluon.storage.
List
[source]¶ Bases:
list
Like a regular python list but callable. When a(i) is called if i is out of bounds returns None instead of IndexError.
-
class
gluon.storage.
Storage
[source]¶ Bases:
dict
A Storage object is like a dictionary except obj.foo can be used in addition to obj[‘foo’], and setting obj.foo = None deletes item foo.
Example:
>>> o = Storage(a=1) >>> print o.a 1 >>> o['a'] 1 >>> o.a = 2 >>> print o['a'] 2 >>> del o.a >>> print o.a None
-
getfirst
(key, default=None)[source]¶ Returns the first value of a list or the value itself when given a request.vars style key.
If the value is a list, its first item will be returned; otherwise, the value will be returned as-is.
Example output for a query string of ?x=abc&y=abc&y=def:
>>> request = Storage() >>> request.vars = Storage() >>> request.vars.x = 'abc' >>> request.vars.y = ['abc', 'def'] >>> request.vars.getfirst('x') 'abc' >>> request.vars.getfirst('y') 'abc' >>> request.vars.getfirst('z')
-
getlast
(key, default=None)[source]¶ Returns the last value of a list or value itself when given a request.vars style key.
If the value is a list, the last item will be returned; otherwise, the value will be returned as-is.
Simulated output with a query string of ?x=abc&y=abc&y=def:
>>> request = Storage() >>> request.vars = Storage() >>> request.vars.x = 'abc' >>> request.vars.y = ['abc', 'def'] >>> request.vars.getlast('x') 'abc' >>> request.vars.getlast('y') 'def' >>> request.vars.getlast('z')
-
getlist
(key)[source]¶ Returns a Storage value as a list.
If the value is a list it will be returned as-is. If object is None, an empty list will be returned. Otherwise, [value] will be returned.
Example output for a query string of ?x=abc&y=abc&y=def:
>>> request = Storage() >>> request.vars = Storage() >>> request.vars.x = 'abc' >>> request.vars.y = ['abc', 'def'] >>> request.vars.getlist('x') ['abc'] >>> request.vars.getlist('y') ['abc', 'def'] >>> request.vars.getlist('z') []
-
-
class
gluon.storage.
Settings
[source]¶ Bases:
gluon.storage.Storage
-
class
gluon.storage.
Messages
(T)[source]¶ Bases:
gluon.storage.Settings
-
class
gluon.storage.
StorageList
[source]¶ Bases:
gluon.storage.Storage
Behaves like Storage but missing elements defaults to [] instead of None
streamer
Module¶
template
Module¶
Templating syntax¶
-
class
gluon.template.
BlockNode
(name='', pre_extend=False, delimiters=('{{', '}}'))[source]¶ Bases:
gluon.template.Node
Block Container.
This Node can contain other Nodes and will render in a hierarchical order of when nodes were added.
ie:
{{ block test }} This is default block test {{ end }}
-
append
(node)[source]¶ Adds an element to the nodes.
Parameters: node – Node object or string to append.
-
-
class
gluon.template.
Content
(name='ContentBlock', pre_extend=False)[source]¶ Bases:
gluon.template.BlockNode
Parent Container – Used as the root level BlockNode.
Contains functions that operate as such.
Parameters: name – Unique name for this BlockNode
-
class
gluon.template.
Node
(value=None, pre_extend=False)[source]¶ Bases:
object
Basic Container Object
-
class
gluon.template.
SuperNode
(name='', pre_extend=False)[source]¶ Bases:
gluon.template.Node
-
class
gluon.template.
TemplateParser
(text, name='ParserContainer', context={}, path='views/', writer='response.write', lexers={}, delimiters=('{{', '}}'), _super_nodes=[])[source]¶ Bases:
object
Parse all blocks
Parameters: - text – text to parse
- context – context to parse in
- path – folder path to templates
- writer – string of writer class to use
- lexers – dict of custom lexers to use.
- delimiters – for example (‘{{‘,’}}’)
- _super_nodes – a list of nodes to check for inclusion this should only be set by “self.extend” It contains a list of SuperNodes from a child template that need to be handled.
-
default_delimiters
= ('{{', '}}')¶
-
extend
(filename)[source]¶ Extends filename. Anything not declared in a block defined by the parent will be placed in the parent templates {{include}} block.
-
r_multiline
= <_sre.SRE_Pattern object>¶
-
r_tag
= <_sre.SRE_Pattern object>¶
-
re_block
= <_sre.SRE_Pattern object>¶
-
re_pass
= <_sre.SRE_Pattern object>¶
-
re_unblock
= <_sre.SRE_Pattern object>¶
-
gluon.template.
get_parsed
(text)[source]¶ Returns the indented python code of text. Useful for unit testing.
-
gluon.template.
parse_template
(filename, path='views/', context={}, lexers={}, delimiters=('{{', '}}'))[source]¶ Parameters: - filename – can be a view filename in the views folder or an input stream
- path – is the path of a views folder
- context – is a dictionary of symbols used to render the template
- lexers – dict of custom lexers to use
- delimiters – opening and closing tags
-
gluon.template.
render
(content='hello world', stream=None, filename=None, path=None, context={}, lexers={}, delimiters=('{{', '}}'), writer='response.write')[source]¶ Generic render function
Parameters: - content – default content
- stream – file-like obj to read template from
- filename – where to find template
- path – base path for templates
- context – env
- lexers – custom lexers to use
- delimiters – opening and closing tags
- writer – where to inject the resulting stream
- Example::
>>> render() 'hello world' >>> render(content='abc') 'abc' >>> render(content="abc'") "abc'" >>> render(content=''''a"'bc''') 'a"'bc' >>> render(content='a\nbc') 'a\nbc' >>> render(content='a"bcd"e') 'a"bcd"e' >>> render(content="'''a\nc'''") "'''a\nc'''" >>> render(content="'''a\'c'''") "'''a'c'''" >>> render(content='{{for i in range(a):}}{{=i}}<br />{{pass}}', context=dict(a=5)) '0<br />1<br />2<br />3<br />4<br />' >>> render(content='{%for i in range(a):%}{%=i%}<br />{%pass%}', context=dict(a=5),delimiters=('{%','%}')) '0<br />1<br />2<br />3<br />4<br />' >>> render(content="{{='''hello\nworld'''}}") 'hello\nworld' >>> render(content='{{for i in range(3):\n=i\npass}}') '012'
tools
Module¶
Auth, Mail, PluginManager and various utilities¶
-
class
gluon.tools.
Mail
(server=None, sender=None, login=None, tls=True)[source]¶ Bases:
object
Class for configuring and sending emails with alternative text / html body, multiple attachments and encryption support
Works with SMTP and Google App Engine.
Parameters: - server – SMTP server address in address:port notation
- sender – sender email address
- login – sender login name and password in login:password notation or None if no authentication is required
- tls – enables/disables encryption (True by default)
In Google App Engine use
server='gae'
For sake of backward compatibility all fields are optional and default to None, however, to be able to send emails at least server and sender must be specified. They are available under following fields:
mail.settings.server mail.settings.sender mail.settings.login mail.settings.timeout = 60 # seconds (default)
When server is ‘logging’, email is logged but not sent (debug mode)
Optionally you can use PGP encryption or X509:
mail.settings.cipher_type = None mail.settings.gpg_home = None mail.settings.sign = True mail.settings.sign_passphrase = None mail.settings.encrypt = True mail.settings.x509_sign_keyfile = None mail.settings.x509_sign_certfile = None mail.settings.x509_sign_chainfile = None mail.settings.x509_nocerts = False mail.settings.x509_crypt_certfiles = None cipher_type : None gpg - need a python-pyme package and gpgme lib x509 - smime gpg_home : you can set a GNUPGHOME environment variable to specify home of gnupg sign : sign the message (True or False) sign_passphrase : passphrase for key signing encrypt : encrypt the message (True or False). It defaults to True ... x509 only ... x509_sign_keyfile : the signers private key filename or string containing the key. (PEM format) x509_sign_certfile: the signers certificate filename or string containing the cert. (PEM format) x509_sign_chainfile: sets the optional all-in-one file where you can assemble the certificates of Certification Authorities (CA) which form the certificate chain of email certificate. It can be a string containing the certs to. (PEM format) x509_nocerts : if True then no attached certificate in mail x509_crypt_certfiles: the certificates file or strings to encrypt the messages with can be a file name / string or a list of file names / strings (PEM format)
Examples
Create Mail object with authentication data for remote server:
mail = Mail('example.com:25', 'me@example.com', 'me:password')
- Notice for GAE users:
- attachments have an automatic content_id=’attachment-i’ where i is progressive number in this way the can be referenced from the HTML as <img src=”cid:attachment-0” /> etc.
-
class
Attachment
(payload, filename=None, content_id=None, content_type=None, encoding='utf-8')[source]¶ Bases:
email.mime.base.MIMEBase
Email attachment
Parameters: - payload – path to file or file-like object with read() method
- filename – name of the attachment stored in message; if set to None, it will be fetched from payload path; file-like object payload must have explicit filename specified
- content_id – id of the attachment; automatically contained within < and >
- content_type – content type of the attachment; if set to None, it will be fetched from filename using gluon.contenttype module
- encoding – encoding of all strings passed to this function (except attachment body)
Content ID is used to identify attachments within the html body; in example, attached image with content ID ‘photo’ may be used in html message as a source of img tag <img src=”cid:photo” />.
- Example::
Create attachment from text file:
attachment = Mail.Attachment('/path/to/file.txt') Content-Type: text/plain MIME-Version: 1.0 Content-Disposition: attachment; filename="file.txt" Content-Transfer-Encoding: base64 SOMEBASE64CONTENT=
Create attachment from image file with custom filename and cid:
attachment = Mail.Attachment('/path/to/file.png', filename='photo.png', content_id='photo') Content-Type: image/png MIME-Version: 1.0 Content-Disposition: attachment; filename="photo.png" Content-Id: <photo> Content-Transfer-Encoding: base64 SOMEOTHERBASE64CONTENT=
-
Mail.
send
(to, subject='[no subject]', message='[no message]', attachments=None, cc=None, bcc=None, reply_to=None, sender=None, encoding='utf-8', raw=False, headers={}, from_address=None, cipher_type=None, sign=None, sign_passphrase=None, encrypt=None, x509_sign_keyfile=None, x509_sign_chainfile=None, x509_sign_certfile=None, x509_crypt_certfiles=None, x509_nocerts=None)[source]¶ Sends an email using data specified in constructor
Parameters: - to – list or tuple of receiver addresses; will also accept single object
- subject – subject of the email
- message –
email body text; depends on type of passed object:
- if 2-list or 2-tuple is passed: first element will be source of plain text while second of html text;
- otherwise: object will be the only source of plain text and html source will be set to None
If text or html source is:
- None: content part will be ignored,
- string: content part will be set to it,
- file-like object: content part will be fetched from it using it’s read() method
- attachments – list or tuple of Mail.Attachment objects; will also accept single object
- cc – list or tuple of carbon copy receiver addresses; will also accept single object
- bcc – list or tuple of blind carbon copy receiver addresses; will also accept single object
- reply_to – address to which reply should be composed
- encoding – encoding of all strings passed to this method (including message bodies)
- headers – dictionary of headers to refine the headers just before sending mail, e.g. {‘X-Mailer’ : ‘web2py mailer’}
- from_address – address to appear in the ‘From:’ header, this is not the envelope sender. If not specified the sender will be used
- cipher_type – gpg - need a python-pyme package and gpgme lib x509 - smime
- gpg_home – you can set a GNUPGHOME environment variable to specify home of gnupg
- sign – sign the message (True or False)
- sign_passphrase – passphrase for key signing
- encrypt – encrypt the message (True or False). It defaults to True. ... x509 only ...
- x509_sign_keyfile – the signers private key filename or string containing the key. (PEM format)
- x509_sign_certfile – the signers certificate filename or string containing the cert. (PEM format)
- x509_sign_chainfile – sets the optional all-in-one file where you can assemble the certificates of Certification Authorities (CA) which form the certificate chain of email certificate. It can be a string containing the certs to. (PEM format)
- x509_nocerts – if True then no attached certificate in mail
- x509_crypt_certfiles – the certificates file or strings to encrypt the messages with can be a file name / string or a list of file names / strings (PEM format)
Examples
Send plain text message to single address:
mail.send('you@example.com', 'Message subject', 'Plain text body of the message')
Send html message to single address:
mail.send('you@example.com', 'Message subject', '<html>Plain text body of the message</html>')
Send text and html message to three addresses (two in cc):
mail.send('you@example.com', 'Message subject', ('Plain text body', '<html>html body</html>'), cc=['other1@example.com', 'other2@example.com'])
Send html only message with image attachment available from the message by ‘photo’ content id:
mail.send('you@example.com', 'Message subject', (None, '<html><img src="cid:photo" /></html>'), Mail.Attachment('/path/to/photo.jpg' content_id='photo'))
Send email with two attachments and no body text:
mail.send('you@example.com, 'Message subject', None, [Mail.Attachment('/path/to/fist.file'), Mail.Attachment('/path/to/second.file')])
Returns: True on success, False on failure. Before return, method updates two object’s fields:
- self.result: return value of smtplib.SMTP.sendmail() or GAE’s mail.send_mail() method
- self.error: Exception message or None if above was successful
-
class
gluon.tools.
Auth
(environment=None, db=None, mailer=True, hmac_key=None, controller='default', function='user', cas_provider=None, signature=True, secure=False, csrf_prevention=True, propagate_extension=None, url_index=None)[source]¶ Bases:
object
-
accessible_query
(name, table, user_id=None)[source]¶ Returns a query with all accessible records for user_id or the current logged in user this method does not work on GAE because uses JOIN and IN
Example
Use as:
db(auth.accessible_query('read', db.mytable)).select(db.mytable.ALL)
-
add_membership
(group_id=None, user_id=None, role=None)[source]¶ Gives user_id membership of group_id or role if user is None than user_id is that of current logged in user
-
add_permission
(group_id, name='any', table_name='', record_id=0)[source]¶ Gives group_id ‘name’ access to ‘table_name’ and ‘record_id’
-
static
archive
(form, archive_table=None, current_record='current_record', archive_current=False, fields=None)[source]¶ If you have a table (db.mytable) that needs full revision history you can just do:
form=crud.update(db.mytable,myrecord,onaccept=auth.archive)
or:
form=SQLFORM(db.mytable,myrecord).process(onaccept=auth.archive)
crud.archive will define a new table “mytable_archive” and store a copy of the current record (if archive_current=True) or a copy of the previous record (if archive_current=False) in the newly created table including a reference to the current record.
fields allows to specify extra fields that need to be archived.
If you want to access such table you need to define it yourself in a model:
db.define_table('mytable_archive', Field('current_record',db.mytable), db.mytable)
Notice such table includes all fields of db.mytable plus one: current_record. crud.archive does not timestamp the stored record unless your original table has a fields like:
db.define_table(..., Field('saved_on','datetime', default=request.now,update=request.now,writable=False), Field('saved_by',auth.user, default=auth.user_id,update=auth.user_id,writable=False),
there is nothing special about these fields since they are filled before the record is archived.
If you want to change the archive table name and the name of the reference field you can do, for example:
db.define_table('myhistory', Field('parent_record',db.mytable), db.mytable)
and use it as:
form=crud.update(db.mytable,myrecord, onaccept=lambda form:crud.archive(form, archive_table=db.myhistory, current_record='parent_record'))
-
basic
(basic_auth_realm=False)[source]¶ Performs basic login.
Parameters: basic_auth_realm – optional basic http authentication realm. Can take str or unicode or function or callable or boolean. reads current.request.env.http_authorization and returns basic_allowed,basic_accepted,user.
if basic_auth_realm is defined is a callable it’s return value is used to set the basic authentication realm, if it’s a string its content is used instead. Otherwise basic authentication realm is set to the application name. If basic_auth_realm is None or False (the default) the behavior is to skip sending any challenge.
-
bulk_register
(max_emails=100)[source]¶ Creates a form for ther user to send invites to other users to join
-
cas_login
(next=<function <lambda>>, onvalidation=<function <lambda>>, onaccept=<function <lambda>>, log=<function <lambda>>, version=2)[source]¶
-
change_password
(next=<function <lambda>>, onvalidation=<function <lambda>>, onaccept=<function <lambda>>, log=<function <lambda>>)[source]¶ Returns a form that lets the user change password
-
confirm_registration
(next=<function <lambda>>, onvalidation=<function <lambda>>, onaccept=<function <lambda>>, log=<function <lambda>>)[source]¶ Returns a form to confirm user registration
-
default_messages
= {'invalid_email': 'Invalid email', 'verify_email_subject': 'Email verification', 'password_change_button': 'Change password', 'unable_send_email': 'Unable to send email', 'has_permission_log': None, 'label_email': 'E-mail', 'logout_log': 'User %(id)s Logged-out', 'verify_email': 'Welcome %(username)s! Click on the link %(link)s to verify your email', 'impersonate_log': 'User %(id)s is impersonating %(other_id)s', 'retrieve_username': 'Your username is: %(username)s', 'label_record_id': 'Record ID', 'bulk_invite_body': 'You have been invited to join %(site)s, click %(link)s to complete the process', 'register_log': 'User %(id)s Registered', 'label_reset_password_key': 'Reset Password key', 'verify_password': 'Verify Password', 'retrieve_password_subject': 'Password retrieve', 'retrieve_username_log': 'User %(id)s Username retrieved', 'email_taken': 'This email already has an account', 'registration_successful': 'Registration successful', 'label_password': 'Password', 'logged_in': 'Logged in', 'registration_pending': 'Registration is pending approval', 'login_disabled': 'Login disabled by administrator', 'label_user_id': 'User ID', 'label_first_name': 'First name', 'del_group_log': 'Group %(group_id)s deleted', 'registration_verifying': 'Registration needs verification', 'add_permission_log': None, 'reset_password_subject': 'Password reset', 'del_membership_log': None, 'login_button': 'Log In', 'profile_save_button': 'Apply changes', 'retrieve_password': 'Your password is: %(password)s', 'invalid_login': 'Invalid login', 'retrieve_username_subject': 'Username retrieve', 'change_password_log': 'User %(id)s Password changed', 'reset_password': 'Click on the link %(link)s to reset your password', 'email_sent': 'Email sent', 'register_button': 'Sign Up', 'label_origin': 'Origin', 'access_denied': 'Insufficient privileges', 'mismatched_password': "Password fields don't match", 'delete_label': 'Check to delete', 'verify_password_comment': 'please input your password again', 'function_disabled': 'Function disabled', 'username_taken': 'Username already taken', 'label_role': 'Role', 'label_time_stamp': 'Timestamp', 'profile_updated': 'Profile updated', 'logged_out': 'Logged out', 'login_failed_log': None, 'verify_email_log': 'User %(id)s Verification email sent', 'label_name': 'Name', 'submit_button': 'Submit', 'label_registration_key': 'Registration key', 'label_last_name': 'Last name', 'label_description': 'Description', 'bulk_invite_subject': 'Invitation to join%(site)s', 'invalid_password': 'Invalid password', 'add_group_log': 'Group %(group_id)s created', 'password_changed': 'Password changed', 'new_password': 'New password', 'label_registration_id': 'Registration identifier', 'retrieve_password_log': 'User %(id)s Password retrieved', 'reset_password_log': 'User %(id)s Password reset', 'label_table_name': 'Object or table name', 'login_log': 'User %(id)s Logged-in', 'profile_log': 'User %(id)s Profile updated', 'invalid_reset_password': 'Invalid reset password', 'password_reset_button': 'Request reset password', 'del_permission_log': None, 'add_membership_log': None, 'label_client_ip': 'Client IP', 'invalid_user': 'Invalid user', 'has_membership_log': None, 'group_description': 'Group uniquely assigned to user %(id)s', 'unable_to_send_email': 'Unable to send email', 'invalid_username': 'Invalid username', 'label_group_id': 'Group ID', 'email_verified': 'Email verified', 'new_password_sent': 'A new password was emailed to you', 'is_empty': 'Cannot be empty', 'label_remember_me': 'Remember me (for 30 days)', 'username_sent': 'Your username was emailed to you', 'old_password': 'Old password', 'label_username': 'Username'}¶ Class for authentication, authorization, role based access control.
Includes:
- registration and profile
- login and logout
- username and password retrieval
- event logging
- role creation and assignment
- user defined group/role based permission
Parameters: - environment – is there for legacy but unused (awful)
- db – has to be the database where to create tables for authentication
- mailer – Mail(...) or None (no mailer) or True (make a mailer)
- hmac_key – can be a hmac_key or hmac_key=Auth.get_or_create_key()
- controller – (where is the user action?)
- cas_provider – (delegate authentication to the URL, CAS2)
Authentication Example:
from gluon.contrib.utils import * mail=Mail() mail.settings.server='smtp.gmail.com:587' mail.settings.sender='you@somewhere.com' mail.settings.login='username:password' auth=Auth(db) auth.settings.mailer=mail # auth.settings....=... auth.define_tables() def authentication(): return dict(form=auth())
Exposes:
- http://.../{application}/{controller}/authentication/login
- http://.../{application}/{controller}/authentication/logout
- http://.../{application}/{controller}/authentication/register
- http://.../{application}/{controller}/authentication/verify_email
- http://.../{application}/{controller}/authentication/retrieve_username
- http://.../{application}/{controller}/authentication/retrieve_password
- http://.../{application}/{controller}/authentication/reset_password
- http://.../{application}/{controller}/authentication/profile
- http://.../{application}/{controller}/authentication/change_password
On registration a group with role=new_user.id is created and user is given membership of this group.
You can create a group with:
group_id=auth.add_group('Manager', 'can access the manage action') auth.add_permission(group_id, 'access to manage')
Here “access to manage” is just a user defined string. You can give access to a user:
auth.add_membership(group_id, user_id)
If user id is omitted, the logged in user is assumed
Then you can decorate any action:
@auth.requires_permission('access to manage') def manage(): return dict()
You can restrict a permission to a specific table:
auth.add_permission(group_id, 'edit', db.sometable) @auth.requires_permission('edit', db.sometable)
Or to a specific record:
auth.add_permission(group_id, 'edit', db.sometable, 45) @auth.requires_permission('edit', db.sometable, 45)
If authorization is not granted calls:
auth.settings.on_failed_authorization
Other options:
auth.settings.mailer=None auth.settings.expiration=3600 # seconds ... ### these are messages that can be customized ...
-
default_settings
= {'profile_fields': None, 'table_permission': None, 'table_event_name': 'auth_event', 'login_userfield': None, 'table_event': None, 'label_separator': None, 'hideerror': False, 'table_permission_name': 'auth_permission', 'register_captcha': None, 'table_cas_name': 'auth_cas', 'allow_basic_login_only': False, 'manager_actions': {}, 'remember_me_form': True, 'logout_onlogout': None, 'table_token_name': 'auth_token', 'client_side': True, 'table_membership': None, 'bulk_register_enabled': False, 'ondelete': 'CASCADE', 'register_verify_password': True, 'renew_session_onlogout': True, 'long_expiration': 2592000, 'registration_requires_verification': False, 'everybody_group_id': None, 'username_case_sensitive': True, 'logging_enabled': True, 'keep_session_onlogout': False, 'login_after_password_change': True, 'prevent_password_reset_attacks': True, 'expiration': 3600, 'allow_basic_login': False, 'create_user_groups': 'user_%(id)s', 'wiki': <Storage {}>, 'update_fields': ['email'], 'showid': False, 'retrieve_username_captcha': None, 'two_factor_authentication_group': None, 'password_field': 'password', 'keep_session_onlogin': True, 'table_cas': None, 'captcha': None, 'registration_requires_approval': False, 'table_user_name': 'auth_user', 'table_user': None, 'password_min_length': 4, 'renew_session_onlogin': True, 'register_fields': None, 'allow_delete_accounts': False, 'auth_manager_role': None, 'login_email_validate': True, 'alternate_requires_registration': False, 'email_case_sensitive': True, 'use_username': False, 'formstyle': None, 'pre_registration_div': None, 'prevent_open_redirect_attacks': True, 'reset_password_requires_verification': False, 'cas_maps': None, 'login_after_registration': False, 'login_captcha': None, 'multi_login': False, 'retrieve_password_captcha': None, 'on_failed_authentication': <function <lambda> at 0x7f5a35c7e2a8>, 'table_group_name': 'auth_group', 'table_group': None, 'table_membership_name': 'auth_membership'}¶
-
define_tables
(username=None, signature=None, enable_tokens=False, migrate=None, fake_migrate=None)[source]¶ To be called unless tables are defined manually
Examples
Use as:
# defines all needed tables and table files # 'myprefix_auth_user.table', ... auth.define_tables(migrate='myprefix_') # defines all needed tables without migration/table files auth.define_tables(migrate=False)
-
del_membership
(group_id=None, user_id=None, role=None)[source]¶ Revokes membership from group_id to user_id if user_id is None than user_id is that of current logged in user
-
del_permission
(group_id, name='any', table_name='', record_id=0)[source]¶ Revokes group_id ‘name’ access to ‘table_name’ and ‘record_id’
-
email_registration
(subject, body, user)[source]¶ Sends and email invitation to a user informing they have been registered with the application
-
enable_record_versioning
(tables, archive_db=None, archive_names='%(tablename)s_archive', current_record='current_record', current_record_label=None)[source]¶ Used to enable full record versioning (including auth tables):
auth = Auth(db) auth.define_tables(signature=True) # define our own tables db.define_table('mything',Field('name'),auth.signature) auth.enable_record_versioning(tables=db)
tables can be the db (all table) or a list of tables. only tables with modified_by and modified_on fiels (as created by auth.signature) will have versioning. Old record versions will be in table ‘mything_archive’ automatically defined.
when you enable enable_record_versioning, records are never deleted but marked with is_active=False.
enable_record_versioning enables a common_filter for every table that filters out records with is_active = False
Note
If you use auth.enable_record_versioning, do not use auth.archive or you will end up with duplicates. auth.archive does explicitly what enable_record_versioning does automatically.
-
get_or_create_user
(keys, update_fields=['email'], login=True, get=True)[source]¶ Used for alternate login methods: If the user exists already then password is updated. If the user doesn’t yet exist, then they are created.
-
has_membership
(group_id=None, user_id=None, role=None)[source]¶ Checks if user is member of group_id or role
-
has_permission
(name='any', table_name='', record_id=0, user_id=None, group_id=None)[source]¶ Checks if user_id or current logged in user is member of a group that has ‘name’ permission on ‘table_name’ and ‘record_id’ if group_id is passed, it checks whether the group has the permission
-
impersonate
(user_id=<function <lambda>>)[source]¶ To use this make a POST to http://..../impersonate request.post_vars.user_id=<id>
Set request.post_vars.user_id to 0 to restore original user.
requires impersonator is logged in and:
has_permission('impersonate', 'auth_user', user_id)
-
is_logged_in
()[source]¶ Checks if the user is logged in and returns True/False. If so user is in auth.user as well as in session.auth.user
-
log_event
(description, vars=None, origin='auth')[source]¶ Examples
Use as:
auth.log_event(description='this happened', origin='auth')
-
login
(next=<function <lambda>>, onvalidation=<function <lambda>>, onaccept=<function <lambda>>, log=<function <lambda>>)[source]¶ Returns a login form
-
login_bare
(username, password)[source]¶ Logins user as specified by username (or email) and password
-
logout
(next=<function <lambda>>, onlogout=<function <lambda>>, log=<function <lambda>>)[source]¶ Logouts and redirects to login
Navbar with support for more templates This uses some code from the old navbar.
Parameters: mode – see options for list of
You can change the view for this page to make it look as you like
-
profile
(next=<function <lambda>>, onvalidation=<function <lambda>>, onaccept=<function <lambda>>, log=<function <lambda>>)[source]¶ Returns a form that lets the user change his/her profile
-
register
(next=<function <lambda>>, onvalidation=<function <lambda>>, onaccept=<function <lambda>>, log=<function <lambda>>)[source]¶ Returns a registration form
-
register_bare
(**fields)[source]¶ Registers a user as specified by username (or email) and a raw password.
-
request_reset_password
(next=<function <lambda>>, onvalidation=<function <lambda>>, onaccept=<function <lambda>>, log=<function <lambda>>)[source]¶ Returns a form to reset the user password
-
requires
(condition, requires_login=True, otherwise=None)[source]¶ Decorator that prevents access to action if not logged in
-
requires_membership
(role=None, group_id=None, otherwise=None)[source]¶ Decorator that prevents access to action if not logged in or if user logged in is not a member of group_id. If role is provided instead of group_id then the group_id is calculated.
-
requires_permission
(name, table_name='', record_id=0, otherwise=None)[source]¶ Decorator that prevents access to action if not logged in or if user logged in is not a member of any group (role) that has ‘name’ access to ‘table_name’, ‘record_id’.
-
requires_signature
(otherwise=None, hash_vars=True)[source]¶ Decorator that prevents access to action if not logged in or if user logged in is not a member of group_id. If role is provided instead of group_id then the group_id is calculated.
-
reset_password
(next=<function <lambda>>, onvalidation=<function <lambda>>, onaccept=<function <lambda>>, log=<function <lambda>>)[source]¶ Returns a form to reset the user password
-
reset_password_deprecated
(next=<function <lambda>>, onvalidation=<function <lambda>>, onaccept=<function <lambda>>, log=<function <lambda>>)[source]¶ Returns a form to reset the user password (deprecated)
-
retrieve_password
(next=<function <lambda>>, onvalidation=<function <lambda>>, onaccept=<function <lambda>>, log=<function <lambda>>)[source]¶
-
retrieve_username
(next=<function <lambda>>, onvalidation=<function <lambda>>, onaccept=<function <lambda>>, log=<function <lambda>>)[source]¶ Returns a form to retrieve the user username (only if there is a username field)
-
user_group
(user_id=None)[source]¶ Returns the group_id of the group uniquely associated to this user i.e. role=user:[user_id]
-
user_id
¶ user.id or None
-
verify_email
(next=<function <lambda>>, onaccept=<function <lambda>>, log=<function <lambda>>)[source]¶ Action used to verify the registration email
-
wiki
(slug=None, env=None, render='markmin', manage_permissions=False, force_prefix='', restrict_search=False, resolve=True, extra=None, menu_groups=None, templates=None, migrate=True, controller=None, function=None, force_render=False, groups=None)[source]¶
To be used in menu.py for app wide wiki menus
-
-
class
gluon.tools.
Recaptcha
(request=None, public_key='', private_key='', use_ssl=False, error=None, error_message='invalid', label='Verify:', options='', comment='', ajax=False)[source]¶ Bases:
gluon.html.DIV
Examples
Use as:
form = FORM(Recaptcha(public_key='...',private_key='...'))
or:
form = SQLFORM(...) form.append(Recaptcha(public_key='...',private_key='...'))
-
API_SERVER
= 'http://www.google.com/recaptcha/api'¶
-
API_SSL_SERVER
= 'https://www.google.com/recaptcha/api'¶
-
VERIFY_SERVER
= 'http://www.google.com/recaptcha/api/verify'¶
-
-
class
gluon.tools.
Recaptcha2
(request=None, public_key='', private_key='', error_message='invalid', label='Verify:', options=None, comment='')[source]¶ Bases:
gluon.html.DIV
Experimental: Creates a DIV holding the newer Recaptcha from Google (v2)
Parameters: - request – the request. If not passed, uses current request
- public_key – the public key Google gave you
- private_key – the private key Google gave you
- error_message – the error message to show if verification fails
- label – the label to use
- options (dict) –
takes these parameters
- hl
- theme
- type
- tabindex
- callback
- expired-callback
see https://developers.google.com/recaptcha/docs/display for docs about those
- comment – the comment
Examples
Use as:
form = FORM(Recaptcha2(public_key='...',private_key='...'))
or:
form = SQLFORM(...) form.append(Recaptcha2(public_key='...',private_key='...'))
to protect the login page instead, use:
from gluon.tools import Recaptcha2 auth.settings.captcha = Recaptcha2(request, public_key='...',private_key='...')
-
API_URI
= 'https://www.google.com/recaptcha/api.js'¶
-
VERIFY_SERVER
= 'https://www.google.com/recaptcha/api/siteverify'¶
-
class
gluon.tools.
Crud
(environment, db=None, controller='default')[source]¶ Bases:
object
-
create
(table, next=<function <lambda>>, onvalidation=<function <lambda>>, onaccept=<function <lambda>>, log=<function <lambda>>, message=<function <lambda>>, formname=<function <lambda>>, **attributes)[source]¶
-
search
(*tables, **args)[source]¶ Creates a search form and its results for a table .. rubric:: Examples
Use as:
form, results = crud.search(db.test, queries = ['equals', 'not equal', 'contains'], query_labels={'equals':'Equals', 'not equal':'Not equal'}, fields = ['id','children'], field_labels = { 'id':'ID','children':'Children'}, zero='Please choose', query = (db.test.id > 0)&(db.test.id != 3) )
-
-
class
gluon.tools.
Service
(environment=None)[source]¶ Bases:
object
-
Service.
amfrpc
(f)[source]¶ Example
Use as:
service = Service() @service.amfrpc def myfunction(a, b): return a + b def call(): return service()
Then call it with:
wget http://..../app/default/call/amfrpc/myfunction?a=hello&b=world
-
Service.
amfrpc3
(domain='default')[source]¶ Example
Use as:
service = Service() @service.amfrpc3('domain') def myfunction(a, b): return a + b def call(): return service()
Then call it with:
-
Service.
csv
(f)[source]¶ Example
Use as:
service = Service() @service.csv def myfunction(a, b): return a + b def call(): return service()
Then call it with:
wget http://..../app/default/call/csv/myfunction?a=3&b=4
-
Service.
json
(f)[source]¶ Example
Use as:
service = Service() @service.json def myfunction(a, b): return [{a: b}] def call(): return service()
Then call it with:;
-
Service.
jsonrpc
(f)[source]¶ Example
Use as:
service = Service() @service.jsonrpc def myfunction(a, b): return a + b def call(): return service()
Then call it with:
-
Service.
jsonrpc2
(f)[source]¶ Example
Use as:
service = Service() @service.jsonrpc2 def myfunction(a, b): return a + b def call(): return service()
Then call it with:
wget –post-data ‘{“jsonrpc”: “2.0”, “id”: 1, “method”: “myfunction”, “params”: {“a”: 1, “b”: 2}}’ http://..../app/default/call/jsonrpc2
-
Service.
jsonrpc_errors
= {-32700: ('Parse error. Invalid JSON was received by the server.', 'An error occurred on the server while parsing the JSON text.'), -32603: ('Internal error', 'Internal JSON-RPC error.'), -32602: ('Invalid params', 'Invalid method parameter(s).'), -32601: ('Method not found', 'The method does not exist / is not available.'), -32600: ('Invalid Request', 'The JSON sent is not a valid Request object.'), -32099: ('Server error', 'Reserved for implementation-defined server-errors.')}¶
-
Service.
rss
(f)[source]¶ Example
Use as:
service = Service() @service.rss def myfunction(): return dict(title=..., link=..., description=..., created_on=..., entries=[dict(title=..., link=..., description=..., created_on=...]) def call(): return service()
Then call it with:
-
Service.
run
(f)[source]¶ Example
Use as:
service = Service() @service.run def myfunction(a, b): return a + b def call(): return service()
Then call it with:
wget http://..../app/default/call/run/myfunction?a=3&b=4
-
Service.
soap
(name=None, returns=None, args=None, doc=None)[source]¶ Example
Use as:
service = Service() @service.soap('MyFunction',returns={'result':int},args={'a':int,'b':int,}) def myfunction(a, b): return a + b def call(): return service()
Then call it with:
from gluon.contrib.pysimplesoap.client import SoapClient client = SoapClient(wsdl="http://..../app/default/call/soap?WSDL") response = client.MyFunction(a=1,b=2) return response['result']
It also exposes online generated documentation and xml example messages at http://..../app/default/call/soap
-
-
class
gluon.tools.
Wiki
(auth, env=None, render='markmin', manage_permissions=False, force_prefix='', restrict_search=False, extra=None, menu_groups=None, templates=None, migrate=True, controller=None, function=None, groups=None)[source]¶ Bases:
object
adds the menu if not present
-
static
component
(text)[source]¶ In wiki docs allows @{component:controller/function/args} which renders as a LOAD(..., ajax=True)
-
everybody
= 'everybody'¶
-
rows_page
= 25¶
-
class
gluon.tools.
PluginManager
(plugin=None, **defaults)[source]¶ Bases:
object
Plugin Manager is similar to a storage object but it is a single level singleton. This means that multiple instances within the same thread share the same attributes. Its constructor is also special. The first argument is the name of the plugin you are defining. The named arguments are parameters needed by the plugin with default values. If the parameters were previous defined, the old values are used.
Example
in some general configuration file:
plugins = PluginManager() plugins.me.param1=3
within the plugin model:
_ = PluginManager('me',param1=5,param2=6,param3=7)
where the plugin is used:
>>> print plugins.me.param1 3 >>> print plugins.me.param2 6 >>> plugins.me.param3 = 8 >>> print plugins.me.param3 8
Here are some tests:
>>> a=PluginManager() >>> a.x=6 >>> b=PluginManager('check') >>> print b.x 6 >>> b=PluginManager() # reset settings >>> print b.x <Storage {}> >>> b.x=7 >>> print a.x 7 >>> a.y.z=8 >>> print b.y.z 8 >>> test_thread_separation() 5 >>> plugins=PluginManager('me',db='mydb') >>> print plugins.me.db mydb >>> print 'me' in plugins True >>> print plugins.me.installed True
-
instances
= {}¶
-
-
gluon.tools.
fetch
(url, data=None, headers=None, cookie=<SimpleCookie: >, user_agent='Mozilla/5.0')[source]¶
utf8
Module¶
Utilities and class for UTF8 strings managing¶
-
class
gluon.utf8.
Utf8
[source]¶ Bases:
str
Class for utf8 string storing and manipulations
The base presupposition of this class usage is: “ALL strings in the application are either of utf-8 or unicode type, even when simple str type is used. UTF-8 is only a “packed” version of unicode, so Utf-8 and unicode strings are interchangeable.”
CAUTION! This class is slower than str/unicode! Do NOT use it inside intensive loops. Simply decode string(s) to unicode before loop and encode it back to utf-8 string(s) after intensive calculation.
You can see the benefit of this class in doctests() below
utils
Module¶
This file specifically includes utilities for security.¶
-
gluon.utils.
AES_new
(key, IV=None)[source]¶ Returns an AES cipher object and random IV if None specified
-
gluon.utils.
fast_urandom16
(urandom=[], locker=<_RLock owner=None count=0>)[source]¶ This is 4x faster than calling os.urandom(16) and prevents the “too many files open” issue with concurrent access to os.urandom()
-
gluon.utils.
initialize_urandom
()[source]¶ This function and the web2py_uuid follow from the following discussion: http://groups.google.com/group/web2py-developers/browse_thread/thread/7fd5789a7da3f09
At startup web2py compute a unique ID that identifies the machine by adding uuid.getnode() + int(time.time() * 1e3)
This is a 48-bit number. It converts the number into 16 8-bit tokens. It uses this value to initialize the entropy source (‘/dev/urandom’) and to seed random.
If os.random() is not supported, it falls back to using random and issues a warning.
-
gluon.utils.
is_loopback_ip_address
(ip=None, addrinfo=None)[source]¶ Determines whether the address appears to be a loopback address. This assumes that the IP is valid.
-
gluon.utils.
is_valid_ip_address
(address)[source]¶ Examples
Better than a thousand words:
>>> is_valid_ip_address('127.0') False >>> is_valid_ip_address('127.0.0.1') True >>> is_valid_ip_address('2001:660::1') True
-
gluon.utils.
simple_hash
(text, key='', salt='', digest_alg='md5')[source]¶ Generates hash with the given text using the specified digest hashing algorithm
-
gluon.utils.
web2py_uuid
(ctokens=(6373484652917381235, 1048028589951684235))[source]¶ This function follows from the following discussion: http://groups.google.com/group/web2py-developers/browse_thread/thread/7fd5789a7da3f09
It works like uuid.uuid4 except that tries to use os.urandom() if possible and it XORs the output with the tokens uniquely associated with this machine.
validators
Module¶
Validators¶
-
class
gluon.validators.
ANY_OF
(subs)[source]¶ Bases:
gluon.validators.Validator
Tests if any of the validators in a list returns successfully:
>>> ANY_OF([IS_EMAIL(),IS_ALPHANUMERIC()])('a@b.co') ('a@b.co', None) >>> ANY_OF([IS_EMAIL(),IS_ALPHANUMERIC()])('abco') ('abco', None) >>> ANY_OF([IS_EMAIL(),IS_ALPHANUMERIC()])('@ab.co') ('@ab.co', 'enter only letters, numbers, and underscore') >>> ANY_OF([IS_ALPHANUMERIC(),IS_EMAIL()])('@ab.co') ('@ab.co', 'enter a valid email address')
-
class
gluon.validators.
CLEANUP
(regex=None)[source]¶ Bases:
gluon.validators.Validator
Examples
Use as:
INPUT(_type='text', _name='name', requires=CLEANUP())
removes special characters on validation
-
REGEX_CLEANUP
= <_sre.SRE_Pattern object>¶
-
-
class
gluon.validators.
CRYPT
(key=None, digest_alg='pbkdf2(1000, 20, sha512)', min_length=0, error_message='Too short', salt=True, max_length=1024)[source]¶ Bases:
object
Examples
Use as:
INPUT(_type='text', _name='name', requires=CRYPT())
encodes the value on validation with a digest.
If no arguments are provided CRYPT uses the MD5 algorithm. If the key argument is provided the HMAC+MD5 algorithm is used. If the digest_alg is specified this is used to replace the MD5 with, for example, SHA512. The digest_alg can be the name of a hashlib algorithm as a string or the algorithm itself.
min_length is the minimal password length (default 4) - IS_STRONG for serious security error_message is the message if password is too short
Notice that an empty password is accepted but invalid. It will not allow login back. Stores junk as hashed password.
Specify an algorithm or by default we will use sha512.
- Typical available algorithms:
- md5, sha1, sha224, sha256, sha384, sha512
If salt, it hashes a password with a salt. If salt is True, this method will automatically generate one. Either case it returns an encrypted password string in the following format:
<algorithm>$<salt>$<hash>Important: hashed password is returned as a LazyCrypt object and computed only if needed. The LasyCrypt object also knows how to compare itself with an existing salted password
Supports standard algorithms
>>> for alg in ('md5','sha1','sha256','sha384','sha512'): ... print str(CRYPT(digest_alg=alg,salt=True)('test')[0]) md5$...$... sha1$...$... sha256$...$... sha384$...$... sha512$...$...
The syntax is always alg$salt$hash
Supports for pbkdf2
>>> alg = 'pbkdf2(1000,20,sha512)' >>> print str(CRYPT(digest_alg=alg,salt=True)('test')[0]) pbkdf2(1000,20,sha512)$...$...
An optional hmac_key can be specified and it is used as salt prefix
>>> a = str(CRYPT(digest_alg='md5',key='mykey',salt=True)('test')[0]) >>> print a md5$...$...
Even if the algorithm changes the hash can still be validated
>>> CRYPT(digest_alg='sha1',key='mykey',salt=True)('test')[0] == a True
If no salt is specified CRYPT can guess the algorithms from length:
>>> a = str(CRYPT(digest_alg='sha1',salt=False)('test')[0]) >>> a 'sha1$$a94a8fe5ccb19ba61c4c0873d391e987982fbbd3' >>> CRYPT(digest_alg='sha1',salt=False)('test')[0] == a True >>> CRYPT(digest_alg='sha1',salt=False)('test')[0] == a[6:] True >>> CRYPT(digest_alg='md5',salt=False)('test')[0] == a True >>> CRYPT(digest_alg='md5',salt=False)('test')[0] == a[6:] True
-
class
gluon.validators.
IS_ALPHANUMERIC
(error_message='Enter only letters, numbers, and underscore')[source]¶ Bases:
gluon.validators.IS_MATCH
Example
Used as:
INPUT(_type='text', _name='name', requires=IS_ALPHANUMERIC()) >>> IS_ALPHANUMERIC()('1') ('1', None) >>> IS_ALPHANUMERIC()('') ('', None) >>> IS_ALPHANUMERIC()('A_a') ('A_a', None) >>> IS_ALPHANUMERIC()('!') ('!', 'enter only letters, numbers, and underscore')
-
class
gluon.validators.
IS_DATE_IN_RANGE
(minimum=None, maximum=None, format='%Y-%m-%d', error_message=None, timezone=None)[source]¶ Bases:
gluon.validators.IS_DATE
Examples
Use as:
>>> v = IS_DATE_IN_RANGE(minimum=datetime.date(2008,1,1), maximum=datetime.date(2009,12,31), format="%m/%d/%Y",error_message="Oops") >>> v('03/03/2008') (datetime.date(2008, 3, 3), None) >>> v('03/03/2010') ('03/03/2010', 'oops') >>> v(datetime.date(2008,3,3)) (datetime.date(2008, 3, 3), None) >>> v(datetime.date(2010,3,3)) (datetime.date(2010, 3, 3), 'oops')
-
class
gluon.validators.
IS_DATE
(format='%Y-%m-%d', error_message='Enter date as %(format)s', timezone=None)[source]¶ Bases:
gluon.validators.Validator
Examples
Use as:
INPUT(_type='text', _name='name', requires=IS_DATE())
date has to be in the ISO8960 format YYYY-MM-DD timezome must be None or a pytz.timezone(“America/Chicago”) object
-
class
gluon.validators.
IS_DATETIME_IN_RANGE
(minimum=None, maximum=None, format='%Y-%m-%d %H:%M:%S', error_message=None, timezone=None)[source]¶ Bases:
gluon.validators.IS_DATETIME
Examples
- Use as::
>>> v = IS_DATETIME_IN_RANGE( minimum=datetime.datetime(2008,1,1,12,20), maximum=datetime.datetime(2009,12,31,12,20), format="%m/%d/%Y %H:%M",error_message="Oops") >>> v('03/03/2008 12:40') (datetime.datetime(2008, 3, 3, 12, 40), None)
>>> v('03/03/2010 10:34') ('03/03/2010 10:34', 'oops')
>>> v(datetime.datetime(2008,3,3,0,0)) (datetime.datetime(2008, 3, 3, 0, 0), None)
>>> v(datetime.datetime(2010,3,3,0,0)) (datetime.datetime(2010, 3, 3, 0, 0), 'oops')
-
class
gluon.validators.
IS_DATETIME
(format='%Y-%m-%d %H:%M:%S', error_message='Enter date and time as %(format)s', timezone=None)[source]¶ Bases:
gluon.validators.Validator
Examples
Use as:
INPUT(_type='text', _name='name', requires=IS_DATETIME())
datetime has to be in the ISO8960 format YYYY-MM-DD hh:mm:ss timezome must be None or a pytz.timezone(“America/Chicago”) object
-
isodatetime
= '%Y-%m-%d %H:%M:%S'¶
-
-
class
gluon.validators.
IS_DECIMAL_IN_RANGE
(minimum=None, maximum=None, error_message=None, dot='.')[source]¶ Bases:
gluon.validators.Validator
Determines that the argument is (or can be represented as) a Python Decimal, and that it falls within the specified inclusive range. The comparison is made with Python Decimal arithmetic.
The minimum and maximum limits can be None, meaning no lower or upper limit, respectively.
Example
Used as:
INPUT(_type='text', _name='name', requires=IS_DECIMAL_IN_RANGE(0, 10)) >>> IS_DECIMAL_IN_RANGE(1,5)('4') (Decimal('4'), None) >>> IS_DECIMAL_IN_RANGE(1,5)(4) (Decimal('4'), None) >>> IS_DECIMAL_IN_RANGE(1,5)(1) (Decimal('1'), None) >>> IS_DECIMAL_IN_RANGE(1,5)(5.25) (5.25, 'enter a number between 1 and 5') >>> IS_DECIMAL_IN_RANGE(5.25,6)(5.25) (Decimal('5.25'), None) >>> IS_DECIMAL_IN_RANGE(5.25,6)('5.25') (Decimal('5.25'), None) >>> IS_DECIMAL_IN_RANGE(1,5)(6.0) (6.0, 'enter a number between 1 and 5') >>> IS_DECIMAL_IN_RANGE(1,5)(3.5) (Decimal('3.5'), None) >>> IS_DECIMAL_IN_RANGE(1.5,5.5)(3.5) (Decimal('3.5'), None) >>> IS_DECIMAL_IN_RANGE(1.5,5.5)(6.5) (6.5, 'enter a number between 1.5 and 5.5') >>> IS_DECIMAL_IN_RANGE(1.5,None)(6.5) (Decimal('6.5'), None) >>> IS_DECIMAL_IN_RANGE(1.5,None)(0.5) (0.5, 'enter a number greater than or equal to 1.5') >>> IS_DECIMAL_IN_RANGE(None,5.5)(4.5) (Decimal('4.5'), None) >>> IS_DECIMAL_IN_RANGE(None,5.5)(6.5) (6.5, 'enter a number less than or equal to 5.5') >>> IS_DECIMAL_IN_RANGE()(6.5) (Decimal('6.5'), None) >>> IS_DECIMAL_IN_RANGE(0,99)(123.123) (123.123, 'enter a number between 0 and 99') >>> IS_DECIMAL_IN_RANGE(0,99)('123.123') ('123.123', 'enter a number between 0 and 99') >>> IS_DECIMAL_IN_RANGE(0,99)('12.34') (Decimal('12.34'), None) >>> IS_DECIMAL_IN_RANGE()('abc') ('abc', 'enter a number')
-
class
gluon.validators.
IS_EMAIL
(banned=None, forced=None, error_message='Enter a valid email address')[source]¶ Bases:
gluon.validators.Validator
Checks if field’s value is a valid email address. Can be set to disallow or force addresses from certain domain(s).
Email regex adapted from http://haacked.com/archive/2007/08/21/i-knew-how-to-validate-an-email-address-until-i.aspx, generally following the RFCs, except that we disallow quoted strings and permit underscores and leading numerics in subdomain labels
Parameters: - banned – regex text for disallowed address domains
- forced – regex text for required address domains
Both arguments can also be custom objects with a match(value) method.
Example
Check for valid email address:
INPUT(_type='text', _name='name', requires=IS_EMAIL())
Check for valid email address that can’t be from a .com domain:
INPUT(_type='text', _name='name', requires=IS_EMAIL(banned='^.*\.com(|\..*)$'))
Check for valid email address that must be from a .edu domain:
INPUT(_type='text', _name='name', requires=IS_EMAIL(forced='^.*\.edu(|\..*)$')) >>> IS_EMAIL()('a@b.com') ('a@b.com', None) >>> IS_EMAIL()('abc@def.com') ('abc@def.com', None) >>> IS_EMAIL()('abc@3def.com') ('abc@3def.com', None) >>> IS_EMAIL()('abc@def.us') ('abc@def.us', None) >>> IS_EMAIL()('abc@d_-f.us') ('abc@d_-f.us', None) >>> IS_EMAIL()('@def.com') # missing name ('@def.com', 'enter a valid email address') >>> IS_EMAIL()('"abc@def".com') # quoted name ('"abc@def".com', 'enter a valid email address') >>> IS_EMAIL()('abc+def.com') # no @ ('abc+def.com', 'enter a valid email address') >>> IS_EMAIL()('abc@def.x') # one-char TLD ('abc@def.x', 'enter a valid email address') >>> IS_EMAIL()('abc@def.12') # numeric TLD ('abc@def.12', 'enter a valid email address') >>> IS_EMAIL()('abc@def..com') # double-dot in domain ('abc@def..com', 'enter a valid email address') >>> IS_EMAIL()('abc@.def.com') # dot starts domain ('abc@.def.com', 'enter a valid email address') >>> IS_EMAIL()('abc@def.c_m') # underscore in TLD ('abc@def.c_m', 'enter a valid email address') >>> IS_EMAIL()('NotAnEmail') # missing @ ('NotAnEmail', 'enter a valid email address') >>> IS_EMAIL()('abc@NotAnEmail') # missing TLD ('abc@NotAnEmail', 'enter a valid email address') >>> IS_EMAIL()('customer/department@example.com') ('customer/department@example.com', None) >>> IS_EMAIL()('$A12345@example.com') ('$A12345@example.com', None) >>> IS_EMAIL()('!def!xyz%abc@example.com') ('!def!xyz%abc@example.com', None) >>> IS_EMAIL()('_Yosemite.Sam@example.com') ('_Yosemite.Sam@example.com', None) >>> IS_EMAIL()('~@example.com') ('~@example.com', None) >>> IS_EMAIL()('.wooly@example.com') # dot starts name ('.wooly@example.com', 'enter a valid email address') >>> IS_EMAIL()('wo..oly@example.com') # adjacent dots in name ('wo..oly@example.com', 'enter a valid email address') >>> IS_EMAIL()('pootietang.@example.com') # dot ends name ('pootietang.@example.com', 'enter a valid email address') >>> IS_EMAIL()('.@example.com') # name is bare dot ('.@example.com', 'enter a valid email address') >>> IS_EMAIL()('Ima.Fool@example.com') ('Ima.Fool@example.com', None) >>> IS_EMAIL()('Ima Fool@example.com') # space in name ('Ima Fool@example.com', 'enter a valid email address') >>> IS_EMAIL()('localguy@localhost') # localhost as domain ('localguy@localhost', None)
-
regex
= <_sre.SRE_Pattern object at 0x1dd9fb0>¶
-
regex_proposed_but_failed
= <_sre.SRE_Pattern object at 0x1ddac20>¶
-
class
gluon.validators.
IS_LIST_OF_EMAILS
(error_message='Invalid emails: %s')[source]¶ Bases:
object
Example
Used as:
Field('emails','list:string', widget=SQLFORM.widgets.text.widget, requires=IS_LIST_OF_EMAILS(), represent=lambda v,r: SPAN(*[A(x,_href='mailto:'+x) for x in (v or [])]) )
-
split_emails
= <_sre.SRE_Pattern object>¶
-
-
class
gluon.validators.
IS_EMPTY_OR
(other, null=None, empty_regex=None)[source]¶ Bases:
gluon.validators.Validator
Dummy class for testing IS_EMPTY_OR:
>>> IS_EMPTY_OR(IS_EMAIL())('abc@def.com') ('abc@def.com', None) >>> IS_EMPTY_OR(IS_EMAIL())(' ') (None, None) >>> IS_EMPTY_OR(IS_EMAIL(), null='abc')(' ') ('abc', None) >>> IS_EMPTY_OR(IS_EMAIL(), null='abc', empty_regex='def')('def') ('abc', None) >>> IS_EMPTY_OR(IS_EMAIL())('abc') ('abc', 'enter a valid email address') >>> IS_EMPTY_OR(IS_EMAIL())(' abc ') ('abc', 'enter a valid email address')
-
class
gluon.validators.
IS_EXPR
(expression, error_message='Invalid expression', environment=None)[source]¶ Bases:
gluon.validators.Validator
Example
Used as:
INPUT(_type='text', _name='name', requires=IS_EXPR('5 < int(value) < 10'))
The argument of IS_EXPR must be python condition:
>>> IS_EXPR('int(value) < 2')('1') ('1', None) >>> IS_EXPR('int(value) < 2')('2') ('2', 'invalid expression')
-
class
gluon.validators.
IS_FLOAT_IN_RANGE
(minimum=None, maximum=None, error_message=None, dot='.')[source]¶ Bases:
gluon.validators.Validator
Determines that the argument is (or can be represented as) a float, and that it falls within the specified inclusive range. The comparison is made with native arithmetic.
The minimum and maximum limits can be None, meaning no lower or upper limit, respectively.
Example
Used as:
INPUT(_type='text', _name='name', requires=IS_FLOAT_IN_RANGE(0, 10)) >>> IS_FLOAT_IN_RANGE(1,5)('4') (4.0, None) >>> IS_FLOAT_IN_RANGE(1,5)(4) (4.0, None) >>> IS_FLOAT_IN_RANGE(1,5)(1) (1.0, None) >>> IS_FLOAT_IN_RANGE(1,5)(5.25) (5.25, 'enter a number between 1 and 5') >>> IS_FLOAT_IN_RANGE(1,5)(6.0) (6.0, 'enter a number between 1 and 5') >>> IS_FLOAT_IN_RANGE(1,5)(3.5) (3.5, None) >>> IS_FLOAT_IN_RANGE(1,None)(3.5) (3.5, None) >>> IS_FLOAT_IN_RANGE(None,5)(3.5) (3.5, None) >>> IS_FLOAT_IN_RANGE(1,None)(0.5) (0.5, 'enter a number greater than or equal to 1') >>> IS_FLOAT_IN_RANGE(None,5)(6.5) (6.5, 'enter a number less than or equal to 5') >>> IS_FLOAT_IN_RANGE()(6.5) (6.5, None) >>> IS_FLOAT_IN_RANGE()('abc') ('abc', 'enter a number')
-
class
gluon.validators.
IS_IMAGE
(extensions=('bmp', 'gif', 'jpeg', 'png'), maxsize=(10000, 10000), minsize=(0, 0), error_message='Invalid image')[source]¶ Bases:
gluon.validators.Validator
Checks if file uploaded through file input was saved in one of selected image formats and has dimensions (width and height) within given boundaries.
Does not check for maximum file size (use IS_LENGTH for that). Returns validation failure if no data was uploaded.
Supported file formats: BMP, GIF, JPEG, PNG.
Code parts taken from http://mail.python.org/pipermail/python-list/2007-June/617126.html
Parameters: - extensions – iterable containing allowed lowercase image file extensions
- extension of uploaded file counts as 'jpeg') ((‘jpg’) –
- maxsize – iterable containing maximum width and height of the image
- minsize – iterable containing minimum width and height of the image
Use (-1, -1) as minsize to pass image size check.
Examples
Check if uploaded file is in any of supported image formats:
INPUT(_type=’file’, _name=’name’, requires=IS_IMAGE())Check if uploaded file is either JPEG or PNG:
- INPUT(_type=’file’, _name=’name’,
- requires=IS_IMAGE(extensions=(‘jpeg’, ‘png’)))
Check if uploaded file is PNG with maximum size of 200x200 pixels:
- INPUT(_type=’file’, _name=’name’,
- requires=IS_IMAGE(extensions=(‘png’), maxsize=(200, 200)))
-
class
gluon.validators.
IS_IN_DB
(dbset, field, label=None, error_message='Value not in database', orderby=None, groupby=None, distinct=None, cache=None, multiple=False, zero='', sort=False, _and=None, left=None)[source]¶ Bases:
gluon.validators.Validator
Example
Used as:
INPUT(_type='text', _name='name', requires=IS_IN_DB(db, db.mytable.myfield, zero=''))
used for reference fields, rendered as a dropbox
-
class
gluon.validators.
IS_IN_SET
(theset, labels=None, error_message='Value not allowed', multiple=False, zero='', sort=False)[source]¶ Bases:
gluon.validators.Validator
Example
Used as:
INPUT(_type='text', _name='name', requires=IS_IN_SET(['max', 'john'],zero=''))
The argument of IS_IN_SET must be a list or set:
>>> IS_IN_SET(['max', 'john'])('max') ('max', None) >>> IS_IN_SET(['max', 'john'])('massimo') ('massimo', 'value not allowed') >>> IS_IN_SET(['max', 'john'], multiple=True)(('max', 'john')) (('max', 'john'), None) >>> IS_IN_SET(['max', 'john'], multiple=True)(('bill', 'john')) (('bill', 'john'), 'value not allowed') >>> IS_IN_SET(('id1','id2'), ['first label','second label'])('id1') # Traditional way ('id1', None) >>> IS_IN_SET({'id1':'first label', 'id2':'second label'})('id1') ('id1', None) >>> import itertools >>> IS_IN_SET(itertools.chain(['1','3','5'],['2','4','6']))('1') ('1', None) >>> IS_IN_SET([('id1','first label'), ('id2','second label')])('id1') # Redundant way ('id1', None)
-
class
gluon.validators.
IS_INT_IN_RANGE
(minimum=None, maximum=None, error_message=None)[source]¶ Bases:
gluon.validators.Validator
Determines that the argument is (or can be represented as) an int, and that it falls within the specified range. The range is interpreted in the Pythonic way, so the test is: min <= value < max.
The minimum and maximum limits can be None, meaning no lower or upper limit, respectively.
Example
Used as:
INPUT(_type='text', _name='name', requires=IS_INT_IN_RANGE(0, 10)) >>> IS_INT_IN_RANGE(1,5)('4') (4, None) >>> IS_INT_IN_RANGE(1,5)(4) (4, None) >>> IS_INT_IN_RANGE(1,5)(1) (1, None) >>> IS_INT_IN_RANGE(1,5)(5) (5, 'enter an integer between 1 and 4') >>> IS_INT_IN_RANGE(1,5)(5) (5, 'enter an integer between 1 and 4') >>> IS_INT_IN_RANGE(1,5)(3.5) (3.5, 'enter an integer between 1 and 4') >>> IS_INT_IN_RANGE(None,5)('4') (4, None) >>> IS_INT_IN_RANGE(None,5)('6') ('6', 'enter an integer less than or equal to 4') >>> IS_INT_IN_RANGE(1,None)('4') (4, None) >>> IS_INT_IN_RANGE(1,None)('0') ('0', 'enter an integer greater than or equal to 1') >>> IS_INT_IN_RANGE()(6) (6, None) >>> IS_INT_IN_RANGE()('abc') ('abc', 'enter an integer')
-
class
gluon.validators.
IS_IPV4
(minip='0.0.0.0', maxip='255.255.255.255', invert=False, is_localhost=None, is_private=None, is_automatic=None, error_message='Enter valid IPv4 address')[source]¶ Bases:
gluon.validators.Validator
Checks if field’s value is an IP version 4 address in decimal form. Can be set to force addresses from certain range.
IPv4 regex taken from: http://regexlib.com/REDetails.aspx?regexp_id=1411
Parameters: - minip –
lowest allowed address; accepts:
- str, eg. 192.168.0.1
- list or tuple of octets, eg. [192, 168, 0, 1]
- maxip – highest allowed address; same as above
- invert – True to allow addresses only from outside of given range; note that range boundaries are not matched this way
- is_localhost –
localhost address treatment:
- None (default): indifferent
- True (enforce): query address must match localhost address (127.0.0.1)
- False (forbid): query address must not match localhost address
- is_private – same as above, except that query address is checked against two address ranges: 172.16.0.0 - 172.31.255.255 and 192.168.0.0 - 192.168.255.255
- is_automatic – same as above, except that query address is checked against one address range: 169.254.0.0 - 169.254.255.255
Minip and maxip may also be lists or tuples of addresses in all above forms (str, int, list / tuple), allowing setup of multiple address ranges:
minip = (minip1, minip2, ... minipN) | | | | | | maxip = (maxip1, maxip2, ... maxipN)
Longer iterable will be truncated to match length of shorter one.
Examples
Check for valid IPv4 address:
INPUT(_type=’text’, _name=’name’, requires=IS_IPV4())Check for valid IPv4 address belonging to specific range:
- INPUT(_type=’text’, _name=’name’,
- requires=IS_IPV4(minip=‘100.200.0.0’, maxip=‘100.200.255.255’))
Check for valid IPv4 address belonging to either 100.110.0.0 - 100.110.255.255 or 200.50.0.0 - 200.50.0.255 address range:
- INPUT(_type=’text’, _name=’name’,
- requires=IS_IPV4(minip=(‘100.110.0.0’, ‘200.50.0.0’),
- maxip=(‘100.110.255.255’, ‘200.50.0.255’)))
Check for valid IPv4 address belonging to private address space:
INPUT(_type=’text’, _name=’name’, requires=IS_IPV4(is_private=True))Check for valid IPv4 address that is not a localhost address:
INPUT(_type=’text’, _name=’name’, requires=IS_IPV4(is_localhost=False))
>>> IS_IPV4()('1.2.3.4') ('1.2.3.4', None) >>> IS_IPV4()('255.255.255.255') ('255.255.255.255', None) >>> IS_IPV4()('1.2.3.4 ') ('1.2.3.4 ', 'enter valid IPv4 address') >>> IS_IPV4()('1.2.3.4.5') ('1.2.3.4.5', 'enter valid IPv4 address') >>> IS_IPV4()('123.123') ('123.123', 'enter valid IPv4 address') >>> IS_IPV4()('1111.2.3.4') ('1111.2.3.4', 'enter valid IPv4 address') >>> IS_IPV4()('0111.2.3.4') ('0111.2.3.4', 'enter valid IPv4 address') >>> IS_IPV4()('256.2.3.4') ('256.2.3.4', 'enter valid IPv4 address') >>> IS_IPV4()('300.2.3.4') ('300.2.3.4', 'enter valid IPv4 address') >>> IS_IPV4(minip='1.2.3.4', maxip='1.2.3.4')('1.2.3.4') ('1.2.3.4', None) >>> IS_IPV4(minip='1.2.3.5', maxip='1.2.3.9', error_message='Bad ip')('1.2.3.4') ('1.2.3.4', 'bad ip') >>> IS_IPV4(maxip='1.2.3.4', invert=True)('127.0.0.1') ('127.0.0.1', None) >>> IS_IPV4(maxip='1.2.3.4', invert=True)('1.2.3.4') ('1.2.3.4', 'enter valid IPv4 address') >>> IS_IPV4(is_localhost=True)('127.0.0.1') ('127.0.0.1', None) >>> IS_IPV4(is_localhost=True)('1.2.3.4') ('1.2.3.4', 'enter valid IPv4 address') >>> IS_IPV4(is_localhost=False)('127.0.0.1') ('127.0.0.1', 'enter valid IPv4 address') >>> IS_IPV4(maxip='100.0.0.0', is_localhost=True)('127.0.0.1') ('127.0.0.1', 'enter valid IPv4 address')
-
automatic
= (2851995648L, 2852061183L)¶
-
localhost
= 2130706433¶
-
numbers
= (16777216, 65536, 256, 1)¶
-
private
= ((2886729728L, 2886795263L), (3232235520L, 3232301055L))¶
-
regex
= <_sre.SRE_Pattern object at 0x1dba580>¶
- minip –
-
class
gluon.validators.
IS_IPV6
(is_private=None, is_link_local=None, is_reserved=None, is_multicast=None, is_routeable=None, is_6to4=None, is_teredo=None, subnets=None, error_message='Enter valid IPv6 address')[source]¶ Bases:
gluon.validators.Validator
Checks if field’s value is an IP version 6 address. First attempts to use the ipaddress library and falls back to contrib/ipaddr.py from Google (https://code.google.com/p/ipaddr-py/)
Parameters: - is_private – None (default): indifferent True (enforce): address must be in fc00::/7 range False (forbid): address must NOT be in fc00::/7 range
- is_link_local – Same as above but uses fe80::/10 range
- is_reserved – Same as above but uses IETF reserved range
- is_mulicast – Same as above but uses ff00::/8 range
- is_routeable – Similar to above but enforces not private, link_local, reserved or multicast
- is_6to4 – Same as above but uses 2002::/16 range
- is_teredo – Same as above but uses 2001::/32 range
- subnets – value must be a member of at least one from list of subnets
Examples
Check for valid IPv6 address:
INPUT(_type=’text’, _name=’name’, requires=IS_IPV6())Check for valid IPv6 address is a link_local address:
INPUT(_type=’text’, _name=’name’, requires=IS_IPV6(is_link_local=True))Check for valid IPv6 address that is Internet routeable:
INPUT(_type=’text’, _name=’name’, requires=IS_IPV6(is_routeable=True))Check for valid IPv6 address in specified subnet:
INPUT(_type=’text’, _name=’name’, requires=IS_IPV6(subnets=[‘2001::/32’])
>>> IS_IPV6()('fe80::126c:8ffa:fe22:b3af') ('fe80::126c:8ffa:fe22:b3af', None) >>> IS_IPV6()('192.168.1.1') ('192.168.1.1', 'enter valid IPv6 address') >>> IS_IPV6(error_message='Bad ip')('192.168.1.1') ('192.168.1.1', 'bad ip') >>> IS_IPV6(is_link_local=True)('fe80::126c:8ffa:fe22:b3af') ('fe80::126c:8ffa:fe22:b3af', None) >>> IS_IPV6(is_link_local=False)('fe80::126c:8ffa:fe22:b3af') ('fe80::126c:8ffa:fe22:b3af', 'enter valid IPv6 address') >>> IS_IPV6(is_link_local=True)('2001::126c:8ffa:fe22:b3af') ('2001::126c:8ffa:fe22:b3af', 'enter valid IPv6 address') >>> IS_IPV6(is_multicast=True)('2001::126c:8ffa:fe22:b3af') ('2001::126c:8ffa:fe22:b3af', 'enter valid IPv6 address') >>> IS_IPV6(is_multicast=True)('ff00::126c:8ffa:fe22:b3af') ('ff00::126c:8ffa:fe22:b3af', None) >>> IS_IPV6(is_routeable=True)('2001::126c:8ffa:fe22:b3af') ('2001::126c:8ffa:fe22:b3af', None) >>> IS_IPV6(is_routeable=True)('ff00::126c:8ffa:fe22:b3af') ('ff00::126c:8ffa:fe22:b3af', 'enter valid IPv6 address') >>> IS_IPV6(subnets='2001::/32')('2001::8ffa:fe22:b3af') ('2001::8ffa:fe22:b3af', None) >>> IS_IPV6(subnets='fb00::/8')('2001::8ffa:fe22:b3af') ('2001::8ffa:fe22:b3af', 'enter valid IPv6 address') >>> IS_IPV6(subnets=['fc00::/8','2001::/32'])('2001::8ffa:fe22:b3af') ('2001::8ffa:fe22:b3af', None) >>> IS_IPV6(subnets='invalidsubnet')('2001::8ffa:fe22:b3af') ('2001::8ffa:fe22:b3af', 'invalid subnet provided')
-
class
gluon.validators.
IS_IPADDRESS
(minip='0.0.0.0', maxip='255.255.255.255', invert=False, is_localhost=None, is_private=None, is_automatic=None, is_ipv4=None, is_link_local=None, is_reserved=None, is_multicast=None, is_routeable=None, is_6to4=None, is_teredo=None, subnets=None, is_ipv6=None, error_message='Enter valid IP address')[source]¶ Bases:
gluon.validators.Validator
Checks if field’s value is an IP Address (v4 or v6). Can be set to force addresses from within a specific range. Checks are done with the correct IS_IPV4 and IS_IPV6 validators.
Uses ipaddress library if found, falls back to PEP-3144 ipaddr.py from Google (in contrib).
Parameters: - minip – lowest allowed address; accepts: str, eg. 192.168.0.1 list or tuple of octets, eg. [192, 168, 0, 1]
- maxip – highest allowed address; same as above
- invert – True to allow addresses only from outside of given range; note that range boundaries are not matched this way
IPv4 specific arguments:
is_localhost: localhost address treatment:
- None (default): indifferent
- True (enforce): query address must match localhost address (127.0.0.1)
- False (forbid): query address must not match localhost address
is_private: same as above, except that query address is checked against two address ranges: 172.16.0.0 - 172.31.255.255 and 192.168.0.0 - 192.168.255.255
is_automatic: same as above, except that query address is checked against one address range: 169.254.0.0 - 169.254.255.255
is_ipv4: either:
- None (default): indifferent
- True (enforce): must be an IPv4 address
- False (forbid): must NOT be an IPv4 address
IPv6 specific arguments:
is_link_local: Same as above but uses fe80::/10 range
is_reserved: Same as above but uses IETF reserved range
is_mulicast: Same as above but uses ff00::/8 range
is_routeable: Similar to above but enforces not private, link_local, reserved or multicast
is_6to4: Same as above but uses 2002::/16 range
is_teredo: Same as above but uses 2001::/32 range
subnets: value must be a member of at least one from list of subnets
is_ipv6: either:
- None (default): indifferent
- True (enforce): must be an IPv6 address
- False (forbid): must NOT be an IPv6 address
Minip and maxip may also be lists or tuples of addresses in all above forms (str, int, list / tuple), allowing setup of multiple address ranges:
minip = (minip1, minip2, ... minipN) | | | | | | maxip = (maxip1, maxip2, ... maxipN)
Longer iterable will be truncated to match length of shorter one.
>>> IS_IPADDRESS()('192.168.1.5') ('192.168.1.5', None) >>> IS_IPADDRESS(is_ipv6=False)('192.168.1.5') ('192.168.1.5', None) >>> IS_IPADDRESS()('255.255.255.255') ('255.255.255.255', None) >>> IS_IPADDRESS()('192.168.1.5 ') ('192.168.1.5 ', 'enter valid IP address') >>> IS_IPADDRESS()('192.168.1.1.5') ('192.168.1.1.5', 'enter valid IP address') >>> IS_IPADDRESS()('123.123') ('123.123', 'enter valid IP address') >>> IS_IPADDRESS()('1111.2.3.4') ('1111.2.3.4', 'enter valid IP address') >>> IS_IPADDRESS()('0111.2.3.4') ('0111.2.3.4', 'enter valid IP address') >>> IS_IPADDRESS()('256.2.3.4') ('256.2.3.4', 'enter valid IP address') >>> IS_IPADDRESS()('300.2.3.4') ('300.2.3.4', 'enter valid IP address') >>> IS_IPADDRESS(minip='192.168.1.0', maxip='192.168.1.255')('192.168.1.100') ('192.168.1.100', None) >>> IS_IPADDRESS(minip='1.2.3.5', maxip='1.2.3.9', error_message='Bad ip')('1.2.3.4') ('1.2.3.4', 'bad ip') >>> IS_IPADDRESS(maxip='1.2.3.4', invert=True)('127.0.0.1') ('127.0.0.1', None) >>> IS_IPADDRESS(maxip='192.168.1.4', invert=True)('192.168.1.4') ('192.168.1.4', 'enter valid IP address') >>> IS_IPADDRESS(is_localhost=True)('127.0.0.1') ('127.0.0.1', None) >>> IS_IPADDRESS(is_localhost=True)('192.168.1.10') ('192.168.1.10', 'enter valid IP address') >>> IS_IPADDRESS(is_localhost=False)('127.0.0.1') ('127.0.0.1', 'enter valid IP address') >>> IS_IPADDRESS(maxip='100.0.0.0', is_localhost=True)('127.0.0.1') ('127.0.0.1', 'enter valid IP address')
>>> IS_IPADDRESS()('fe80::126c:8ffa:fe22:b3af') ('fe80::126c:8ffa:fe22:b3af', None) >>> IS_IPADDRESS(is_ipv4=False)('fe80::126c:8ffa:fe22:b3af') ('fe80::126c:8ffa:fe22:b3af', None) >>> IS_IPADDRESS()('fe80::126c:8ffa:fe22:b3af ') ('fe80::126c:8ffa:fe22:b3af ', 'enter valid IP address') >>> IS_IPADDRESS(is_ipv4=True)('fe80::126c:8ffa:fe22:b3af') ('fe80::126c:8ffa:fe22:b3af', 'enter valid IP address') >>> IS_IPADDRESS(is_ipv6=True)('192.168.1.1') ('192.168.1.1', 'enter valid IP address') >>> IS_IPADDRESS(is_ipv6=True, error_message='Bad ip')('192.168.1.1') ('192.168.1.1', 'bad ip') >>> IS_IPADDRESS(is_link_local=True)('fe80::126c:8ffa:fe22:b3af') ('fe80::126c:8ffa:fe22:b3af', None) >>> IS_IPADDRESS(is_link_local=False)('fe80::126c:8ffa:fe22:b3af') ('fe80::126c:8ffa:fe22:b3af', 'enter valid IP address') >>> IS_IPADDRESS(is_link_local=True)('2001::126c:8ffa:fe22:b3af') ('2001::126c:8ffa:fe22:b3af', 'enter valid IP address') >>> IS_IPADDRESS(is_multicast=True)('2001::126c:8ffa:fe22:b3af') ('2001::126c:8ffa:fe22:b3af', 'enter valid IP address') >>> IS_IPADDRESS(is_multicast=True)('ff00::126c:8ffa:fe22:b3af') ('ff00::126c:8ffa:fe22:b3af', None) >>> IS_IPADDRESS(is_routeable=True)('2001::126c:8ffa:fe22:b3af') ('2001::126c:8ffa:fe22:b3af', None) >>> IS_IPADDRESS(is_routeable=True)('ff00::126c:8ffa:fe22:b3af') ('ff00::126c:8ffa:fe22:b3af', 'enter valid IP address') >>> IS_IPADDRESS(subnets='2001::/32')('2001::8ffa:fe22:b3af') ('2001::8ffa:fe22:b3af', None) >>> IS_IPADDRESS(subnets='fb00::/8')('2001::8ffa:fe22:b3af') ('2001::8ffa:fe22:b3af', 'enter valid IP address') >>> IS_IPADDRESS(subnets=['fc00::/8','2001::/32'])('2001::8ffa:fe22:b3af') ('2001::8ffa:fe22:b3af', None) >>> IS_IPADDRESS(subnets='invalidsubnet')('2001::8ffa:fe22:b3af') ('2001::8ffa:fe22:b3af', 'invalid subnet provided')
-
class
gluon.validators.
IS_LENGTH
(maxsize=255, minsize=0, error_message='Enter from %(min)g to %(max)g characters')[source]¶ Bases:
gluon.validators.Validator
Checks if length of field’s value fits between given boundaries. Works for both text and file inputs.
Parameters: - maxsize – maximum allowed length / size
- minsize – minimum allowed length / size
Examples
Check if text string is shorter than 33 characters:
INPUT(_type='text', _name='name', requires=IS_LENGTH(32))
Check if password string is longer than 5 characters:
INPUT(_type='password', _name='name', requires=IS_LENGTH(minsize=6))
Check if uploaded file has size between 1KB and 1MB:
INPUT(_type='file', _name='name', requires=IS_LENGTH(1048576, 1024))
Other examples:
>>> IS_LENGTH()('') ('', None) >>> IS_LENGTH()('1234567890') ('1234567890', None) >>> IS_LENGTH(maxsize=5, minsize=0)('1234567890') # too long ('1234567890', 'enter from 0 to 5 characters') >>> IS_LENGTH(maxsize=50, minsize=20)('1234567890') # too short ('1234567890', 'enter from 20 to 50 characters')
-
class
gluon.validators.
IS_LIST_OF
(other=None, minimum=0, maximum=100, error_message=None)[source]¶ Bases:
gluon.validators.Validator
-
class
gluon.validators.
IS_LOWER
[source]¶ Bases:
gluon.validators.Validator
Converts to lower case:
>>> IS_LOWER()('ABC') ('abc', None) >>> IS_LOWER()('Ñ') ('\xc3\xb1', None)
-
class
gluon.validators.
IS_MATCH
(expression, error_message='Invalid expression', strict=False, search=False, extract=False, is_unicode=False)[source]¶ Bases:
gluon.validators.Validator
Example
Used as:
INPUT(_type='text', _name='name', requires=IS_MATCH('.+'))
The argument of IS_MATCH is a regular expression:
>>> IS_MATCH('.+')('hello') ('hello', None) >>> IS_MATCH('hell')('hello') ('hello', None) >>> IS_MATCH('hell.*', strict=False)('hello') ('hello', None) >>> IS_MATCH('hello')('shello') ('shello', 'invalid expression') >>> IS_MATCH('hello', search=True)('shello') ('shello', None) >>> IS_MATCH('hello', search=True, strict=False)('shellox') ('shellox', None) >>> IS_MATCH('.*hello.*', search=True, strict=False)('shellox') ('shellox', None) >>> IS_MATCH('.+')('') ('', 'invalid expression')
-
class
gluon.validators.
IS_EQUAL_TO
(expression, error_message='No match')[source]¶ Bases:
gluon.validators.Validator
Example
Used as:
INPUT(_type='text', _name='password') INPUT(_type='text', _name='password2', requires=IS_EQUAL_TO(request.vars.password))
The argument of IS_EQUAL_TO is a string:
>>> IS_EQUAL_TO('aaa')('aaa') ('aaa', None) >>> IS_EQUAL_TO('aaa')('aab') ('aab', 'no match')
-
class
gluon.validators.
IS_NOT_EMPTY
(error_message='Enter a value', empty_regex=None)[source]¶ Bases:
gluon.validators.Validator
Example
Used as:
INPUT(_type='text', _name='name', requires=IS_NOT_EMPTY()) >>> IS_NOT_EMPTY()(1) (1, None) >>> IS_NOT_EMPTY()(0) (0, None) >>> IS_NOT_EMPTY()('x') ('x', None) >>> IS_NOT_EMPTY()(' x ') ('x', None) >>> IS_NOT_EMPTY()(None) (None, 'enter a value') >>> IS_NOT_EMPTY()('') ('', 'enter a value') >>> IS_NOT_EMPTY()(' ') ('', 'enter a value') >>> IS_NOT_EMPTY()(' \n\t') ('', 'enter a value') >>> IS_NOT_EMPTY()([]) ([], 'enter a value') >>> IS_NOT_EMPTY(empty_regex='def')('def') ('', 'enter a value') >>> IS_NOT_EMPTY(empty_regex='de[fg]')('deg') ('', 'enter a value') >>> IS_NOT_EMPTY(empty_regex='def')('abc') ('abc', None)
-
class
gluon.validators.
IS_NOT_IN_DB
(dbset, field, error_message='Value already in database or empty', allowed_override=[], ignore_common_filters=False)[source]¶ Bases:
gluon.validators.Validator
Example
Used as:
INPUT(_type='text', _name='name', requires=IS_NOT_IN_DB(db, db.table))
makes the field unique
-
gluon.validators.
IS_NULL_OR
¶ alias of
IS_EMPTY_OR
-
class
gluon.validators.
IS_SLUG
(maxlen=80, check=False, error_message='Must be slug', keep_underscores=False)[source]¶ Bases:
gluon.validators.Validator
converts arbitrary text string to a slug:
>>> IS_SLUG()('abc123') ('abc123', None) >>> IS_SLUG()('ABC123') ('abc123', None) >>> IS_SLUG()('abc-123') ('abc-123', None) >>> IS_SLUG()('abc--123') ('abc-123', None) >>> IS_SLUG()('abc 123') ('abc-123', None) >>> IS_SLUG()('abc _123') ('abc-123', None) >>> IS_SLUG()('-abc-') ('abc', None) >>> IS_SLUG()('--a--b--_ -c--') ('a-b-c', None) >>> IS_SLUG()('abc&123') ('abc123', None) >>> IS_SLUG()('abc&123&def') ('abc123def', None) >>> IS_SLUG()('ñ') ('n', None) >>> IS_SLUG(maxlen=4)('abc123') ('abc1', None) >>> IS_SLUG()('abc_123') ('abc-123', None) >>> IS_SLUG(keep_underscores=False)('abc_123') ('abc-123', None) >>> IS_SLUG(keep_underscores=True)('abc_123') ('abc_123', None) >>> IS_SLUG(check=False)('abc') ('abc', None) >>> IS_SLUG(check=True)('abc') ('abc', None) >>> IS_SLUG(check=False)('a bc') ('a-bc', None) >>> IS_SLUG(check=True)('a bc') ('a bc', 'must be slug')
-
class
gluon.validators.
IS_STRONG
(min=None, max=None, upper=None, lower=None, number=None, entropy=None, special=None, specials='~!@#$%^&*()_+-=?<>, .:;{}[]|', invalid=' "', error_message=None, es=False)[source]¶ Bases:
object
Examples
Use as:
INPUT(_type='password', _name='passwd', requires=IS_STRONG(min=10, special=2, upper=2))
enforces complexity requirements on a field
>>> IS_STRONG(es=True)('Abcd1234') ('Abcd1234', 'Must include at least 1 of the following: ~!@#$%^&*()_+-=?<>,.:;{}[]|') >>> IS_STRONG(es=True)('Abcd1234!') ('Abcd1234!', None) >>> IS_STRONG(es=True, entropy=1)('a') ('a', None) >>> IS_STRONG(es=True, entropy=1, min=2)('a') ('a', 'Minimum length is 2') >>> IS_STRONG(es=True, entropy=100)('abc123') ('abc123', 'Entropy (32.35) less than required (100)') >>> IS_STRONG(es=True, entropy=100)('and') ('and', 'Entropy (14.57) less than required (100)') >>> IS_STRONG(es=True, entropy=100)('aaa') ('aaa', 'Entropy (14.42) less than required (100)') >>> IS_STRONG(es=True, entropy=100)('a1d') ('a1d', 'Entropy (15.97) less than required (100)') >>> IS_STRONG(es=True, entropy=100)('añd') ('a\xc3\xb1d', 'Entropy (18.13) less than required (100)')
-
class
gluon.validators.
IS_TIME
(error_message='Enter time as hh:mm:ss (seconds, am, pm optional)')[source]¶ Bases:
gluon.validators.Validator
Example
Use as:
INPUT(_type='text', _name='name', requires=IS_TIME())
understands the following formats hh:mm:ss [am/pm] hh:mm [am/pm] hh [am/pm]
[am/pm] is optional, ‘:’ can be replaced by any other non-space non-digit:
>>> IS_TIME()('21:30') (datetime.time(21, 30), None) >>> IS_TIME()('21-30') (datetime.time(21, 30), None) >>> IS_TIME()('21.30') (datetime.time(21, 30), None) >>> IS_TIME()('21:30:59') (datetime.time(21, 30, 59), None) >>> IS_TIME()('5:30') (datetime.time(5, 30), None) >>> IS_TIME()('5:30 am') (datetime.time(5, 30), None) >>> IS_TIME()('5:30 pm') (datetime.time(17, 30), None) >>> IS_TIME()('5:30 whatever') ('5:30 whatever', 'enter time as hh:mm:ss (seconds, am, pm optional)') >>> IS_TIME()('5:30 20') ('5:30 20', 'enter time as hh:mm:ss (seconds, am, pm optional)') >>> IS_TIME()('24:30') ('24:30', 'enter time as hh:mm:ss (seconds, am, pm optional)') >>> IS_TIME()('21:60') ('21:60', 'enter time as hh:mm:ss (seconds, am, pm optional)') >>> IS_TIME()('21:30::') ('21:30::', 'enter time as hh:mm:ss (seconds, am, pm optional)') >>> IS_TIME()('') ('', 'enter time as hh:mm:ss (seconds, am, pm optional)')ù
-
class
gluon.validators.
IS_UPLOAD_FILENAME
(filename=None, extension=None, lastdot=True, case=1, error_message='Enter valid filename')[source]¶ Bases:
gluon.validators.Validator
Checks if name and extension of file uploaded through file input matches given criteria.
Does not ensure the file type in any way. Returns validation failure if no data was uploaded.
Parameters: - filename – filename (before dot) regex
- extension – extension (after dot) regex
- lastdot – which dot should be used as a filename / extension separator: True means last dot, eg. file.png -> file / png False means first dot, eg. file.tar.gz -> file / tar.gz
- case – 0 - keep the case, 1 - transform the string into lowercase (default), 2 - transform the string into uppercase
If there is no dot present, extension checks will be done against empty string and filename checks against whole value.
Examples
Check if file has a pdf extension (case insensitive):
- INPUT(_type=’file’, _name=’name’,
- requires=IS_UPLOAD_FILENAME(extension=’pdf’))
Check if file has a tar.gz extension and name starting with backup:
- INPUT(_type=’file’, _name=’name’,
- requires=IS_UPLOAD_FILENAME(filename=’backup.*’, extension=’tar.gz’, lastdot=False))
Check if file has no extension and name matching README (case sensitive):
- INPUT(_type=’file’, _name=’name’,
- requires=IS_UPLOAD_FILENAME(filename=’^README$’, extension=’^$’, case=0)
-
class
gluon.validators.
IS_UPPER
[source]¶ Bases:
gluon.validators.Validator
Converts to upper case:
>>> IS_UPPER()('abc') ('ABC', None) >>> IS_UPPER()('ñ') ('\xc3\x91', None)
-
class
gluon.validators.
IS_URL
(error_message='Enter a valid URL', mode='http', allowed_schemes=None, prepend_scheme='http', allowed_tlds=None)[source]¶ Bases:
gluon.validators.Validator
Rejects a URL string if any of the following is true:
- The string is empty or None
- The string uses characters that are not allowed in a URL
- The string breaks any of the HTTP syntactic rules
- The URL scheme specified (if one is specified) is not ‘http’ or ‘https’
- The top-level domain (if a host name is specified) does not exist
(These rules are based on RFC 2616: http://www.faqs.org/rfcs/rfc2616.html)
This function only checks the URL’s syntax. It does not check that the URL points to a real document, for example, or that it otherwise makes sense semantically. This function does automatically prepend ‘http://‘ in front of a URL in the case of an abbreviated URL (e.g. ‘google.ca’).
If the parameter mode=’generic’ is used, then this function’s behavior changes. It then rejects a URL string if any of the following is true:
- The string is empty or None
- The string uses characters that are not allowed in a URL
- The URL scheme specified (if one is specified) is not valid
(These rules are based on RFC 2396: http://www.faqs.org/rfcs/rfc2396.html)
The list of allowed schemes is customizable with the allowed_schemes parameter. If you exclude None from the list, then abbreviated URLs (lacking a scheme such as ‘http’) will be rejected.
The default prepended scheme is customizable with the prepend_scheme parameter. If you set prepend_scheme to None then prepending will be disabled. URLs that require prepending to parse will still be accepted, but the return value will not be modified.
IS_URL is compatible with the Internationalized Domain Name (IDN) standard specified in RFC 3490 (http://tools.ietf.org/html/rfc3490). As a result, URLs can be regular strings or unicode strings. If the URL’s domain component (e.g. google.ca) contains non-US-ASCII letters, then the domain will be converted into Punycode (defined in RFC 3492, http://tools.ietf.org/html/rfc3492). IS_URL goes a bit beyond the standards, and allows non-US-ASCII characters to be present in the path and query components of the URL as well. These non-US-ASCII characters will be escaped using the standard ‘%20’ type syntax. e.g. the unicode character with hex code 0x4e86 will become ‘%4e%86’
Parameters: - error_message – a string, the error message to give the end user if the URL does not validate
- allowed_schemes – a list containing strings or None. Each element is a scheme the inputed URL is allowed to use
- prepend_scheme – a string, this scheme is prepended if it’s necessary to make the URL valid
Code Examples:
INPUT(_type='text', _name='name', requires=IS_URL()) >>> IS_URL()('abc.com') ('http://abc.com', None) INPUT(_type='text', _name='name', requires=IS_URL(mode='generic')) >>> IS_URL(mode='generic')('abc.com') ('abc.com', None) INPUT(_type='text', _name='name', requires=IS_URL(allowed_schemes=['https'], prepend_scheme='https')) >>> IS_URL(allowed_schemes=['https'], prepend_scheme='https')('https://abc.com') ('https://abc.com', None) INPUT(_type='text', _name='name', requires=IS_URL(prepend_scheme='https')) >>> IS_URL(prepend_scheme='https')('abc.com') ('https://abc.com', None) INPUT(_type='text', _name='name', requires=IS_URL(mode='generic', allowed_schemes=['ftps', 'https'], prepend_scheme='https')) >>> IS_URL(mode='generic', allowed_schemes=['ftps', 'https'], prepend_scheme='https')('https://abc.com') ('https://abc.com', None) >>> IS_URL(mode='generic', allowed_schemes=['ftps', 'https', None], prepend_scheme='https')('abc.com') ('abc.com', None)
@author: Jonathan Benn
-
class
gluon.validators.
IS_JSON
(error_message='Invalid json', native_json=False)[source]¶ Bases:
gluon.validators.Validator
Example
Used as:
INPUT(_type='text', _name='name', requires=IS_JSON(error_message="This is not a valid json input") >>> IS_JSON()('{"a": 100}') ({u'a': 100}, None) >>> IS_JSON()('spam1234') ('spam1234', 'invalid json')