WEB2PY 2.9 Cheat Sheet Database Abstraction Layer Forms http://www.web2py.com db = DAL('sqlite://storage.sqlite',pool_size=1) form = SQLFORM(db.thing,record=None) db.define_table('thing', Field('name','string')) form = SQLFORM.factory(Field('name')) (no db) URL Parsing id = db.thing.insert(name='max') form = SQLFORM.dictform(d) (for d={...}) http://host:port/admin (admin interface) query = db.thing.name.contains('m')&(db.thing.id==1) form = SQLFORM(db.thing).process() http://host:port/app/static/file (app static file) db(query).update(name='max') if form.accepted: ... http://host:port/app/appadmin (database interface) db(query).delete() elif form.errors: ... http://host:port/app/c/f(.e)/!args?vars things = db(query).select(db.thing.ALL, app → request.application orderby=~db.thing.name, groupby=db.thing.id c → request.controller dictinct=True, cache=(cache.ram,60)) Grids f → request.function thing = db.thing(id) or redirect(URL('error')) grid = SQLFORM.grid(query) e → request.extension thing.update_record(name='max') grid = SQLFORM.smartgrid(table, linked_tables=[]) args → request.args (list) things.export_to_csv_file(open(filename,'wb')) vars → request.vars (dict) db.thing.import_from_csv_file(open(filename,'rb')) SQLFORM.grid( query, fields=None, field_id=None, left=None, ’c/f.e’ → response.view Field Types host → request.env.http_host headers={}, orderby=None, searchable=True, port → request.env.http_port string, text, boolean, integer, double, decimal(n,m), date, sortable=True, paginate=20, deletable=True, time, datetime, password, upload, blob, json, list:string, editable=True, details=True, selectable=None, Global Objects list:integer, reference table, list:reference table create=True, csv=True, links=None, ...) request.obj Field Attributes Field(fieldname, type='string', length=None, Auth application, controller, function, now, client, is_local, default=None, required=False, requires=None, @auth.requires_login() is_https, ajax, args, vars, get_vars, post_vars, ondelete='CASCADE', notnull=False, unique=False, @auth.requires_membership('groupname') env.request_method, env.path_info, env.query_string, uploadfield=True, widget=None, label=None, @auth.requires_premission('edit','tablename',id) env.http_*, env.wsgi_* comment=None, writable=True, readable=True, @auth.requires(condition) auth.(has|add|del)_membership(...) response.obj update=None, authorize=None, autodelete=False, represent=None, uploadfolder=None, auth.(has|add|del)_permission(...) status=200, view='filename.html', flash='flash me', uploadseparate=False, compute=None, ...) js = 'alert("run me")', download(request,db), Full Example stream(file), render(template,**vars) Validators models/db.py CLEANUP, CRYPT, IS_ALPHANUMERIC, IS_DATE, IS_DATETIME, from gluon.tools import * session.obj IS_DATETIME_IN_RANGE, IS_DATE_IN_RANGE, db = DAL('sqlite://storage.sqlite') connect(request,response,db,separate=False), IS_DECIMAL_IN_RANGE, IS_EMAIL, IS_EMPTY_OR, IS_EQUAL_TO, auth = Auth(db) flash, secure(), forget(), _unlock(response) IS_EXPR, IS_FLOAT_IN_RANGE, IS_GENERIC_URL, IS_HTTP_URL, auth.define_tables() IS_IMAGE, IS_INT_IN_RANGE, IS_IN_DB, IS_IN_SET, db.define_table('thing', cache IS_IN_SUBSET, IS_IPV4, IS_LENGTH, IS_LIST_OF, IS_LOWER, Field('name',requires=IS_NOT_EMPTY()), auth.signature) @cache('key',3600,cache.ram) IS_MATCH, IS_NOT_EMPTY, IS_NOT_IN_DB, IS_NULL_OR, IS_SLUG, auth.enable_record_versioning(db) # for full db auditing @cache('key',3600,cache.disk) IS_STRONG, IS_TIME, IS_UPLOAD_FILENAME, IS_UPPER, IS_URL cache.ram.clear(regex='k.*') controllers/default.py Helpers def index(): return auth.wiki() # embed a wiki T (internationalization) A, B, BEAUTIFY, BODY, BR, CAT, CENTER, CODE, COL, COLGROUP, def download(): return response.download(request,db) DIV, EM, EMBED, FIELDSET, FORM, H1, H2, H3, H4, H5, H6, HEAD, HR, def user(): return dict(form=auth) # login/etc. T('hello %(key)s',dict(key='thing')) HTML, I, IFRAME, IMG, INPUT, LABEL, LEGEND, LI, LINK, MARKMIN, T.current_languages = ['en'] (no translate) MENU, META, OBJECT, ON, OL, OPTGROUP, OPTION, P, PRE, SCRIPT, T.force('en') (use languages/en.py) @auth requires_login() SELECT, SPAN, STYLE, TABLE, TAG, TBODY, TD, TEXTAREA, TFOOT, def manage_things(): # access you data TH, THEAD, TITLE, TR, TT, UL, XHTML, XML URL, redirect, and HTTP grid = SQLFORM.grid(db.thing.created_by==auth.user.id) DIV(SPAN('hello'),_id='myid',_class='myclass') return locals() URL('function') A('link',_href=URL(...)) URL('controller','function') SPAN(A('link',callback=URL(...),delete='span')) views/default/manage things.html URL('app','controller','function') TABLE(*[TR(TD(item)) for item in [...]]) {{extend 'layout.html'}} URL('function',args=[...],vars={...}) div = DIV(SPAN('hello',_id='x'))