
Python Web开发有个让人头疼的规律:不管什么项目,前期总要花大量时间配环境、搭脚手架、写和业务无关的基础代码。等这些都搞完,动力已经去了一半。
今天介绍三个框架,不是说它们“效率翻倍”这种虚话,而是这三个东西确实在各自的场景里能帮你少写很多重复代码:FastAPI适合写API、Django REST Framework适合企业级项目、Pynecone适合不想碰JavaScript的全栈场景。
FastAPI基于Python类型提示,用Pydantic做数据验证,Starlette处理Web层,原生支持异步。它最省事的地方在于:写完接口,/docs页面的交互式文档就自动生成了,不用单独维护。
安装:
pip install fastapi uvicorn一个用户管理的基础示例:
fromfastapiimportFastAPI, HTTPException
frompydanticimportBaseModel
fromtypingimportOptional
fromdatetimeimportdatetime
app = FastAPI(title="用户管理系统")
classUser(BaseModel):
id: int
username: str
email: str
created_at: datetime = datetime.now()
is_active: bool = True
users_db = []
@app.post("/users/", response_model=User)
asyncdefcreate_user(user: User):
"""创建新用户"""
users_db.append(user)
returnuser
@app.get("/users/{user_id}", response_model=User)
asyncdefread_user(user_id: int):
"""根据ID获取用户"""
foruserinusers_db:
ifuser.id == user_id:
returnuser
raiseHTTPException(status_code=404, detail="用户不存在")
@app.get("/users/", response_model=list[User])
asyncdeflist_users(active_only: bool = True):
"""列出用户列表"""
ifactive_only:
return [userforuserinusers_dbifuser.is_active]
returnusers_db
if__name__ == "__main__":
importuvicorn
uvicorn.run(app, host="127.0.0.1", port=8000)跑起来之后访问 http://127.0.0.1:8000/docs,Swagger UI已经在那等着了,直接测接口不用另外写测试脚本。
适合的场景:需要高并发的API服务、微服务、对接文档要求高的项目。如果团队里没有专职后端、需要前端或数据工程师也能快速接入,FastAPI的自动文档很有用。
DRF建在Django上,提供了序列化、视图集、路由器、认证权限这一整套东西。代码量比FastAPI多,但覆盖的场景也更全——特别是已经在用Django的项目,接进去几乎没有额外成本。
安装:
pip install djangorestframework一个商品管理的完整示例,从模型到路由:
# models.py
fromdjango.dbimportmodels
classProduct(models.Model):
name = models.CharField(max_length=200)
description = models.TextField()
price = models.DecimalField(max_digits=10, decimal_places=2)
stock = models.IntegerField(default=0)
created_at = models.DateTimeField(auto_now_add=True)
def__str__(self):
returnself.name
# serializers.py
fromrest_frameworkimportserializers
from .modelsimportProduct
classProductSerializer(serializers.ModelSerializer):
classMeta:
model = Product
fields = ['id', 'name', 'description', 'price', 'stock', 'created_at']
read_only_fields = ['created_at']
# views.py
fromrest_frameworkimportviewsets, permissions
from .modelsimportProduct
from .serializersimportProductSerializer
classProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
defperform_create(self, serializer):
serializer.save()
# urls.py
fromdjango.urlsimportpath, include
fromrest_framework.routersimportDefaultRouter
from .viewsimportProductViewSet
router = DefaultRouter()
router.register(r'products', ProductViewSet)
urlpatterns = [
path('api/', include(router.urls)),
path('api-auth/', include('rest_framework.urls')),
]跑起来访问 http://127.0.0.1:8000/api/products/,GET/POST/PUT/PATCH/DELETE全部自动支持,还有可浏览的HTML界面方便调试。分页、过滤、搜索也内置好了,不用从头写。
适合的场景:已有Django项目、需要用户认证和权限管理、后台管理界面是刚需。如果是从零开始且不需要Django生态,FastAPI通常更轻量。
Pynecone(现已更名为Reflex)是个有点不一样的框架——前后端都用Python写,底层会把Python组件编译成React,不需要写任何JavaScript。
安装:
pip install pynecone初始化项目:
pc init一个带计数器和待办列表的小应用:
importpyneconeaspc
classState(pc.State):
"""应用状态"""
count: int = 0
items: list[str] = []
new_item: str = ""
defincrement(self):
self.count += 1
defdecrement(self):
self.count -= 1
defadd_item(self):
ifself.new_item:
self.items.append(self.new_item)
self.new_item = ""
defremove_item(self, item: str):
self.items.remove(item)
defindex():
"""主页组件"""
returnpc.container(
pc.vstack(
pc.heading("Pynecone Todo应用", size="2xl"),
pc.hstack(
pc.button("减少", on_click=State.decrement),
pc.text(State.count, font_size="2xl"),
pc.button("增加", on_click=State.increment),
spacing="1em"
),
pc.hstack(
pc.input(
placeholder="输入待办事项",
value=State.new_item,
on_change=State.set_new_item
),
pc.button("添加", on_click=State.add_item),
spacing="1em"
),
pc.vstack(
pc.foreach(
State.items,
lambdaitem: pc.hstack(
pc.text(item),
pc.button(
"删除",
on_click=lambda: State.remove_item(item)
),
spacing="1em"
)
)
),
spacing="2em",
padding_top="5%"
),
max_width="600px"
)
app = pc.App(state=State)
app.add_page(index)
app.compile()pc run之后访问 http://localhost:3000,支持热重载,改完代码页面自动刷新。
适合的场景:数据科学背景、不想学JavaScript但需要做个可交互的Web界面、内部工具或原型。需要说明的是,Pynecone的生态还在成长,复杂UI需求可能会碰到文档不足的问题,生产环境要留意。
FastAPI | Django REST Framework | Pynecone | |
|---|---|---|---|
学习曲线 | 低-中 | 中-高 | 低 |
开发速度 | 快 | 中等 | 快 |
性能 | 高 | 中等 | 中等 |
适合规模 | 小到大 | 中到大 | 小到中 |
生态成熟度 | 良好 | 优秀 | 成长中 |
简单来说:写API首选FastAPI,已有Django项目或需要完整权限体系用DRF,想用纯Python搞前后端一体化试试Pynecone。
“无他,惟手熟尔”!有需要的用起来!
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!