# awesome-python-webapps **Repository Path**: mirrors_c-bata/awesome-python-webapps ## Basic Information - **Project Name**: awesome-python-webapps - **Description**: A curated list of awesome python web development libraries. - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-11-23 - **Last Updated**: 2025-12-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # awesome-python-webapps A curated list of awesome python web development libraries. ## Awesome common libraries #### Databases - [SQLAlchemy](http://www.sqlalchemy.org/) - [Alembic](https://bitbucket.org/zzzeek/alembic) - [redis](https://github.com/andymccurdy/redis-py) - [PyMySQL](https://github.com/PyMySQL/PyMySQL) - [psycopg2](https://github.com/psycopg/psycopg2) - [pymongo](http://github.com/mongodb/mongo-python-driver) - [factory_boy](https://github.com/rbarrois/factory_boy) #### Authentication - [Werkzeug](https://github.com/mitsuhiko/werkzeug) ``` >>> from werkzeug.security import generate_password_hash, check_password_hash >>> password_hash = generate_password_hash('my password') >>> check_password_hash(password_hash, 'my password') True >>> check_password_hash(password_hash, 'this is not my password') False ``` - [PyJWT](https://github.com/jpadilla/pyjwt) ``` >>> import jwt >>> from datetime import datetime, timedelta >>> payload = { ... 'user_id': 1, ... 'iat': datetime.utcnow(), ... 'exp': datetime.utcnow() + timedelta(days=1) ... } >>> token = jwt.encode(payload, 'SECRET_KEY') >>> token b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJleHAiOjE0NDY4NzczNjIsImlhdCI6MTQ0Njc5MDk2Mn0.JVjdlg_0lxDtl4AqHRpiC4Gpv1hkB57g5dsIyWJmnF4' >>> token.decode('unicode_escape') 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJleHAiOjE0NDY4NzczNjIsImlhdCI6MTQ0Njc5MDk2Mn0.JVjdlg_0lxDtl4AqHRpiC4Gpv1hkB57g5dsIyWJmnF4' >>> jwt.decode(token, 'SECRET_KEY') {'user_id': 1, 'exp': 1446877362, 'iat': 1446790962} >>> jwt.decode(token, verify=False) {'user_id': 1, 'exp': 1446877362, 'iat': 1446790962} ``` - [itsdangerous](https://github.com/mitsuhiko/itsdangerous) ``` >>> from itsdangerous import TimedJSONWebSignatureSerializer as Serializer >>> s = Serializer('SECRET_KEY', expires_in=3600) >>> token = s.dumps({'id': 1}).decode('utf-8') >>> token 'eyJleHAiOjE0NDY3OTYwMTQsImFsZyI6IkhTMjU2IiwiaWF0IjoxNDQ2NzkyNDE0fQ.eyJpZCI6MX0.2d2h08XCqbMOgZw918jFRf2lJH_9QQwrQrJp5CnpbSI' >>> s = Serializer('SECRET_KEY') >>> s.loads(token) {'id': 1} >>> s.loads('dummy.token') Traceback (most recent call last): : : itsdangerous.BadSignature: Signature b'token' does not match ``` ## Awesome Django libraries - [django-widget-tweaks](https://github.com/kmike/django-widget-tweaks) - [django-debug-toolbar](https://github.com/django-debug-toolbar/django-debug-toolbar) ## Awesome flask libraries #### Databases - [Flask-Admin](https://github.com/mrjoes/flask-admin/) - [Flask-SQLAlchemy](https://github.com/mitsuhiko/flask-sqlalchemy) - [Flask-Migrate](https://github.com/miguelgrinberg/Flask-Migrate) #### Utils - [Flask-Script](https://github.com/smurfix/flask-script) - [Flask Debug-toolbar](https://github.com/mgood/flask-debugtoolbar) - [flask-profiler](https://github.com/muatik/flask-profiler) #### Profiling - [Flask-SQLAlchemy](https://github.com/mitsuhiko/flask-sqlalchemy) ``` # api/__init__.py @app.after_request def after_request(response): for query in get_debug_queries(): if query.duration >= app.config['SLOW_DB_QUERY_TIME']: app.logger.warning( 'Slow query: %s\nParameters: %s\n' 'Duration: %fs\nContext: %s\n' % (query.statement, query.parameters, query.duration, query.context) ) return response ``` - [Werkzeug](https://github.com/mitsuhiko/werkzeug) ``` # manage.py @manager.command def profile(length=25): """Start the application under the code profiler.""" from werkzeug.contrib.profiler import ProfilerMiddleware app.wsgi_app = ProfilerMiddleware(app.wsgi_app, restrictions=[length]) app.run() ````