Python常见web框架汇总

目前,有非常多的Python框架,用来帮助你更轻松的创建web应用。这些框架把相应的模块组织起来,使得构建应用的时候可以更快捷,也不用去关注一些细节(例如socket和协议),所以需要的都在框架里了。接下来我们会介绍不同的选项。

Python发源于八十年代后期。开发者是Centrum Wiskunde & Informatica的Guido van Rossum,这是位于荷兰阿姆斯特丹科学园区的一个数学和计算机科学研究中心。之后Van Rossum一直是Python开发很有影响的人物。事实上,社区成员给了他一个荣誉称号:终生仁慈独裁者(BDFL)。

经过初期的不起眼,Python已经成为互联网最流行的服务端编程语言之一。根据W3Techs的统计,它被用于很多的大流量的站点,超过了ColdFusion, PHP, 和ASP.NET。其中超过98%的站点运行的是Python 2.0,只有1%多一点的站点运行3.0。

框架让开发更轻松

今天,有着大量的Python框架,它们可以让web应用的开发更轻松。这些框架把不同的模块集成在一起,让你更快的构架程序,而不用关注一些细节(例如socket和协议),框架提供了需要的所有功能。

作为分成两部分的系列文章的第一部分,我们会介绍一些最流行的Python框架。虽然大部分现代的web框架都运行在服务端,也有一些框架开始尝试与客户端代码结合,可以在客户端运行(例如Skulpt和Trinket)。Python框架通常分为全栈框架和非全栈框架。全栈框架设计从用户体验到数据库的所有技术,非全栈框架则并不包含整个开发的全部技术。

此外还有一种微框架,也属于非全栈框架,但是更轻量级。有的情况下,微框架是比较适合的,有时又适合使用全栈框架。在文章的第二部分我们会对全栈框架和微框架做一个比较。

Django

Django恐怕是最有代表性的Python框架了。它是一个遵循MMVC架构模式的开源框架。它的名字来自Django Reinhardt,一个法国作曲家和吉他演奏家,很多人认为他是历史上最伟大的吉他演奏家。位于堪萨斯洲的Lawrence城的Lawrence Journal-World报社有两位程序员,Adrian Holovaty和Simon Willison,他们在2003的时候开发出了Django,用于给报纸开发web程序。

Django内置了模板引擎,同时也通过OOTB来支持流行的Jinja2引擎。它还支持基于正则的URL分发,可以通过简单的URL来完成复杂的映射。

Django的优势之一是只需要单独的安装包来安装。其他的一些类似的框架需要下载很多组件才能开始工作。而且,Django还有完善的保持更新的文档,对于开源项目来说这通常是短板。它是一个健壮的框架,很好的集成了很多来自社区的插件和扩展。项目背后的社区看上去也组织的很好,这从它非常完善的文档和教程就可以看出来。

我学习的第一个框架就是django,方便入门,上手也比较快。个人觉得django的model不好用,主要是跨库联表不友好。
django官网

创建一个项目:

$ pip install django
$ django-admin startproject djdemo                                                   
 cd djdemo                                                                                                                               
$ django-admin startapp djapp                                                   
$ tree -L 3             
.
├── djapp
│   ├── __init__.py
│   ├── admin.py
│   ├── apps.py
│   ├── migrations
│   │   └── __init__.py
│   ├── models.py
│   ├── tests.py
│   └── views.py
├── djdemo
│   ├── __init__.py
│   ├── __pycache__
│   │   ├── __init__.cpython-37.pyc
│   │   └── settings.cpython-37.pyc
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

下面我给出我一个项目的Django的目录结构。是django的经典目录结构形式:


django很简单,Django生态很完备,基于django开发,一般需要的功能,都可以找到已经有的轮子。开发效率很高。django下的开发就是往框架中的填代码。另外就是不够灵活,太重。

django很多好用的脚手架

[django]
    check
    compilemessages
    createcachetable
    dbshell
    diffsettings
    dumpdata
    flush
    inspectdb
    loaddata
    makemessages
    makemigrations
    migrate
    runserver
    sendtestemail
    shell
    showmigrations
    sqlflush
    sqlmigrate
    sqlsequencereset
    squashmigrations
    startapp
    startproject
    test
    testserver

Django 优秀资源大全

TurboGears

TurboGears是在几个著名的Python项目上构建起来的一个框架,如SQLAlchemy,WebOb,Repoze,Genshi。在某种意义上,TurboGears是将多个已经建立的开放平台粘合在一起。和Django一样,它采用MVC架构。它最近还包含一个“最小模式”,使其可以作为一个微框架。

