Python Web 框架的使用率仍然是 Flask、Django 和 FastAPI 之间的三强之争。所有其他框架加起来只能勉强排在第三位。下面对这三个主流框架做下比较:
Djanggo- 使用比率: 39%
- 系统特点:全栈框架:内置 ORM、模板引擎、表单处理、用户认证等功能;开箱即用:适合快速开发复杂的 Web 应用;社区强大:有丰富的第三方库和插件。
- 系统性能:中等。由于功能丰富,性能略低于轻量级框架,但足够应对大多数场景。
- 适用场景:需要快速开发的全栈应用如内容管理系统(CMS)、社交网络、电子商务网站等。
Flask- 使用比率:36%
- 系统特点:微框架:轻量级,核心功能简单,易于扩展;灵活:可以根据需求选择插件和库;学习曲线低:适合初学者和小型项目。
- 系统性能:较高:由于轻量级设计,性能优于 Django。
- 适用场景:小型 Web 应用、API 服务、原型开发。
FastAPI- 使用比率:25%
- 系统特点:高性能:基于 Starlette 和 Pydantic,性能接近 Node.js 和 Go;异步支持:原生支持异步编程;自动文档:自动生成 OpenAPI 和 Swagger 文档。
- 系统性能:极高:是目前性能最好的 Python Web 框架之一。
- 适用场景:高性能 API 服务、微服务、实时应用。
目前纯粹的前端框架有很多如vue、angular、React等,笔者不建议使用Python做web界面开发,可以使用Python开发人工智能后端后通过restful API发布接口,供第三方应用调用即可。
下面逐个介绍这几个框架并提供简单的web开发应用,只做抛砖引玉的作用,不做详细的引申,感兴趣的同学可以针对自己感兴趣的框架做进一步的学习。首先从使用率最高的Django开始。
Django是一个高级的Python Web应用框架,可以快速开发安全和可维护的网站。由经验丰富的开发者构建,Django负责处理网站开发中麻烦的部分,可以专注于编写应用程序,而无需重新开发。它是免费和开源的,有活跃繁荣的社区,丰富的文档,以及很多免费和付费的解决方案。 Django遵循一种称为MTV(MODEL-TEMPLATE-VIEW)模式的架构模式。
主要功能
Django是高水准的Python编程语言驱动的一个开源模型.视图,控制器风格的Web应用程序框架,它起源于开源社区。使用这种架构,程序员可以方便、快捷地创建高品质、易维护、数据库驱动的应用程序。这也正是OpenStack的Horizon组件采用这种架构进行设计的主要原因。另外,在Django框架中,还包含许多功能强大的第三方插件,使得Django具有较强的可扩展性。Django 项目源自一个在线新闻 Web 站点,于 2005 年以开源的形式被释放出来。Django 框架的核心组件有:
- 用于创建模型的对象关系映射;
- 为最终用户设计较好的管理界面;
- URL 设计;
- 设计者友好的模板语言;
- 缓存系统。
框架特点
Django已经成为web开发者的首选框架,是一个遵循 MVC 设计模式的框架。MVC是Model、View、Controller三个单词的简写,分别代表模型、视图、控制器。Django其实也是一个MTV的设计模式。MTV是Model、Template、View三个单词的简写,分别代表模型、模版、视图 [4]。但是在Django中,控制器接受用户输入的部分由框架自行处理,所以 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),称为 MTV模式。它们各自的职责如下:
| 层次 | 职责 |
|---|---|
| 模型层(Model) | 即数据存取层。处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。 |
| 模板层(Template) | 即表现层,处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。 |
| 视图层(View) | 即业务逻辑层,存取模型及调取恰当模板的相关逻辑。模型与模板的桥梁。 |
从以上表述可以看出Django 视图不处理用户输入,而仅仅决定要展现哪些数据给用户,而Django 模板 仅仅决定如何展现Django视图指定的数据。或者说, Django将MVC(MODEL-VIEW-CONTROL)中的视图进一步分解为 Django视图 和 Django模板两个部分,分别决定 “展现哪些数据” 和 “如何展现”,使得Django的模板可以根据需要随时替换,而不仅仅限制于内置的模板。
至于MVC控制器部分,由Django框架的URLconf来实现。URLconf机制是使用正则表达式匹配URL,然后调用合适的Python函数。URLconf对于URL的规则没有任何限制,完全可以设计成任意的URL风格,不管是传统的,RESTful的,或者是另类的。框架把控制层给封装了,无非与数据交互这层都是数据库表的读,写,删除,更新的操作。在写程序的时候,只要调用相应的方法就行了,感觉很方便。程序员把控制层东西交给Django自动完成了。 只需要编写非常少的代码完成很多的事情。所以,它比MVC框架考虑的问题要深一步,因为程序员大都在写控制层的程序。这个工作交给了框架,仅需写很少的调用代码,大大提高了工作效率。
模型层(model)
通过 ORM(对象关系映射)定义数据库结构,支持主流数据库(MySQL、PostgreSQL、SQLite)。
# 示例 from django.db import models class Book(models.Model): title = models.CharField(max_length=100) author = models.ForeignKey('Author', on_delete=models.CASCADE) publish_date = models.DateField(auto_now_add=True)说明:CharField定义字符串字段,ForeignKey关联其他模型,auto_now_add自动记录创建时间。
视图层(view)
处理业务逻辑,接收请求并返回响应(如 HTML、JSON)。
# 示例 from django.shortcuts import render from .models import Book def book_list(request): books = Book.objects.filter(author__name="鲁迅") return render(request, 'books/list.html', {'books': books})说明:objects.filter() 执行数据库查询,render() 渲染模板。
模板层(template)
动态生成 HTML,支持模板继承和逻辑控制。
<ul> {% for book in books %} <li>{{ book.title }} - {{ book.publish_date|date:"Y-m-d" }}</li> {% endfor %}说明:{% for %}循环遍历数据,|date为过滤器格式化日期。
路由(URLConf)
将 URL 映射到视图函数,支持动态参数和正则表达式。
from django.urls import path from . import views urlpatterns = [ path('books/', views.book_list, name='book-list'), path('books/<int:book_id>/', views.book_detail), ]说明:int:book_id捕获整数参数,name用于反向解析 URL。
运行环境
Django可以运行在Apache,Nginx等Web服务器上,也可以运行在支持WSGI,FastCGI的服务器上。支持多种数据库,已经支持Postgresql,MySql, Sqlite3,Oracle。Google App Engine也支持Django的某些部分,国内支持的平台有新浪应用引擎(Sina App Engine,SAE),百度应用引擎(Baidu App Engine,BAE)。
设计模式
Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用,多个组件可以很方便的以“插件”形式服务于整个框架,Django有许多功能强大的第三方插件,甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展性。它还强调快速开发和DRY(Do Not Repeat Yourself)原则。
- 对象关系映射 (
object-relational mapping,ORM):以Python类形式定义的数据模型,ORM将模型与关系数据库连接起来,将得到一个非常容易使用的数据库API,同时也可以在Django中使用原始的SQL语句。 - URL 分派:使用正则表达式匹配URL,可以设计任意的URL,没有框架的特定限定。一样灵活。
- 模版系统:使用Django强大而可扩展的模板语言,可以分隔设计、内容和Python代码。并且具有可继承性。
- 表单处理:可以方便的生成各种表单模型,实现表单的有效性检验。可以方便的从定义的模型实例生成相应的表单。
- Cache系统:可以挂在内存缓冲或其它的框架实现超级缓冲 实现所需要的粒度。
- 会话(session),用户登录与权限检查,快速开发用户会话功能。
- 国际化:内置国际化系统,方便开发出多种语言的网站。
- 自动化的管理界面:不需要花大量的工作来创建人员管理和更新内容。Django自带一个
admin site,类似于内容管理系统
依赖安装
pip安装
打开命令行窗口,输入以下命令安装官方发布的发行版本:
python -m pip install django这种方式会默认安装最新版的Django框架,如果要安装指定版本,使用以下命令:
python -m pip install django=[x.y]其中,x.y表示想要安装的Django版本号。
源码安装
首先,下载django的压缩包
git clone https://github.com/django/django.git下载完成之后,将在本地创建了django目录并将源码下载到该目录下。进入下载根目录,执行以下程序:
python -m -pip install -e django/开发第一个应用
创建第一个django项目
如果这是你第一次使用 Django 的话,需要做一些初始化设置。也就是说,你需要用一些自动生成的代码配置一个 Django项目 —— 即一个 Django 项目实例需要的设置项集合,包括数据库配置、Django 配置和应用程序配置。
打开命令行,cd到一个你想放置你代码的目录,然后运行以下命令:
django-admin startproject mysite这行代码将会在当前目录下创建一个mysite目录。如果命令失败了,查看 运行django-admin时遇到的问题,可能能给你提供帮助。
注意:
- 你得避免使用 Python 或 Django 的内部保留字来命名你的项目。具体地说,你得避免使用像
django(会和 Django 自己产生冲突)或test(会和 Python 的内置组件产生冲突)这样的名字。- 如果你曾经是原生 PHP 程序员(没有使用过现代框架),你可能会习惯于把代码放在 Web 服务器的文档根目录(诸如
/var/www)。当使用 Django 时不需要这样做。把所有 Python 代码放在 Web 服务器的根目录不是个好主意,因为这样会有风险。比如会提高人们在网站上看到你的代码的可能性。这不利于网站的安全。把你的代码放在文档根目录以外的某些地方吧,比如 /home/mycode。
如果项目创建成功,目录结构将如下所示:
mysite/ manage.py mysite/ __init__.py settings.py urls.py wsgi.py这些目录和文件的用处是:
- 最外层的:file: mysite/ 根目录只是你项目的容器, Django 不关心它的名字,你可以将它重命名为任何你喜欢的名字。
manage.py: 一个让你用各种方式管理 Django 项目的命令行工具。- 里面一层的
mysite/目录包含你的项目,它是一个纯 Python 包。它的名字就是当你引用它内部任何东西时需要用到的 Python 包名。 (比如mysite.urls). mysite/__init__.py:一个空文件,告诉 Python 这个目录应该被认为是一个 Python 包。mysite/settings.py:Django 项目的配置文件。如果你想知道这个文件是如何工作的,mysite/urls.py:Django 项目的 URL 声明,就像你网站的“目录”。mysite/wsgi.py:作为你的项目的运行在 WSGI 兼容的Web服务器上的入口。
开发简易服务器
让我们来确认一下你的 Django 项目是否真的创建成功了。如果你的当前目录不是外层的mysite目录的话,请切换到此目录,然后运行下面的命令:
$ python manage.py runserver你应该会看到如下输出:
Performing system checks... System check identified no issues (0 silenced). You have unapplied migrations; your app may not work properly until they are applied. Run 'python manage.py migrate' to apply them. 八月 01, 2018 - 15:50:53 Django version 2.0, using settings 'mysite.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.你刚刚启动的是 Django 自带的用于开发的简易服务器,它是一个用纯 Python 写的轻量级的 Web 服务器。我们将这个服务器内置在 Django 中是为了让你能快速的开发出想要的东西,因为你不需要进行配置生产级别的服务器(比如 Apache)方面的工作,除非你已经准备好投入生产环境了。
注意:千万不要将这个服务器用于和生产环境相关的任何地方。这个服务器只是为了开发而设计的。(我们在 Web 框架方面是专家,在 Web 服务器方面并不是。)
现在,服务器正在运行,浏览器访问https://127.0.0.1:8000/。你将会看到一个“祝贺”页面,随着一只火箭发射,服务器已经运行了。