Free and open source full-stack enterprise framework for agile development of secure database-driven web-based applications, written and programmable in Python.

Related tags

web2py
Overview

Readme

web2py is a free open source full-stack framework for rapid development of fast, scalable, secure and portable database-driven web-based applications.

It is written and programmable in Python. LGPLv3 License

Learn more at http://web2py.com

Google App Engine deployment

cp examples/app.yaml ./
cp handlers/gaehandler.py ./

Then edit ./app.yaml and replace "yourappname" with yourappname.

Important reminder about this GIT repo

An important part of web2py is the Database Abstraction Layer (DAL). In early 2015 this was decoupled into a separate code-base (PyDAL). In terms of git, it is a sub-module of the main repository.

The use of a sub-module requires a one-time use of the --recursive flag for git clone if you are cloning web2py from scratch.

git clone --recursive https://github.com/web2py/web2py.git

If you have an existing repository, the commands below need to be executed at least once:

git submodule update --init --recursive

If you have a folder gluon/dal you must remove it:

rm -r gluon/dal

PyDAL uses a separate stable release cycle to the rest of web2py. PyDAL releases will use a date-naming scheme similar to Ubuntu. Issues related to PyDAL should be reported to its separate repository.

Documentation (readthedocs.org)

Docs Status

Tests

Build Status MS Build Status Coverage Status

Installation Instructions

To start web2py there is NO NEED to install it. Just unzip and do:

python web2py.py

That's it!!!

web2py directory structure

project/
    README
    LICENSE
    VERSION                    > this web2py version
    web2py.py                  > the startup script
    anyserver.py               > to run with third party servers
    ...                        > other handlers and example files
    gluon/                     > the core libraries
        packages/              > web2py submodules
          dal/
        contrib/               > third party libraries
        tests/                 > unittests
    applications/              > are the apps
        admin/                 > web based IDE
            ...
        examples/              > examples, docs, links
            ...
        welcome/               > the scaffolding app (they all copy it)
            ABOUT
            LICENSE
            models/
            views/
            controllers/
            sessions/
            errors/
            cache/
            static/
            uploads/
            modules/
            cron/
            tests/
        ...                    > your own apps
    examples/                  > example config files, mv .. and customize
    extras/                    > other files which are required for building web2py
    scripts/                   > utility and installation scripts
    handlers/
        wsgihandler.py         > handler to connect to WSGI
        ...                    > handlers for Fast-CGI, SCGI, Gevent, etc
    site-packages/             > additional optional modules
    logs/                      > log files will go in there
    deposit/                   > a place where web2py stores apps temporarily

Issues?

Report issues at https://github.com/web2py/web2py/issues

