V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
prasanta
V2EX  ›  Python

xweb: 一款无依赖的 Python web 框架(低于 500 行代码)

  •  
  •   prasanta · 2017-03-07 18:13:58 +08:00 · 4905 次点击
    这是一个创建于 2608 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我用极少的代码了实现一款 web 框架,目标是用低于 1000 行的代码实现 flask 的核心功能, xweb 框架基于 python3.5 以上开发,实在是居家旅行良品.

    github 地址:https://github.com/gaojiuli/xweb

    我的目标是用最少的代码实现符合现状的 web 框架,欢迎同样有兴趣的同学一起参与进来

    说明

    基于3.5开发

    安装

    pip install xweb

    基本用法

    from xweb.application import XWeb
    
    app = XWeb()
    
    
    @app.route('/:name/')
    def call_my_name(name):
        return 'hi {}!'.format(name)
    
    
    app.listen(3000)
    

    请求与相应

    from xweb.globals import request
    
    request.path
    request.query_string
    request.query
    request.files
    request.forms
    request.json
    request.ip
    request.hostname
    request.headers
    
    
    
    from xweb.globals import response
    
    response.headers
    response.status
    response.body
    

    中间件

    from xweb.application import XWeb
    
    app = XWeb()
    
    @app.middleware('request')
    def print_on_request1():
        print("I print when a request is received by the server1")
    
    
    @app.middleware('request')
    def print_on_request2():
        print("I print when a request is received by the server2")
    
    
    @app.middleware('response')
    def print_on_response1():
        print("I print when a response is returned by the server1")
    
    
    @app.middleware('response')
    def print_on_response2():
        print("I print when a response is returned by the server2")
    
    @app.route('/:name/')
    def call_my_name(name):
        return 'hi {}!'.format(name)
    
    
    app.listen(3000)
    

    我的目标是用最少的代码实现符合现状的 web 框架,欢迎同样有兴趣的同学一起参与进来

    github 地址:https://github.com/gaojiuli/xweb

    第 1 条附言  ·  2017-03-08 22:54:01 +08:00
    1. 补充了大部分测试用例
    2. 有兴趣的朋友,可以一起参与进来, todo 列表里的东西都是要实现的
    28 条回复    2017-03-08 17:58:28 +08:00
    TJT
        1
    TJT  
       2017-03-07 18:39:32 +08:00
    mgna17
        2
    mgna17  
       2017-03-07 19:01:29 +08:00 via Android
    那个。。。 method not allowed 不是 405 么😓
    aljun
        3
    aljun  
       2017-03-07 19:56:27 +08:00
    def listen(self, port):
    from wsgiref.simple_server import make_server
    server = make_server('127.0.0.1', port, self)
    print('serve on 127.0.0.1:{port}'.format(port=port))
    server.serve_forever()
    ....建议把这个裁了。。。换成可以使用任意 wsgi
    cevincheung
        4
    cevincheung  
       2017-03-07 20:02:21 +08:00
    坐等日志、队列、 ORM(Postgresql&MySQL)。

    讲真 Auth 就不要了
    prasanta
        5
    prasanta  
    OP
       2017-03-07 21:33:39 +08:00
    @mgna17 状态码从网上搞得,还没有专门整理
    prasanta
        6
    prasanta  
    OP
       2017-03-07 21:34:24 +08:00
    @TJT 雪亮的眼!
    prasanta
        7
    prasanta  
    OP
       2017-03-07 21:35:50 +08:00
    @aljun 这个是开发阶段选用的,只要符合 wsgi 就可以,实际部署的时候应选用 uwsgi 等工具
    prasanta
        8
    prasanta  
    OP
       2017-03-07 21:38:26 +08:00
    @cevincheung orm 我会重新启动一个项目,思路是分离出 django orm ,删减不常用的功能。我不打算把 orm 耦合进来,但是针对 xweb 定制一款符合现状的 orm 系统还是必要的。队列与日志同理,采用无耦合的形式开发。
    bonfy
        9
    bonfy  
       2017-03-07 21:41:06 +08:00   ❤️ 1
    想法不错

    不过要说代码少的话,其实有个框架叫 bottle 的,记得代码很少,不知道还有人在用么
    prasanta
        10
    prasanta  
    OP
       2017-03-07 21:43:27 +08:00
    @bonfy 我的灵感来自 bottle , flask 和 sanic 三款框架,其中 bottle 和 flask 中为了 python2.7 添加太多代码,而 sanic 并非基于 wsgi ,有太多的依赖。这是我的初衷
    yangxin0
        11
    yangxin0  
       2017-03-07 21:54:03 +08:00 via iPhone   ❤️ 1
    这种库居然也能说成框架
    menc
        12
    menc  
       2017-03-07 22:03:32 +08:00
    @yangxin0 可以啊, web.py 还是框架呢
    yangxin0
        13
    yangxin0  
       2017-03-07 22:15:11 +08:00
    @menc 哦。你这个也就是一个 action dispatcher ,一个框架重点在于 ORM
    rust
        14
    rust  
       2017-03-07 22:21:35 +08:00
    @yangxin0 如你所说的话,Flask 和 Sanic 也不算框架咯?
    zhanghedr
        15
    zhanghedr  
       2017-03-07 22:48:40 +08:00   ❤️ 1
    @yangxin0 很多框架都不自带 ORM ,怎么成重点了
    prasanta
        16
    prasanta  
    OP
       2017-03-07 23:11:03 +08:00
    @yangxin0 orm 在我的计划之中,但是我不打算将它们耦合起来就像现在 Django ,我要的效果是 xweb 能快速地使用 peewee , sqlalchemy 等 orm ,也能用针对它开发的 orm 。同时这个 orm 应当能够和 flask , sanic 等结合使用。而不是强耦合地植入。
    PythonAnswer
        17
    PythonAnswer  
       2017-03-07 23:12:37 +08:00
    模板语言也不搞了吧。

    json 部分弄好一点,实用性提高不少。
    prasanta
        18
    prasanta  
    OP
       2017-03-07 23:19:56 +08:00
    @PythonAnswer 你的想法和我一样, xweb 简化满足用于接口开发即可
    madfishy
        19
    madfishy  
       2017-03-07 23:45:56 +08:00
    其实我只想要一个类似 php 那种一键部署的傻瓜工具
    prasanta
        20
    prasanta  
    OP
       2017-03-07 23:54:07 +08:00
    @madfishy 感谢你的建议, python 可以很容易实现傻瓜地部署,我会在项目完整后编写这样的脚本。
    Kilerd
        21
    Kilerd  
       2017-03-08 00:06:05 +08:00
    @aljun 我在写的 web 框架也是这样搭建测试 HTTP 的,(基本所有 python web 框架都是使用 wsgiref 的 make_server 来本地测试的)

    他这种写法并没有问题。 是要是对象里面有 __call__ 函数 满足 wsgi 就可以了。
    wellsc
        22
    wellsc  
       2017-03-08 00:16:32 +08:00
    闲着没事的话可以给 bottle 增加 asyncIo 支持,就像 sanic 对 Flask 做的一样。
    prasanta
        23
    prasanta  
    OP
       2017-03-08 09:20:42 +08:00
    @wellsc 我可不乐意写那些兼容 python2 的代码
    huanglongtiankon
        24
    huanglongtiankon  
       2017-03-08 09:22:52 +08:00
    简单易懂,学习下,看看有没有机会做点贡献
    wuxqing
        25
    wuxqing  
       2017-03-08 09:44:17 +08:00
    建议去完善 sanic ,而不是再造一个轮子
    prasanta
        26
    prasanta  
    OP
       2017-03-08 09:48:50 +08:00
    @wuxqing sanic 使用 uvloop ,造成了无法使用像 flask 中的全局变量 request,response,g 等,并且它依赖于 aiofiles , httptools , ujson , uvloop 这几个库,如果这几个库更新,那么 sanic 不得不被牵着鼻子走. 我想实现的是无第三方依赖,并且摒弃 python2 .
    wellsc
        27
    wellsc  
       2017-03-08 09:53:42 +08:00
    @prasanta bottle 本来就是兼容 Python2 和 3 的,但是 bottle 现在不支持 asyncio 。
    prasanta
        28
    prasanta  
    OP
       2017-03-08 17:58:28 +08:00
    @wellsc 我的意思是既然开发基于 python3, 那么所有为了 Python2 而生的代码都是多余的.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   928 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 22:36 · PVG 06:36 · LAX 15:36 · JFK 18:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.