TurboGears是由Kevin Dangoor在2005年开发的。他在当年9月将其作为一个开源项目发布。2013年,项目开发人员迁移到支持Python 3,抛弃了他们曾经写的Pylons代码。TurboGears的优点包括:

  • 支持聚合
  • 强大的对象关系映射器
  • 事务系统支持多数据库间事务
  • 多数据库支持
  • 以可重用的代码片段为模板
  • 具有很多的灵活性,可以对接非标准组件
  • 支持分片
  • 模板系统使设计师的设计更轻松

TurboGears

TurboGears官网

安装

$ pip install tg.devtools

$ gearbox --help
usage: gearbox [--version] [-v | -q] [--log-file LOG_FILE] [-h] [--debug]
               [--relative]

TurboGears2 Gearbox toolset

optional arguments:
  --version            show program's version number and exit
  -v, --verbose        Increase verbosity of output. Can be repeated.
  -q, --quiet          Suppress output except warnings and errors.
  --log-file LOG_FILE  Specify a file to log output. Disabled by default.
  -h, --help           Show this help message and exit.
  --debug              Show tracebacks on errors.
  --relative           Load plugins and applications also from current path.

Commands:
  help           print detailed help for another command
  makepackage    Creates a basic python package
  patch          Patches files by replacing, appending or deleting text.
  quickstart     Creates a new TurboGears2 project
  scaffold       Creates a new file from a scaffold template
  serve          Serves a web application that uses a PasteDeploy configuration file
  setup-app      Setup an application, given a config file
  tgext          Creates a tgext.* package

创建项目

$ gearbox quickstart tgdemo
// 会生成很多文件

.
├── MANIFEST.in
├── README.txt
├── __pycache__
│   └── setup.cpython-37.pyc
├── development.ini
├── migration
│   ├── env.py
│   ├── script.py.mako
│   └── versions
│       └── empty.txt
├── setup.cfg
├── setup.py
├── test.ini
├── tgdemo
│   ├── __init__.py
│   ├── config
│   │   ├── __init__.py
│   │   ├── app_cfg.py
│   │   ├── environment.py
│   │   └── middleware.py
│   ├── controllers
│   │   ├── __init__.py
│   │   ├── controller.py.template
│   │   ├── error.py
│   │   ├── root.py
│   │   └── secure.py
│   ├── i18n
│   │   └── ru
│   ├── lib
│   │   ├── __init__.py
│   │   ├── app_globals.py
│   │   ├── base.py
│   │   └── helpers.py
│   ├── model
│   │   ├── __init__.py
│   │   ├── auth.py
│   │   └── model.py.template
│   ├── public
│   │   ├── css
│   │   ├── favicon.ico
│   │   ├── fonts
│   │   ├── img
│   │   └── javascript
│   ├── templates
│   │   ├── __init__.py
│   │   ├── __pycache__
│   │   ├── about.xhtml
│   │   ├── data.xhtml
│   │   ├── environ.xhtml
│   │   ├── error.xhtml
│   │   ├── index.xhtml
│   │   ├── login.xhtml
│   │   ├── master.xhtml
│   │   └── template.xhtml.template
│   ├── tests
│   │   ├── __init__.py
│   │   ├── functional
│   │   └── models
│   └── websetup
│       ├── __init__.py
│       ├── bootstrap.py
│       └── schema.py
└── tgdemo.egg-info
    ├── PKG-INFO
    ├── SOURCES.txt
    ├── dependency_links.txt
    ├── entry_points.txt
    ├── not-zip-safe
    ├── requires.txt
    └── top_level.txt

22 directories, 48 files

上面👆是按python包的方式生成的代码形式,方便打包分发。

用户只需要修改下面目录中的代码即可


TurboGears使用示例

 from wsgiref.simple_server import make_server
 from tg import expose, TGController, AppConfig

 class RootController(TGController):
      @expose()
      def index(self):
          return "<h1>Hello World</h1>"

 config = AppConfig(minimal=True, root_controller=RootController())

 print "Serving on port 8080..."
 httpd = make_server('', 8080, config.make_wsgi_app())
 httpd.serve_forever()

web2py

web2py是一个开源框架,允许开发者快速创建动态交互式的网站。它的设计目标是消除拖慢开发的大量重复编程任务,比如创建基本的表格。它在最初是作为工具开发的。随后被Django和Ruby on Rails模仿,Ruby on Rails是个Ruby的框架。同TurboGears一样,它使用MVC架构。

最开始的源代码是由Massimo DiPierro在2007年开放的。在那时,它被称为Enterprise Web Framework(EWF)。由于命名冲突,它改过好几次名字,最后在1.16版确定为当前的web2py。使用web2py开发的应用包括Movuca内容管理系统,音乐网站NoobMusic,名为LinkFindr的网络诊断工具,以及Instant Press博客平台。在2011年,web2py被评为最好的开源开发软件,荣获Bossie Award。第二年,又斩获InfoWorld的年度技术奖

