├── .gitignore ├── README.md ├── cron.sh ├── list.txt └── list2md.py /.gitignore: -------------------------------------------------------------------------------- 1 | access_token.txt 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Top Python Web Frameworks 2 | A list of popular github projects related to Python web framework (ranked by stars automatically) 3 | Please update **list.txt** (via Pull Request) 4 | 5 | | Project Name | Stars | Forks | Open Issues | Description | Last Commit | 6 | | ------------ | ----- | ----- | ----------- | ----------- | ----------- | 7 | | [django](https://github.com/django/django) | 57069 | 24415 | 165 | The Web framework for perfectionists with deadlines. | 2021-04-27 08:43:35 | 8 | | [flask](https://github.com/pallets/flask) | 54708 | 14265 | 18 | The Python micro framework for building web applications. | 2021-04-27 14:58:25 | 9 | | [fastapi](https://github.com/tiangolo/fastapi) | 30297 | 2089 | 822 | FastAPI framework, high performance, easy to learn, fast to code, ready for production | 2021-04-07 07:04:13 | 10 | | [tornado](https://github.com/tornadoweb/tornado) | 19951 | 5361 | 229 | Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed. | 2021-04-21 19:58:33 | 11 | | [sanic](https://github.com/sanic-org/sanic) | 14893 | 1342 | 43 | Async Python 3.7+ web server/framework | Build fast. Run fast. | 2021-04-19 21:53:42 | 12 | | [dash](https://github.com/plotly/dash) | 14391 | 1463 | 430 | Analytical Web Apps for Python, R, Julia, and Jupyter. No JavaScript Required. | 2021-04-08 21:29:36 | 13 | | [aiohttp](https://github.com/aio-libs/aiohttp) | 11119 | 1579 | 370 | Asynchronous HTTP client/server framework for asyncio and Python | 2021-04-26 11:10:32 | 14 | | [falcon](https://github.com/falconry/falcon) | 8359 | 821 | 198 | The no-nonsense, minimalist REST and app backend framework for Python developers, with a focus on reliability, correctness, and performance at scale. | 2021-04-26 16:15:42 | 15 | | [bottle](https://github.com/bottlepy/bottle) | 7240 | 1375 | 313 | bottle.py is a fast and simple micro-framework for python web-applications. | 2021-01-01 15:17:44 | 16 | | [hug](https://github.com/hugapi/hug) | 6486 | 372 | 157 | Embrace the APIs of the future. Hug aims to make developing APIs as simple as possible, but no simpler. | 2020-08-10 05:07:26 | 17 | | [eve](https://github.com/pyeve/eve) | 6330 | 735 | 30 | REST API framework designed for human beings | 2021-03-14 16:47:07 | 18 | | [vibora](https://github.com/vibora-io/vibora) | 5715 | 317 | 145 | Fast, asynchronous and elegant Python web framework. | 2019-02-11 10:54:12 | 19 | | [pyramid](https://github.com/Pylons/pyramid) | 3540 | 873 | 68 | Pyramid - A Python web framework | 2021-03-15 06:21:30 | 20 | | [web2py](https://github.com/web2py/web2py) | 1945 | 847 | 353 | Free and open source full-stack enterprise framework for agile development of secure database-driven web-based applications, written and programmable in Python. | 2021-03-03 06:47:33 | 21 | | [masonite](https://github.com/MasoniteFramework/masonite) | 1573 | 96 | 28 | The Modern And Developer Centric Python Web Framework. Be sure to read the documentation and join the Slack channel questions: http://slack.masoniteproject.com | 2021-04-16 01:55:01 | 22 | | [cherrypy](https://github.com/cherrypy/cherrypy) | 1383 | 319 | 205 | CherryPy is a pythonic, object-oriented HTTP framework. https://docs.cherrypy.org/ | 2021-01-17 23:39:22 | 23 | | [tg2](https://github.com/TurboGears/tg2) | 759 | 74 | 7 | Python web framework with full-stack layer implemented on top of a microframework core with support for MongoDB, Pluggable Applications and autogenerated Admin | 2020-10-08 07:18:07 | 24 | | [Growler](https://github.com/pyGrowler/Growler) | 682 | 28 | 5 | A micro web-framework using asyncio coroutines and chained middleware. | 2020-03-08 07:51:41 | 25 | | [morepath](https://github.com/morepath/morepath) | 388 | 37 | 75 | Python web microframework with superpowers | 2021-04-18 14:33:02 | 26 | | [circuits](https://github.com/circuits/circuits) | 255 | 53 | 32 | circuits is a Lightweight Event driven and Asynchronous Application Framework for the Python Programming Language with a strong Component Architecture. | 2020-12-16 08:37:47 | 27 | 28 | *Last Automatic Update: 2021-04-27T22:40:18* 29 | -------------------------------------------------------------------------------- /cron.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | git pull 3 | python3 list2md.py 4 | git commit -m "Auto update" -a 5 | git push origin 6 | -------------------------------------------------------------------------------- /list.txt: -------------------------------------------------------------------------------- 1 | https://github.com/django/django 2 | https://github.com/pallets/flask 3 | https://github.com/tornadoweb/tornado 4 | https://github.com/Pylons/pyramid 5 | https://github.com/falconry/falcon 6 | https://github.com/web2py/web2py 7 | https://github.com/bottlepy/bottle 8 | https://github.com/cherrypy/cherrypy 9 | https://github.com/channelcat/sanic 10 | https://github.com/aio-libs/aiohttp 11 | https://github.com/plotly/dash 12 | https://github.com/timothycrosley/hug 13 | https://github.com/pyGrowler/Growler 14 | https://github.com/TurboGears/tg2 15 | https://github.com/morepath/morepath 16 | https://github.com/circuits/circuits 17 | https://github.com/vibora-io/vibora 18 | https://github.com/MasoniteFramework/masonite 19 | https://github.com/pyeve/eve 20 | https://github.com/tiangolo/fastapi 21 | -------------------------------------------------------------------------------- /list2md.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | import json 3 | import requests 4 | 5 | 6 | head = '''# Top Python Web Frameworks 7 | A list of popular github projects related to Python web framework (ranked by stars automatically) 8 | Please update **list.txt** (via Pull Request) 9 | 10 | | Project Name | Stars | Forks | Open Issues | Description | Last Commit | 11 | | ------------ | ----- | ----- | ----------- | ----------- | ----------- | 12 | ''' 13 | tail = '\n*Last Automatic Update: {}*' 14 | 15 | warning = "⚠️ No longer maintained ⚠️ " 16 | 17 | deprecated_repos = list() 18 | repos = list() 19 | 20 | 21 | def main(): 22 | access_token = get_access_token() 23 | 24 | with open('list.txt', 'r') as f: 25 | for url in f.readlines(): 26 | url = url.strip() 27 | if url.startswith('https://github.com/'): 28 | repo_api = 'https://api.github.com/repos/{}?access_token={}'.format(url[19:], access_token) 29 | print(repo_api) 30 | 31 | r = requests.get(repo_api) 32 | if r.status_code != 200: 33 | raise ValueError('Can not retrieve from {}'.format(url)) 34 | repo = json.loads(r.content) 35 | 36 | commit_api = 'https://api.github.com/repos/{}/commits/{}?access_token={}'.format(url[19:], repo['default_branch'], access_token) 37 | print(repo_api) 38 | 39 | r = requests.get(commit_api) 40 | if r.status_code != 200: 41 | raise ValueError('Can not retrieve from {}'.format(url)) 42 | commit = json.loads(r.content) 43 | 44 | repo['last_commit_date'] = commit['commit']['committer']['date'] 45 | repos.append(repo) 46 | 47 | repos.sort(key=lambda r: r['stargazers_count'], reverse=True) 48 | save_ranking(repos) 49 | 50 | 51 | def get_access_token(): 52 | with open('access_token.txt', 'r') as f: 53 | return f.read().strip() 54 | 55 | 56 | def save_ranking(repos): 57 | with open('README.md', 'w') as f: 58 | f.write(head) 59 | for repo in repos: 60 | if is_deprecated(repo['url']): 61 | repo['description'] = warning + repo['description'] 62 | f.write('| [{}]({}) | {} | {} | {} | {} | {} |\n'.format(repo['name'], 63 | repo['html_url'], 64 | repo['stargazers_count'], 65 | repo['forks_count'], 66 | repo['open_issues_count'], 67 | repo['description'], 68 | datetime.strptime(repo['last_commit_date'], '%Y-%m-%dT%H:%M:%SZ').strftime('%Y-%m-%d %H:%M:%S'))) 69 | f.write(tail.format(datetime.now().strftime('%Y-%m-%dT%H:%M:%S%Z'))) 70 | 71 | 72 | def is_deprecated(repo_url): 73 | return repo_url in deprecated_repos 74 | 75 | 76 | if __name__ == '__main__': 77 | main() --------------------------------------------------------------------------------