Issues
  • few lib2to3 fixes

    few lib2to3 fixes

    A lot of lib2to3 fixes.

    opened by ilvalle 48
  • Possible security bug in default mySQL/web2py setup

    Possible security bug in default mySQL/web2py setup

    Not sure where to report this: don't want to disclose too much, but the hole is such an obvious one that I might just have misunderstood the web2py syntax. Where should I report so that it is not public?

    opened by hyanwong 38
  • parameter of ajax put request is empty in Python 3

    parameter of ajax put request is empty in Python 3

    I tested the latest version 2.15.2 and I've got a problem when accessing ajax post parameters with web2py under Python 3.

    The client sends a PUT request using jquery like this: $.ajax('<url>', { data: JSON.stringify({ outputFormat: 'pdf' }), type: "PUT", contentType: "application/json", success: function(data) { alert('success'); }, error: function(jqXHR, textStatus, errorThrown) { alert('error'); } });

    in the controller I access the parameter output_format = request.vars.outputFormat

    when using Python 2.7 the variable output_format is set to 'pdf' as expected. When using Python 3.5 the variable is None.

    opened by alhman 24
  • scheduler.queue_task() is broken by validation

    scheduler.queue_task() is broken by validation

    This used to work, but now even the example in the book doesn't work.

    >>> scheduler.queue_task('demo1', [1,2])
    <Row {'errors': {'status': 'Value not allowed', 'start_time': 'Enter date and time as 1963-08-28 14:30:59', 'period': 'Enter an integer greater than or equal to 0', 'sync_output': 'Enter an integer greater than or equal to 0
    ', 'timeout': 'Enter an integer greater than or equal to 1', 'application_name': 'Enter a value', 'retry_failed': 'Enter an integer greater than or equal to -1', 'repeats': 'Enter an integer greater than or equal to 0'}, 'id
    ': None, 'uuid': None}>
    
    
    opened by kjkuan 23
  • Auth refactor

    Auth refactor

    Extracted many methods into a base class for more generic auth mechanisms.

    Partially addresses #1526 Includes a solution for IS_LOWER and IS_UPPER validator problems I mentioned in #1353

    opened by leonelcamara 21
  • quoting of tablenames and field names

    quoting of tablenames and field names

    Better quoting for sql objects.

    opened by michele-comitini 19
  • After updating from 2.18.1 to 2.18.2 the session.flash messages all show as b'<message>'

    After updating from 2.18.1 to 2.18.2 the session.flash messages all show as b''

    Describe the bug After updating from 2.18.1 to 2.18.2 the session.flsh messages all show as b''

    To Reproduce Just login on any app that shows session.flash. The 'Hello World' message from the welcome app uses response.flash and not session.flash and thus it does not show the problem.

    Desktop (please complete the following information): Windows 7 Pro x64 w/SP1 + all upgrades Firefox 65.0.1 x64 Python 3.7.1 x86

    opened by jcrmatos 18
  • load with ajax=false ignored if url parameter set

    load with ajax=false ignored if url parameter set

    {{=LOAD(c='referee', f='grid.load', ajax=False, ajax_trap=True, vars=dict(customer=id), target='referee')}} {{=LOAD(url=URL(c='referee2', f='grid.load', vars=dict(customer=id)), ajax=False, ajax_trap=True, target='referee2')}}

    referee2 is requested with ajax=True despite the parameter ajax=False.

    opened by simonm3 18
  • Can't define referenced table after it's referencing from web2py v2.9.3

    Can't define referenced table after it's referencing from web2py v2.9.3

    From d.bu..._at_gmail.com on March 08, 2014 12:14:54

    What steps will reproduce the problem? 1. Define referenced table after it's referencing 2. Set lazy_tables=False (means don't activate lazy_tables) 3. Call any app url What is the expected output? What do you see instead? In web2py v2.8.2 everything is fine - you see the controller's result. From version 2.9.3 (including 2.9.4) you see only "KeyError: 'Cannot resolve reference ... in ... definition'" What version of the product are you using? On what operating system? Ubuntu server 12.04 / Ubuntu desktop 13.10; web2py v2.9.4 Please provide any additional information below. Sample error log: Traceback (most recent call last): File "/home/donatas/web2py/gluon/restricted.py", line 217, in restricted exec ccode in environment File "/home/donatas/web2py/applications/welcome/models/db.py", line 87, in Field('subject_id', 'reference subject') File "/home/donatas/web2py/gluon/dal.py", line 8223, in define_table table = self.lazy_define_table(tablename,fields,*args) File "/home/donatas/web2py/gluon/dal.py", line 8260, in lazy_define_table polymodel=polymodel) File "/home/donatas/web2py/gluon/dal.py", line 925, in create_table raise KeyError('Cannot resolve reference %s in %s definition' % (referenced, table._tablename)) KeyError: 'Cannot resolve reference subject in contract definition'

    Original issue: http://code.google.com/p/web2py/issues/detail?id=1896

    imported Priority-Medium bug DAL 
    opened by niphlod 17
  • fix issue#1261: security issue: gluon.tools.Expose will follow symlinks

    fix issue#1261: security issue: gluon.tools.Expose will follow symlinks

    opened by chenl 17
  • SQLFORM.grid() not allowing search in Fields readable=False

    SQLFORM.grid() not allowing search in Fields readable=False

    Hi there!

    Describe the bug

    SQLFORM.grid() does not allow to search in Fields that are configured with readable=False.

    In my case, I load such Fields to load their values for the represent member of other Fields.

    To Reproduce

    Steps to reproduce the behavior:

    1. Define a table as in the example below. Make sure it is not empty.
    2. Make a page using this table and SQLFORM.grid().
    3. Try to search a value / a substring from the hidden column. It will not work.

    Expected behavior

    Entering a substring belonging to the hidden and searchable Field should yield results. Also I should see the field in the first combo box of the search area.

    Screenshots

    No screenshot is needed here, I suppose.

    Desktop (please complete the following information):

    • OS: Debian 10
    • Browser Firefox 78

    Additional context

    In a list of companies, I wanted to show their previous names as well as their current name, but without showing the semicolon-separated list of old names.

    This implies loading old names, but without showing the column.

    I had to define my old names field as

    Field("old_names", "text", length=1023, label=SPAN(), represent=(lambda old_names, row: ""))
    

    instead of

    Field("old_names", "text", length=1023, readable=False, searchable=True)
    

    Preview:

    def name_represent(name: str, row_sql: Row):
        display = name
        if "old_names" in row_sql:
            old_names = row_sql["old_names"]  # type: str
            if old_names:
                display = SPAN(
                    name,
                    _title="Old names:\n" + "\n".join(old_names.split(";")),
                    _style="cursor:help;"
                )
        return display
    
    db_gestion.define_table("client",
        # ...
        Field("name", "string", length=51, represent=name_represent),
        # ...
        Field("old_names", "text", length=1023, label=SPAN(), represent=(lambda old_names, row: "")),
        migrate=False,fake_migrate=False
    )
    
        fields = [
            table_client.name,
            table_client.old_names,  # only as tooltip on name
            # ...
        ]
        request.args[:] = ()
        grid = SQLFORM.grid(
            query,
            fields=fields,
            links=[lambda row: A('Détail', _href=URL("fiche", args=(row.id,)))],
            paginate=50,
            maxtextlength=50,
            details=False,
            deletable=False,
            editable=False,
            create=False,
            csv=False,
            orderby=table_client.name,
            args=[],
        )
    

    End

    Thank you, Momo :heart:

    opened by EstevanTH 0
  • web2py appears to inhibit concurrent processing of asyncio based module: python-kasa

    web2py appears to inhibit concurrent processing of asyncio based module: python-kasa

    Describe the bug I am developing a simple home automation page that uses python-kasa to manipulate TP-Link Kasa light switches. Kasa uses asyncio in order to parallelize the device IO communications.

    My page works successfully once upon immediate start of the web2py rocket server. On the second and subsequent refreshes, the concurrent device queries appear to run sequentially. A scan of all device states that initially takes 1.5 seconds takes 6+ seconds.

    If I reproduce the logic as a stand-alone program, it always runs concurrently.

    Is there anything in the web2py rocket server that may inhibit asyncio? Again the first execution of the code runs concurrently, but the second run executes sequentially.

    Use of logging debug statements confirms that the asyncio.gather() concurrently starts all the tasks. When the logic does execute concurrently, the log shows the each update task completing when it finishes. On subsequent runs, the task returns do not happen until they all complete.

    To Reproduce The psuedo-logic:

    models > async def SmartDevice-update-wrapper():

    1. start_time = time.time()
    2. logger.info("Query device {} state start {}".format(smartdevice.host,time.time()))
    3. await smartdevice.update()
    4. logger.info("Query device {} state stop {}".format(smartdevice.host,time.time()))
    5. logger.info("Query device {} state took {}".format(smartdevice.host,time.time() - start_time))

    models > async def klights():

    1. retrieve list of device IP addresses from DB.
    2. create list of kasa SmartDevice-update-wrapper instances using IP addresses.
    3. await asyncio.gather(*list-of-SmartDevices)
    4. return list of SmartDevice states

    controllers > def lights()

    1. devices = asyncio.run(klights())
    2. format page results

    Expected behavior The asyncio.gather(*list-of-SmartDevices) executes the SmartDevice update function concurrently

    Actual behavior The asyncio.gather(*list-of-SmartDevices) executes the SmartDevice update function sequentially on the refresh of the page

    Desktop (please complete the following information): Version 2.21.1-stable+timestamp.2020.11.27.18.21.43 (Running on Rocket 1.2.6, Python 3.7.3) Raspbian GNU/Linux 10 (buster) armv7l 5.10.60-v7+ #1449 SMP Wed Aug 25 15:00:01 BST 2021 Raspberry Pi 2 Model B Rev 1.1 python3 web2py.py --no_gui --ip 0.0.0.0 -d pidfile -a *******

    opened by pcwalden 1
  • CSV Import Fails under Python 3

    CSV Import Fails under Python 3

    Describe the bug On web2py 2.21.1-stable+timestamp.2020.11.28.04.10.44 (current as of today) under Python Python 3.8.10, a simple CSV import fails with the following error in a flash message: "Unable to parse CSV file - iterator should return strings not bytes. Did you open the file in text mode?"

    To Reproduce Download current web2py zip for Python 3. Unzip, fire up under Python 3, define simple table using default db setup (e.g. SQLite) Go to db admin, select new table, use DBA import facility.

    Screenshots Selection_002

    Desktop (please complete the following information):

    • OS: Ubuntu 20.04.3
    • Browser Chrome 94

    Additional context Googling for the problem I see that it is a known issue and fixes are suggested, but: -

    • The issue remains in the current version.
    • The fixes are producing unexpected results for me.
    opened by glimmung 2
  • html in response.flash no longer works

    html in response.flash no longer works

    In web2py 2.21.1 response.flash = XML("<b>bold</b> test") is rendered as: <b>bold</b> test instead of: bold test

    opened by limo49 0
  • DoS in SSL mode

    DoS in SSL mode

    Describe the bug rocket's accept loop is blocked while new connection does handshake

    To Reproduce Steps to reproduce the behavior:

    1. python web2py.py -c certificate.pem -k privatekey.pem -v -e
    2. run nc localhost 8000 and do nothing
    3. try to connect from other terminal/client: server is not accepting connections until you terminate nc

    Expected behavior web2py should accept/handle new connections independently of one connections handshake issues.

    opened by nfedera 1
  • Web2Py2.7 Wrong time after changing system clock GMT to UTC

    Web2Py2.7 Wrong time after changing system clock GMT to UTC

    Using web2py2.7, I changed the system time in UTC (1 hour difference from the original time) and executing the now () function to get the time, I was returned the time corresponding to before the change of the system clock. Anyone have any idea why? The behaviour was "fixed" restarting web2py

    opened by Tenebor 0
  • add python3 logging

    add python3 logging

    Close #2395

    opened by icreator 1
  • add python3 loggin system

    add python3 loggin system

    Use import logging.config

    and use private/logconfig.ini

    opened by icreator 0
  • fix 0E-8.00 in appadmin

    fix 0E-8.00 in appadmin

    Describe the bug

    appadmin/update/db/table_name/9#

    db.define_table(.....

    Field('balance', 'decimal(16,8)', default = Decimal('0.0'), comment='current balance'),

    and by default value is 0E-8.00
    and when AD new Record - it rise error:
    image

    Desktop (please complete the following information):

    • Browser - Chrome
    opened by icreator 0
  • add links to Chapter 13: Deployment recipes

    add links to Chapter 13: Deployment recipes

    Pleas here:
    http://web2py.com/books/default/chapter/29/13/deployment-recipes?search=uwsgi-emperor#Linux-and-Unix

    add links for quick install on:

    https://github.com/web2py/web2py/tree/master/scripts - as See last scripts

    and link for Nginx in http://web2py.com/books/default/chapter/29/13/deployment-recipes?search=uwsgi-emperor#Nginx

    opened by icreator 0
Releases(2.19.1)
  • R-2.17.1(Aug 6, 2018)

  • R-2.11.2(Jun 12, 2015)

    Many small but significative improvements and bug fixes

    WARNING: DO NOT DOWNLOAD RELEASES FROM THIS GITHUB PAGE. DOWNLOAD THEM FROM THE web2py.com PAGE. THE GITHUB ONES DO NOT CONTAIN SUBMODULES.

    Source code(tar.gz)
    Source code(zip)
  • R-2.10.3(Apr 2, 2015)

    WARNING: DO NOT DOWNLOAD RELEASES FROM THIS GITHUB PAGE. DOWNLOAD THEM FROM THE web2py.com PAGE. THE GITHUB ONES DO NOT CONTAIN SUBMODULES.

    • welcome app defaults to Bootstrap 3
    • DAL -> pyDAL (thanks Giovanni, Niphlod, Paolo)
      • new modular dal
      • fixed problems with GAE support
      • moved to full NDB support
      • improved connection pooling logic
    • optional cache.ram.max_ram_utilization = 90 (experimental)
    • improved cache.disk logic (thanks Niphlod and Leonel)
    • lots of pep8 improvements, thanks Richard
    • added support for email attchments when auth.settings.server='gae'
    • fixed app.yaml.example for GAE
    • fixed many small issues
    • many many more tests (thanks Giovanni, Niphlod, Paolo)
    • upgrading static libraries (bootstrap, codemirror, jquery, etc)

    WARNING: DO NOT DOWNLOAD RELEASES FROM THIS GITHUB PAGE. DOWNLOAD THEM FROM THE web2py.com PAGE. THE GITHUB ONES DO NOT CONTAIN SUBMODULES.

    Source code(tar.gz)
    Source code(zip)
  • R-2.10.2(Apr 1, 2015)

    WARNING: DO NOT DOWNLOAD RELEASES FROM THIS GITHUB PAGE. DOWNLOAD THEM FROM THE web2py.com PAGE. THE GITHUB ONES DO NOT CONTAIN SUBMODULES.

    • welcome app defaults to Bootstrap 3
    • DAL -> pyDAL (thanks Giovanni, Niphlod, Paolo)
      • new modular dal
      • fixed problems with GAE support
      • moved to full NDB support
      • improved connection pooling logic
    • optional cache.ram.max_ram_utilization = 90 (experimental)
    • improved cache.disk logic (thanks Niphlod and Leonel)
    • lots of pep8 improvements, thanks Richard
    • added support for email attchments when auth.settings.server='gae'
    • fixed app.yaml.example for GAE
    • fixed many small issues
    • many many more tests (thanks Giovanni, Niphlod, Paolo)
    • upgrading static libraries (bootstrap, codemirror, jquery, etc)

    WARNING: DO NOT DOWNLOAD RELEASES FROM THIS GITHUB PAGE. DOWNLOAD THEM FROM THE web2py.com PAGE. THE GITHUB ONES DO NOT CONTAIN SUBMODULES.

    Source code(tar.gz)
    Source code(zip)
  • R-2.10.1(Apr 1, 2015)

    • welcome app defaults to Bootstrap 3
    • DAL -> pyDAL (thanks Giovanni, Niphlod, Paolo)
      • new modular dal
      • fixed problems with GAE support
      • moved to full NDB support
      • improved connection pooling logic
    • optional cache.ram.max_ram_utilization = 90 (experimental)
    • improved cache.disk logic (thanks Niphlod and Leonel)
    • lots of pep8 improvements, thanks Richard
    • added support for email attchments when auth.settings.server='gae'
    • fixed app.yaml.example for GAE
    • fixed many small issues
    • many many more tests (thanks Giovanni, Niphlod, Paolo)
    • upgrading static libraries (bootstrap, codemirror, jquery, etc)
    Source code(tar.gz)
    Source code(zip)
  • R-2.9.12(Jan 18, 2015)

    • Tornado HTTPS support, thanks Diego
    • Modular DAL, thanks Giovanni
    • Added coverage support, thanks Niphlod
    • More tests, thanks Niphlod and Paolo Valleri
    • Added support for show_if in readonly sqlform, thanks Paolo
    • Improved scheduler, thanks Niphlod
    • Email timeout support
    • Made web2py's custom_import work with circular imports, thanks Jack Kuan
    • Added Portuguese, Catalan, and Burmese translations
    • Allow map_hyphen to work for application names, thanks Tim Nyborg
    • New module appconfig.py, thanks Niphlod
    • Added geospatial support to Teradata adaptor, thanks Andrew Willimott
    • Many bug fixes
    Source code(tar.gz)
    Source code(zip)
  • R-2.9.10(Sep 15, 2014)

    • fixed a typo in the license of some login_methods code. It is now LGPL consistently with the rest of the web2py code. This change applied to all previous web2py versions.
    • support for SAML2 (with pysaml2)
    • Sphinx documentation (thanks Niphlod)
    • improved scheduler (thanks Niphlod)
    • increased security
    • postgres support for "INSERT ... RETURING ..."
    • ldap support for Certificate Authority (thanks Maggs and Shane)
    • improved support for S/Mime X.509 (thanks Gyuris)
    • better welcome app
    • support for Collection+JSON Hypermedia API (RESTful self documenting API)
    • jQuery 1.11
    • codemirror 4.0.3
    • support for the new janrain API
    • better cache.disk()
    • new "web2py.py -G config" to make GAE configuration easier
    • many small bug fixes
    Source code(tar.gz)
    Source code(zip)
  • R-2.9.5(Apr 7, 2014)

  • R-2.9.4(Mar 13, 2014)

    • jquery 1.11
    • codemirror 3.21, thanks Paolo Valleri
    • fixed security issue with sessions in database, thanks Nathan Humphreys
    • fixed security issue with persistant data in session, thanks Kiran
    • fixed security issue with redirect after expired login, thanks André Kablu
    • cleaner DAL and rname integration, thanks niphlod and Michele
    • added mongodb and imap tests for dal, thanks Alan
    • NoSQL dal tests, thanks Alan
    • better docstrings, thanks Niphlod
    • allow URL(...,language=...) with parametric router, thanks Jonathan
    • allow non-expiration of gae-memcache, thanks crimsoncantab
    • MARKMIN(...,_class='...'), thanks Luca
    • better transliteration in building slugs
    • autolink emails
    • new Janrain API, thanks PeterQ2
    • enable admin app for GAE (experimental), thanks Alan
    • many bug fixes
    • invalidate function in web2py.js, thanks Paolo
    • DAL(...,adapter_args=dict(engine='MyISAM'))
    • todolist panel in admin editor, thanks Paolo Valleri
    Source code(tar.gz)
    Source code(zip)
  • R-2.8.2(Dec 9, 2013)

    • no more winservice (use nssm instead)
    • better imap support in DAL
    • db().select().as_tree()
    • bootstrap 2.3.2
    • codemirror 3.19
    • improved mongoDB support, thanks Alan
    • support for wiki custom render function
    • Wiki(...groups=['x','y']) allows bypassing default permissions
    • fixed websocket_messaging.py to support newer Tornado
    • NDB support for GAE, thanks Quint
    • fixed major concurrecy issue with MEMDB
    • blocked generic.jsonp for security reasons
    • many bug fixes, thanks Niphlod, Michele, Anthony, Tim, and many others.
    Source code(tar.gz)
    Source code(zip)
  • R-2.7.4(Oct 15, 2013)

  • R-2.7.1(Oct 5, 2013)

    • jQuery 1.10.2
    • codemirror 3.18, thanks Paolo
    • namespaces in T("Welcome", ns="namespace"), thanks jamarcer (experimental)
    • more Auth options, thanks Charles
    • more admin configuration, thanks Roberto
    • new gluon.contrib.strip.StripeForm for PCI compliant payments
    • webclient can hendle lists, thanks Yair
    • allows SQLFORM.grid(...,ignore_common_filters=True)
    • more translations, thanks Vladyslav
    • better session2trash.py, works with scheduler, thanks niphlod
    • fixed problem with ENABLED/DISABLED
    • many bug fixes, thanks niphlod, michele, anthony, roberto, tim, and others
    Source code(tar.gz)
    Source code(zip)
  • R-2.6.4(Sep 29, 2013)

  • R-2.0.2(Sep 13, 2013)

    DAL Improvements

    • Support for DAL(lazy_tables=True) and db.define_table(on_define=lambda table:), thanks Jonathan
    • db(...).select(cacheable=True) make select 30% faster
    • db(...).select(cache=(cache.ram,3600)) now caches parsed data 100x faster
    • db(...).count(cache=(cache.ram,3600)) now supported
    • MongoDB support in DAL (experimental), thanks Mark Breedveld
    • geodal and spatialite, thanks Denes and Fran (experimental)
    • db.mytable._before_insert, _after_insert, _before_update, _after_update, _before_delete. _after_delete (list of callbacks)
    • db(...).update_naive(...) same as update but ignores table._before_update and table._after_update
    • DAL BIGINT support and DAL(...,bigint_id=True)
    • IS_IN_DB(..., distinct=True)
    • new syntax: db.mytable.insert(myuploadfield=open(....)), thank you Iceberg
    • db(...).select(db.mytable.myfield.count(distinct=True))
    • db(db.a)._update(name=db(db.b.a==db.a.id).nested_select(db.b.id))
    • db.mytable.myfield.filter_in, filter_out
    • db.mytable._enable_record_versioning(db) adds versioning to this table
    • teradata adapter, thanks Andrew Willimott
    • experimental Sybase Adapter
    • added db.table.field.avg()
    • Support for Google App Engine projections, thanks Christian
    • Field(... 'upload', default=path) now accepts a path to a local file as default value, if user does not upload a file. Relative path looks inside current application folder, thanks Marin
    • executesql(...,fields=,columns=) allows parsing of results in Rows, thanks Anthony
    • Rows.find(lambda row: bool(), limitby=(0,1))

    Auth improvements

    • auth.enable_record_versioning(db) adds full versioning to all tables
    • @auth.requires_login(otherwise=URL(...))
    • auth supports salt and compatible with third party data, thanks Dave Stoll
    • CRYPT now defaults to pbkdf2(1000,20,sha1)
    • Built-in wiki with menu, tags, search, media, permissions. def index: return auth.wiki()
    • auth.settings.everybody_group_id
    • allow storage of uploads on any PyFileSystem (including amazon)

    Form improvements

    • FORM.confirm('Are you sure?',{'Back':URL(...)})
    • SQLFORM.smartdictform(dict)
    • form.add_button(value,link)
    • SQLFORM.grid(groupby='...')
    • fixed security issue with SQLFORM.grid and SQLFORM.smartgrid
    • more export options in SQLFORM.grid and SQLFORM.smartgrid (html, xml, csv, ...)

    Admin improvements

    • new admin pages: manage_students, bulk_regsiter, and progress reports
    • increased security in admin against CSRF
    • experimental Git integration
    • experimental OpenShift deployment
    • multi-language pluralization engine
    • ace text web editor in admin
    • Ukrainian translations, thanks Vladyslav Kozlovskyy
    • Romanian translation for welcome, thanks ionel
    • support for mercurial 2.6, thanks Vlad

    Scheduler Improvements (thanks to niphlod, ykessler, dhx, toomim)

    • web2py.py -K myapp -X starts the myapp scheduler alongside the webserver
    • tasks are marked EXPIRED (if stop_time passed)
    • functions with no result don't end up in scheduler_run
    • more options: web2py.py -E -b -L
    • scheduler can now handle 10k tasks with 20 concurrent workers and with no issues
    • new params: tasks can be found in the environment (no need to define the tasks parameter) max_empty_runs kills the workers automatically if no new tasks are found in queue (nice for "spikes" of processing power) discard_results to completely discard the results (if you don't need the output of the task) utc_time enables datetime calculations with UTC time
    • scheduler_task changes: task_name is no longer required (filled automatically with function_name if found empty) uuid makes easy to coordinate scheduler_task maintenance (filled automatically if not provided) stop_time has no default (previously was today+1) retry_failed to requeue automatically failed tasks sync_output refreshes automatically the output (nice to report percentages)
    • workers can be: DISABLED (put to sleep and do nothing if not sending the heartbeat every 30 seconds) TERMINATE (complete the current task and then die) KILL (kill ASAP)

    Other Improvements

    • gluon/contrib/webclient.py makes it easy to create functional tests for app
    • DIV(..).elements(...replace=...), thanks Anthony
    • new layout based on Twitter Bootstrap
    • New generic views: generic.ics (Mac Mail Calendar) and generic.map (Google Maps)
    • request.args(0,default=0, cast=int, otherwise=URL(...)), thanks Anthony
    • redirect(...,type='auto') will be handled properly in ajax responses
    • routes in can redirect outside with routes_in=[('/path','303->http://..')]
    • better memcache support
    • improved spreadsheet, thanks Alan
    • new internationalization engine, thanks Vladyslav
    • pluralization engine, thanks Vladyslav
    • new markmin with support for nested lists, , , autolinks, thanks Vladyslav
    • new syntax: {{=BR()*5}}
    • gluon.cache.lazy_cache decorator allows caching functions in modules
    • .coffee and .less support in response.files, thanks Sam Sheftel
    • ldap certificate support
    • pg8000 postgresql driver support (experimental)
    • @cache('%(name)s%(args)s%(vars)s',5) and cache.autokey
    • added tox.ini, thanks Marc
    • web2py.py --run_system_tests, thanks Marc Abramowitz
    • html.py (and web2py helpers) can be used without web2py dependencies
    • new fpdf, thanks Mariano
    Source code(tar.gz)
    Source code(zip)
  • R-2.1.1(Sep 13, 2013)

    • overall faster web2py
    • when apps are deleted, a w2p copy is left in deposit folder
    • change in cron (it is now disabled by default). removed -N option and introduced -Y.
    • faster web2py_uuid() and request initialization logic, thanks Michele
    • static asset management, thanks Niphlod
    • improved mobile admin
    • request.requires_https and Auth(secure=True), thanks Yarin and Niphlod
    • better custom_import (works per app and is faster), thanks Michele
    • redis_sesssion.py, thanks Niphlod
    • allow entropy computation in IS_STRONG and web2py.js, thanks Jonathan and Niphlod
    • fixed many aith.wiki problems
    • support for auth.wiki(render='html')
    • better welcome layout, thanks Paolo
    • db.define_table(...,redefine=True)
    • DAL, Row, and Rows object can now be pickled/unpickled, thanks to zombie DAL.
    • admin uses codemirror
    • allow syntax auth = Auth(db).define_tables()
    • better auth.wiki with preview, thanks Alan
    • better auth.impersonate, thanks Alan
    • upgraded jQuery 1.8
    • upgraded Bootstrap 2.1
    • fixed problem with dropbox_account.py
    • many fixes to cache.ram, cache.disk, memcache and gae_memcache
    • cache.with_prefix(cache.ram,'prefix')
    • db.table.field.epoch() counts seconds from epoch
    • DAL support for SQL CASE, example: db().select(...query.case('true','false))
    • DAL(...,do_connect=False) allows faking connections
    • DAL(...,auto_import=True) now retieves some fiel attributes
    • mail can specify a sender: mail.send(...,sender='Mr X <%(sender)s>')
    • renamed gluon/contrib/comet_messaging.py -> gluon/contrib/websocket_messaging.py
    Source code(tar.gz)
    Source code(zip)
  • R-2.2.1(Sep 13, 2013)

    • session.connect(cookie_key='secret', compression_level=9) stores sessions in cookies
    • T.is_writable = False prevents T from dynamically updating langauge files
    • all code is more PEP8 compliant
    • better custom_importer behaviour (now works per app, is smalled and faster)
    • fixed some bugs
    • upgraded feedparser.py and rss2.py
    • codemirror has autoresize
    Source code(tar.gz)
    Source code(zip)
  • R-2.3.2(Sep 13, 2013)

    • new virtual fields syntax: db.define_table('person',Field('name'),Field.Virtual('namey',lambda row: row.person.name+'y'))
    • db.thing(name='Cohen',_orderby=db.thing.name), thanks Yair
    • made many modules Python 3.3 friendly (compile but not tested)
    • better welcome css, thanks Paolo
    • jQuery 1.8.3
    • Bootstrap 2.2.2
    • Modernizr 2.6.2 (custom full options)
    • integration with analyitics.js (0.2.0)
    • better scheduler, thanks Niphlod
    • page and media preview in wiki, thanks Niphlod
    • create new auth.wiki page from slug model, thanks Nico
    • conditional menus with auth.wiki(menugroups=['wiki_editor'])
    • better security in grid/smartgrid
    • allow LOADing multiple grids, thanks Niphlod
    • auth.settings.login_onfail, thanks Yair
    • better handling of session files for speed
    • added heroku support (experimental)
    • added rocket support for IPV6, thanks Chirs Winebrinner
    • more customizable menus with MENU(li_first, li_last..)
    • added support for paymentech (gluon/contrib/paymentech.py)
    • fixed broken cron
    • fixed possible xss with share.js
    • many bug fixes. Closed more than 50 tickets since 2.2.1
    Source code(tar.gz)
    Source code(zip)
  • R-2.4.4(Sep 13, 2013)

    • 2D GEO API: geoPoint, getLine, geoPolygon
    • support for 'json' field type in DAL
    • schema export with db.as_json/as_xml, thanks Alan
    • graph representation of models
    • support for semantic versioning
    • new bootstrap based admin, thanks Paolo
    • improved scheduler (and change in scheduler field names), thanks Niphlod
    • graphviz support added to adm, thanks Jose
    • on_failure in grid
    • db.table.field.abs()
    • better wiki
    • geoPoint, getLine, geoPolygon
    • better reporting of 500 ajax errors
    • better grid
    • improved/fixed mongodb support
    • improved parse_as_rest(patterns=...), thanks Denes
    • improved IMAP DAL support, thanks Alan
    • improved security when cookies in sessions
    • Row.as_xml, as_json, as_dict, as_yaml thanks Alan
    • smarter custom_import
    • setup-ubuntu-12-04-redmine-unicorn-web2py-uwsgi-nginx.sh
    • added support for motor and pulsar servers, thanks Niphlod
    • added json-rpc2 support
    • added pypyodbc.py driver
    • allow auth.settings.ondelete='CASCADE'
    • new syntax IS_EXPR(lambda value: ...
    • using google for QR codes (although Graph API will be deprecated in 2015)
    • upgraded fpdf to 1.7.1
    • bug fixes (including issues with calendar.js and archive tables)
    Source code(tar.gz)
    Source code(zip)
  • R-2.4.5(Sep 13, 2013)

    • travis.ci integration (thanks Marc Abramowitz and Niphlod). Passes all tests (thanks Niplod).
    • IS_DATE and IS_DATETIME can specify timezone
    Source code(tar.gz)
    Source code(zip)
  • R-2.4.6(Sep 13, 2013)

  • R-2.4.7(Sep 13, 2013)

  • R-2.5.1(Sep 13, 2013)

    • New style virtual fields in grid
    • Conditional fields (experimental) db.table.field.show_if = db.table.otherfield==True or db.table.field.show_if = db.table.otherfiel.contains(values)
    • auth.settings.manager_group_role="manager" enables http://.../app/appadmin/auth_manage and http://.../app/appadmin/manage for members of the "manager" group. (also experimental)
    • support for POST variables in DELETE
    • Fixed memory leak when using the TAG helper
    Source code(tar.gz)
    Source code(zip)
  • R-2.6.1(Sep 13, 2013)

    Attention all users: For pre 2.6 applications to work with web2py >=2.6, you must copy static/js/web2py.js, controllers/appadmin.py, and views/appadmin.html from the welcome app to your own apps (all of them).

    Attention production users: The updated handlers and examples are in handlers/ and examples/. The updated ones will not override the existing ones. To use the new ones it is not sufficient to upgrade web2py, you also need to copy the desired handler/example in the root web2py/ folder.

    Attention MySQL users: The length of string fields changed from 255 to 512 bytes. If you have migrations enabled this will trigger a large migration. To prevent it, first set migrate_enabled=False, upgrade, check everything is ok, then add length=255 to your string Fields, then re-enable migrations with migrate_enabled=True if needed.

    • better directory structure: handlers/ extras/ examples/
    • better MongoDb support, thanks Alan
    • better Admin editor interface, thanks Paolo, Roberto (codemirror 3), and Lightdot
    • better layout.html and web2py_bootstrap.css, thanks Paolo
    • refactored web2py.js makes code more readable, thanks Niphlod
    • compute fields can depend on other compute(d) fields
    • more functions in appadmin (/manage/auth), thanks Anthony
    • support for CAST in SQL generation
    • new API jQuery('#component').reload()
    • new API rows.render()
    • new API table.field.referent, table._references
    • new API db(...).validate_and_update(...)
    • new API Wiki(..., force_render=True) renders the page source again instead of using cached
    • Wiki now automatically parses named component arguments @{f:a=1,b='twp',c=variable}
    • auth.get_or_create_user(login=False)
    • auth = Auth(crsf_protection = False) prevents creating sessions in login/register forms.
    • enable multiple renderers in wiki, thanks Alan
    • log messages from Auth are no longer translated (for speed and readability)
    • update jQuery mobile to 1.3.1
    • reduced memory footprint by conditionally loading Tk
    • faster pbkdf2 uses OpenSSL, thanks Michele
    • many speed improvements, thanks Michele
    • better session logic, prevents false positive when detecting session changes.
    • scripts/import_static.py converts a static site to a web2py app (experimental)
    • support for new http error code 451
    • profiler saves dump in dir, thanks Niphlod
    • upgraded pyfpdf, thanks Mariano
    • gluon/contrib/pdfinvoice.py for generating PDF invoices (assumes reportlab)
    • no more double submission of forms (even without crsf protection), thanks Niphlod
    • speedup for define_table, thanks Michele
    • settings.cfg to admin, thanks Paolo
    • many bugs fixed, thanks Niphlod, Michele, Roberto, Jonathan, and many others
    Source code(tar.gz)
    Source code(zip)
Free and open source full-stack enterprise framework for agile development of secure database-driven web-based applications, written and programmable in Python.

Readme web2py is a free open source full-stack framework for rapid development of fast, scalable, secure and portable database-driven web-based applic

null 2k Oct 17, 2021
Web APIs for Django. 🎸

Django REST framework Awesome web-browsable Web APIs. Full documentation for the project is available at https://www.django-rest-framework.org/. Fundi

Encode 22k Oct 15, 2021
The Modern And Developer Centric Python Web Framework. Be sure to read the documentation and join the Slack channel questions: http://slack.masoniteproject.com

NOTE: Masonite 2.3 is no longer compatible with the masonite-cli tool. Please uninstall that by running pip uninstall masonite-cli. If you do not unin

Masonite 1.7k Oct 23, 2021
The no-nonsense, minimalist REST and app backend framework for Python developers, with a focus on reliability, correctness, and performance at scale.

The Falcon Web Framework Falcon is a reliable, high-performance Python web framework for building large-scale app backends and microservices. It encou

Falconry 8.6k Oct 21, 2021
A comprehensive reference for all topics related to building and maintaining microservices

This pandect (πανδέκτης is Ancient Greek for encyclopedia) was created to help you find and understand almost anything related to Microservices that i

Ivan Bilan 45 Sep 30, 2021
CherryPy is a pythonic, object-oriented HTTP framework. https://docs.cherrypy.org/

Welcome to the GitHub repository of CherryPy! CherryPy is a pythonic, object-oriented HTTP framework. It allows building web applications in much the

CherryPy 1.5k Oct 22, 2021
Embrace the APIs of the future. Hug aims to make developing APIs as simple as possible, but no simpler.

Read Latest Documentation - Browse GitHub Code Repository hug aims to make developing Python driven APIs as simple as possible, but no simpler. As a r

Hug API Framework 6.6k Oct 18, 2021
FastAPI framework, high performance, easy to learn, fast to code, ready for production

FastAPI framework, high performance, easy to learn, fast to code, ready for production Documentation: https://fastapi.tiangolo.com Source Code: https:

Sebastián Ramírez 37.2k Oct 23, 2021
Sierra is a lightweight Python framework for building and integrating web applications

A lightweight Python framework for building and Integrating Web Applications. Sierra is a Python3 library for building and integrating web applications with HTML and CSS using simple enough syntax. You can develop your web applications with Python, taking advantage of its functionalities and integrating them to the fullest.

null 74 Oct 8, 2021
Library for building WebSocket servers and clients in Python

What is websockets? websockets is a library for building WebSocket servers and clients in Python with a focus on correctness and simplicity. Built on

Aymeric Augustin 3.6k Oct 24, 2021
Swagger/OpenAPI First framework for Python on top of Flask with automatic endpoint validation & OAuth2 support

Connexion Connexion is a framework that automagically handles HTTP requests based on OpenAPI Specification (formerly known as Swagger Spec) of your AP

Zalando SE 3.8k Oct 22, 2021
Swagger/OpenAPI First framework for Python on top of Flask with automatic endpoint validation & OAuth2 support

Connexion Connexion is a framework that automagically handles HTTP requests based on OpenAPI Specification (formerly known as Swagger Spec) of your AP

Zalando SE 3.5k Feb 17, 2021
WebSocket and WAMP in Python for Twisted and asyncio

Autobahn|Python WebSocket & WAMP for Python on Twisted and asyncio. Quick Links: Source Code - Documentation - WebSocket Examples - WAMP Examples Comm

Crossbar.io 2.3k Oct 12, 2021
Asynchronous HTTP client/server framework for asyncio and Python

Async http client/server framework Key Features Supports both client and server side of HTTP protocol. Supports both client and server Web-Sockets out

aio-libs 11.8k Oct 23, 2021
Appier is an object-oriented Python web framework built for super fast app development.

Joyful Python Web App development Appier is an object-oriented Python web framework built for super fast app development. It's as lightweight as possi

Hive Solutions 116 Oct 2, 2021
Daniel Vaz Gaspar 3.5k Oct 22, 2021
Online Boutique is a cloud-native microservices demo application

Online Boutique is a cloud-native microservices demo application. Online Boutique consists of a 10-tier microservices application. The application is

Matt Reider 1 Oct 22, 2021
Phoenix LiveView but for Django

Reactor, a LiveView library for Django Reactor enables you to do something similar to Phoenix framework LiveView using Django Channels. What's in the

Eddy Ernesto del Valle Pino 349 Oct 13, 2021
A micro web-framework using asyncio coroutines and chained middleware.

Growler master ' dev Growler is a web framework built atop asyncio, the asynchronous library described in PEP 3156 and added to the standard library i

null 686 Aug 12, 2021