与Django一样,web2py也具有广泛的文档。新开发者和高级开发者可以免费下载它的完整开发手册

web2py的一些优点包括:

  • 容易使用——作为一个鲁棒的全栈式框架,它无需其他依赖就可以工作,容易学习和部署,安装也无需任何配置文件,一旦下载完成,安装完毕,就可以用了。开发者会获得一个数据库,一个基于web的IDE,web服务器以及一个有多个核心对象组成的强大API。
  • 安全性出色——Web2py的模板语言减少了黑客使用跨站脚本的危险,抽象层在创建表单时有表单域有效性检查,避免SQL注入,也阻止了跨站请求伪造攻击(csrf攻击)。会话被存储在服务器上,阻止坏的执行者把浏览器cookie弄乱,并且每个密码都是哈希后存储的。

web2py的一些缺点包括:

  • 在常规基础上使用管理的接口不太容易
  • 管理的接口没有权限
  • 没有内建的单元测试支持
  • 开发速度迅速,所有的函数都有缺省行为,表单时自动生成的,高层次的小部件和应用网格都是内建的

目录结构

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

Flask

Flask是一个基于Jinja2和Werkzeug的python微框架,和其他框架类似,它是BSD授权的,一个有少量限制的免费软件许可。使用Flask的网站包括领英LinkedIN和Pinterest。Flask有以下特点:

  • 内建的单元测试支持
  • 模板使用Jinjia2
  • 大量文档
  • 客户端会话使用安全cookies
  • 开发服务器和调试器
  • Restful请求
  • 与WSGI 1.0兼容
  • 基于unicode
  • 大量的扩展

Flask是一个年轻的框架,2010年诞生,Flask的目标是不给程序员强加限制,允许你使用自己的数据库对象关系映射,模板引擎,会话中间件以及你的项目所需的其他组件,在我看来这就是这个微框架的用意。

我想说像Flask这样的框架更适合有经验的开发者,并不是小规模应用程序所必须的,当然,如果你只想做一个简单的REST API,那么Flask当然再好不过了。

flask我个人使用的也是比较多的。flask是微框架,比较灵活,适合小型项目。

示例代码

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello, World!'

flask的生态也很全,社区也是很活跃的,下面👇给出需要的资源。文档

Flask 优秀资源大全

Bottle

和flask一样,Bottle是一个服务器网关接口(WSGI)网络框架。作为一个文件,它不依赖于Python标准库外的任何库。Marcel Hellkamp于2009年写它的时候,它仅由包含模板、路由和一个WSGI抽象层的最小工具开始。对于程序员寻找灵活性和基本功能、构建简单的应用程序和网站、创建一个Web API来说,这小并且强大的框架是极好的。

它的优点包括:

  • 内建的快速模板引擎和对Jinja2,Mako和Cheetah的支持
  • 可以访问上传,cookies,表单数据,标题,和其他元数据的大量工具
  • 支持fapws3,Google App Engine,CherryPyPaste的内建HTTP开发服务器
  • 支持动态URLs

Bottle的另一个优点是,它的小巧精干便于嵌入在一个较大应用程序中而不必担心系统依赖关系。如果你想用一个简单的,干净的和快速的框架并且它没有过多冗余,来创建小的应用程序,Bottle是适合你的。

示例代码:

from bottle import route, run, template

@route('/hello/<name>')
def index(name):
    return template('<b>Hello {{name}}</b>!', name=name)

run(host='localhost', port=8080)

文档

多框架

虽然很难相信,但这些只是少数几十个开发人员可以使用Python框架,。Python.org报道,Django,TurboGears和web2py是最受欢迎的完整选项。为了在框架优化方面提供一个全面的观察,这里我们添加了两个高级形态的微型框架。有着热情的追随者其他框架包括 Pyramid, web.py, Bobo, Albatross, 和 CherryPy

找到正确的适合选择

正确框架的选择取决于项目的规模,它的通信需求,它是否是一个独立的应用程序,定制需求的级别,开销,和许多其他因素。同样重要的是,它取决于哪个框架适合你个人的工作方式。回顾这些项目并下载他们最新的版本。在计划一个主要旅行之前,试开一下确保你在一个合适的车辆中。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • 转载自https://www.jianshu.com/p/39fdc751b245 环境管理 管理 Python ...
    半道出了个家阅读 946评论 0 22
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    小迈克阅读 2,859评论 1 3
  • Python 资源大全中文版 awesome-python[https://github.com/vinta/aw...
    万色星辰阅读 9,722评论 0 256
  • Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资...
    Clemente阅读 3,241评论 0 54
  • 看那天 看那风。 看那墙, 看那秋海棠。 重复昨日的重复, 不见今日的露珠。 那日更深露重, 她忧郁的脸色面带愁容...
    媚珠阅读 180评论 0 0