分享下自己的开源项目 Pywss

111 天前
 CzaOrz

Pywss

Pywss (发音 /piːwaɪz/,类似 p~whys )是一个轻量级的 Python Web 框架,它基于 Python3.6+ 特性构建。

与 Flask 、Django 等主流框架不同的是,Pywss 的底层并没有实现 WSGI 接口协议。 其编程风格也更类似于 Gin 、Iris 等框架,因此对于熟悉这些框架的开发者来说,Pywss 是一个非常值得探索的项目。

其关键特性有:


Demo

import pywss
import time
import random

def logHandler(ctx: pywss.Context):
    startTime = time.time()
    ctx.next()
    cost = time.time() - startTime
    print(f"{ctx.method} - {ctx.route} - cost: {cost: .2f}")

def helloHandler(ctx: pywss.Context):
    ctx.write({"hello": "world"})

app = pywss.App()
app.post("/hello", logHandler, helloHandler)
app.run()

最后

有想学习底层 socket 编程 / web 框架开发 的同学,可以关注学习学习,源码也算是简单易懂~

作者已经在公司内部多个项目正式应用 Pywss ,所以不用担心没人帮你踩坑~

最后求 star~ 😍😍😍

2519 次点击
所在节点    Python
6 条回复
nicoljiang
111 天前
赞一下。
abersheeran
111 天前
确实有自己的风格,不过我挺好奇的,下面这么写不是更 pythonic ,心智负担更小吗?用一个 ctx 进行 write 和 set_status 感觉比较难定位最终到底用的是哪个 response 。

def home():
return "<html></html>"

def api(p: Annotated[str, Query(...)]) -> Annotated[Any, JSONResponse[200, {}, ResponseModel]]:
return {"key": "value"}
CzaOrz
111 天前
@abersheeran
不管是通过 return 返回数据,还是通过 write 指定响应数据,我感觉都很不错。我列举一个爬虫场景:

```python
def spiderHandler(ctx: pywss.Context):
# 参数校验
try:
req = SpiderRequest(**ctx.json())
except UrlInvalidSchemaErr as e:
loggus.error(f"url 参数异常: {e}")
ctx.write(HttpResponse(code=99999, message=f"{e}").dict())
return
except Exception as e:
loggus.error(f"请求参数异常: {e}")
ctx.write(HttpResponse(code=99999, message="请求参数异常").dict())
return
# 爬虫服务
try:
data = spiderService.get(req)
ctx.write(HttpResponse(code=0, message="ok", data=data).dict())
except Exception as e:
loggus.error(f"爬虫服务异常: {e}")
ctx.write(HttpResponse(code=99999, message=f"爬虫服务异常").dict())
```

在这个例子中,不管是 retrun 还是 ctx.write 应该都能写的很漂亮。

我文档中所说的心智负担,主要是很多框架参数、模块,多到记不住,,有时太久不用,想实现一个简单的功能,可能还得对着文档调试半天。。
CzaOrz
111 天前
回复不支持 markdown 嘛~
```
==
```
abersheeran
111 天前
@CzaOrz #3 一个小建议,用 h11 去处理 http 协议,这玩意有很多边缘情况,靠你一个人穷举是不现实的。

像 Starlette 、baize ,这种都只有很少的参数和模块。flask 、django 它们参数和模块多,主要原因就是它们是社区维护,喜欢加一些极少用到、而且很容易让用户自己实现的功能,我严重怀疑是有些人为了刷 PR 。
CzaOrz
111 天前
@abersheeran 这个项目也算是我个人学习的阶段性产物,帮助我进一步学习了解 socket 、http 、websocket 、openapi ,包括一些架构上的思考等。确实很多标准都没有支持,或许将来遇到了就顺手 fix 了~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1009754

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX