Skip to content
No description, website, or topics provided.
Python JavaScript HTML CSS Makefile Dockerfile Objective-C++
Branch: master
Clone or download
Latest commit 4aeb0fc Nov 16, 2019


Build Status

Try me (from pip)

python3 -m pip install -U py4web --no-cache-dir --user
py4web-start apps
open http://localhost:8000/todo/index

(The apps folder will be created with some apps inside)

Try me (from source)

git clone
cd py4web 
python3 -m pip install -r requirements.txt
./ apps
open http://localhost:8000/todo/index

Try me (install from source)

git clone
cd py4web
make assets
make test
make install apps
open http://localhost:8000/todo/index

Notice "py4web-start" uses the pip installed py4web, "./" uses the local one. Do not get confused. Also notice when installing from source the content of py4web/assets is missing and it is created by make assets.

Tell me more

  • this is a work in progress and not stable yet but close to being stable
  • python3 only
  • uses (same DAL as web2py)
  • uses (same as web2py but defaults to [[...]] instead of {{...}} delimiters)
  • uses the same validators as web2py (they are in pyDAL)
  • uses the very similar helpers to web2py (A, DIV, SPAN, etc.)
  • uses for i18n and pluralization
  • request, response, abort are from
  • HTTP and redirect are our own objects
  • like web2py, it supports static asset management /{appname}/static/_0.0.0/{path}
  • implements sessions in cookies (jwt encrypted), db, memcache, redis and custom
  • implements a cache.memoize (Ram cache with O(1) access) Memoize
  • supports multiple apps under apps folder (same as web2py)
  • unlike web2py does not use a custom importer or eval
  • admin has been replaced by a _dashboard (90% done)
  • appadmin has been replaced by dbadmin (within dashboard) (90% done)
  • auth logic is implemented via a "auth" vue.js custom component (90% done)
  • SQLFORM has been replaced by py4web/utils/
  • SQLFORM.grid was been replaced by a "mtable" vue.js custom component (90% done)
  • there are not enough tests
  • it is not as stable as web2py yet
  • it is 10-20x faster than web2py


  • pydal + dbapi (done)
  • yatl (done)
  • pluralize (done)
  • auth (WIP, 90%)
  • mailer (done)
  • session (cookies, db, redis, memcache)
  • form (done up to downloads)
  • mtable (WIP, 75%)
  • dashboard (90% done)
  • scaffold (done)
  • bus (0%)
  • tornado (done)
  • gevent (done)
  • gunicorn (done)
  • bottle (done)

Storing _dashboard password

When py4web starts it asks for a _dashboard password and stores its pdkdf2 hash in password.txt, in the working folder. It will not ask again unless the file is deleted. If the --dashboard_mode is demo or none it will not ask. If you want to store it somewhere else, you can specify a name with --password_file.

You can create the file yourself with:

$ python3 -c "from pydal.validators import CRYPT; open('password.txt','w').write(str(CRYPT()(input('password:'))[0]))"
password: *****

Launch Arguments

usage: [-h] [-a ADDRESS] [-n NUMBER_WORKERS]
                       [--ssl_cert_filename SSL_CERT_FILENAME]
                       [--ssl_key_filename SSL_KEY_FILENAME]
                       [--service_db_uri SERVICE_DB_URI] [-d DASHBOARD_MODE]
                       [-p PASSWORD_FILE] [-c]

positional arguments:
  apps_folder           path to the applications folder

optional arguments:
  -h, --help            show this help message and exit
  -a ADDRESS, --address ADDRESS
                        serving address
  -n NUMBER_WORKERS, --number_workers NUMBER_WORKERS
                        number of gunicorn workers
  --ssl_cert_filename SSL_CERT_FILENAME
                        ssl certificate file
  --ssl_key_filename SSL_KEY_FILENAME
                        ssl key file
  --service_db_uri SERVICE_DB_URI
                        db uri for logging
  -d DASHBOARD_MODE, --dashboard_mode DASHBOARD_MODE
                        dashboard mode: demo, readonly, full (default), none
  -p PASSWORD_FILE, --password_file PASSWORD_FILE
                        file containing the encrypted (CRYPT) password
  -c, --create          created the missing folder and apps


py4web-start -a -d demo apps


py4web is a WSGI application. To obtain th WSGI app simply do:

from py4web.core import wsgi
application = wsgi()

The wsgi function takes arguments with the same name as the command line arguments.



You can’t perform that action at this time.