赞
踩
在实际的项目开发中或多或少不可避免会遇到web服务开发,在python中目前有三大比较主流的web服务框架:Django、Flask和FastAPI。在我自己以往的项目开发经历中主要使用的是Flask,最近正好有项目需要用到FastAPI框架,就想着整体梳理记录下。
Django是一个高级的Python Web框架,它鼓励快速开发和干净、实用的设计。它提供了一个全功能的框架,包括一个强大的ORM(对象关系映射)、一个全面的安全机制、一个内置的管理员界面以及许多其他功能,这使得它非常适合开发复杂的数据驱动型Web应用。
Django官方项目地址在这里,如下所示:
接近8w的star量,足可见其受欢迎程度。
Django框架是一个高级的Python Web框架,用于快速开发安全、可维护的网站和Web应用。以下是关于Django框架的详细介绍:
Django的设计哲学是“不要重复自己”(DRY),即尽量减少代码的冗余和重复。它鼓励开发者使用简洁、明确、可重用的代码来构建Web应用。
功能全面,内置大量常用功能,减少重复开发。
安全性高,内置防护措施。
社区支持丰富,文档完善。
学习曲线较陡峭,需要熟悉大量概念和工具。
在处理高并发时可能面临性能问题。
Django框架需要使用django-admin
命令创建项目结构,然后定义应用模型、视图和模板。
- # 创建Django项目
- django-admin startproject demoProject
-
- # 进入项目目录
- cd demoProject
-
- # 创建Django应用
- python manage.py startapp demoapp
Django的ORM允许开发者以Python类的形式定义数据模型,这些类随后会被转换成数据库表。
- from django.db import models
-
- class User(models.Model):
- username = models.CharField(max_length=100)
- email = models.EmailField()
-
- def __str__(self):
- return self.username
通过运行python manage.py makemigrations
和python manage.py migrate
,Django会自动创建和管理数据库表。
Django的视图是接收Web请求并返回Web响应的Python函数。Django使用模板来生成动态HTML响应,模板中可以使用Django模板语言来实现复杂的逻辑。
- from django.http import HttpResponse
- from django.shortcuts import render
-
- def index(request):
- return render(request, 'template.html', {'message': 'This is My Django Project!'})
Django提供了强大的表单功能,支持表单的渲染、数据验证和错误处理。
- from django import forms
-
- class UserForm(forms.Form):
- sex= forms.CharField(label='性别')
- username = forms.CharField(label='用户名', max_length=100)
- phone= forms.CharField(label='手机号', max_length=20)
- email = forms.EmailField(label='邮箱')
个人在以往的项目开发中还是比较少使用到这个Django框架的,不过在其他一些项目中也有所接触到,诸如:音乐推荐系统、书籍推荐系统等等,Django感觉比较全面比较适合做一个完整的系统应用,而不单单是作为一个web服务接口开发的模块。
Flask是一个用Python编写的轻量级Web应用框架。它被设计为简单易用,核心框架非常小,但可以通过添加多种扩展来增强其功能,使其既适用于构建小型项目,也能够处理复杂的应用程序。Flask的灵活性让开发者能够以最少的代码实现丰富的Web应用功能。
官方项目地址在这里,如下所示:
接近7w的star量,非常强了。
Flask框架是一个使用Python编写的轻量级Web应用框架,它以其简单、灵活、易于扩展和安全性高等特点受到广大开发者的喜爱。以下是关于Flask框架的详细介绍:
借助于flask框架,可以非常简单的实现自己的web服务模块,如下:
- from flask import Flask
-
- app = Flask(__name__)
-
- @app.route('/')
- def hello_world():
- return 'Hello, World!'
-
- if __name__ == '__main__':
- app.run(debug=True)
基于Jinja2可以实现模板渲染展示,如下:
- from flask import render_template
-
- @app.route('/search/<id>')
- def user(name):
- return render_template('template.html', id=id)
Flask本身不包括数据库抽象层或ORM,但允许使用Flask-SQLAlchemy等扩展来操作数据库。
- from flask_sqlalchemy import SQLAlchemy
-
- app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///sqlite.db'
- db = SQLAlchemy(app)
-
- class User(db.Model):
- id = db.Column(db.Integer, primary_key=True)
- price = db.Column(db.String(10), unique=True, nullable=False)
-
- def __repr__(self):
- return '<Price %r>' % self.price
-
-
-
- import sqlite3
-
- import pytest
-
- from flaskr.db import get_db
-
-
- def test_get_close_db(app):
- with app.app_context():
- db = get_db()
- assert db is get_db()
-
- with pytest.raises(sqlite3.ProgrammingError) as e:
- db.execute("SELECT 1")
-
- assert "closed" in str(e.value)
-
-
- def test_init_db_command(runner, monkeypatch):
- class Recorder:
- called = False
-
- def fake_init_db():
- Recorder.called = True
-
- monkeypatch.setattr("flaskr.db.init_db", fake_init_db)
- result = runner.invoke(args=["init-db"])
- assert "Initialized" in result.output
- assert Recorder.called
官方的项目中也有很多实例感兴趣的话可以参考一下,就我自身而言,使用flask框架的频度是最高的,开发轻量级的接口模块非常的方便实用。
FastAPI 是一个用于构建 API 的现代、快速(高性能)的 web 框架,使用 Python 3.8+ 并基于标准的 Python 类型提示。官方给的是基于python3.8+实现的,但是在我自己实际测试过程中发现python3.6也都是可以正常使用的。
官方介绍的FastAPI框架具备的关键特性:
- 快速:可与 NodeJS 和 Go 并肩的极高性能(归功于 Starlette 和 Pydantic)。最快的 Python web 框架之一。
- 高效编码:提高功能开发速度约 200% 至 300%。
- 更少 bug:减少约 40% 的人为(开发者)导致错误。
- 智能:极佳的编辑器支持。处处皆可自动补全,减少调试时间。
- 简单:设计的易于使用和学习,阅读文档的时间更短。
- 简短:使代码重复最小化。通过不同的参数声明实现丰富功能。bug 更少。
- 健壮:生产可用级别的代码。还有自动生成的交互式文档。
- 标准化:基于(并完全兼容)API 的相关开放标准:OpenAPI (以前被称为 Swagger) 和 JSON Schema。
官方文档在这里,如下所示:
FastAPI是一个现代、快速(高性能)的Web框架,特别适用于构建基于Python的API。官方项目地址在这里,如下所示:
超过7w的star量,在趋势上是超过了flask,但是暂时弱于Django的,不过未来有望登顶榜首,据官方介绍,FastAPI是号称可以和Go并肩的高性能框架,现在很多大模型部署中也都有使用到FastAPI框架。
以下是关于FastAPI框架的详细介绍:
pip install fastapi
。同时,需要一个ASGI服务器来运行FastAPI应用,如Uvicorn或Hypercorn。- # 使用pip安装
- $ pip install fastapi
- pip install "uvicorn[standard]"
一个简单的FastAPI示例代码如下:
- from typing import Union
-
- from fastapi import FastAPI
-
- app = FastAPI()
-
-
- @app.get("/")
- def read_root():
- return {"Hello": "World"}
-
-
- @app.get("/items/{item_id}")
- def read_item(item_id: int, q: Union[str, None] = None):
- return {"item_id": item_id, "q": q}
如果需要异步的话可以这样写:
- from typing import Union
-
- from fastapi import FastAPI
-
- app = FastAPI()
-
-
- @app.get("/")
- async def read_root():
- return {"Hello": "World"}
-
-
- @app.get("/items/{item_id}")
- async def read_item(item_id: int, q: Union[str, None] = None):
- return {"item_id": item_id, "q": q}
下面是put方法:
- from typing import Union
-
- from fastapi import FastAPI
- from pydantic import BaseModel
-
- app = FastAPI()
-
-
- class Item(BaseModel):
- name: str
- price: float
- is_offer: Union[bool, None] = None
-
-
- @app.get("/")
- def read_root():
- return {"Hello": "World"}
-
-
- @app.get("/items/{item_id}")
- def read_item(item_id: int, q: Union[str, None] = None):
- return {"item_id": item_id, "q": q}
-
-
- @app.put("/items/{item_id}")
- def update_item(item_id: int, item: Item):
- return {"item_name": item.name, "item_id": item_id}
在以往项目中还未使用过FastAPI框架,今天简单来使用了一下发现,这个框架最直观的体验就是文档的展现,不需要人工取编写或者是维护,自动生成类似Swagger风格的文档,实例如下:
docs:
redoc:
这一点上我觉得还是比较nice的。
另外一点是框架的速度还是比较ok的,相较于经常使用到的flask框架来说,速度更快一些。
感兴趣的话也都可以尝试下,根据自己的实际需求或者是喜好选择合适的web框架来构建自己的个性化应用。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。