V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
pengwkgood
V2EX  ›  分享创造

touch-callable:自动为 Python Function 生成 WebUI

  •  1
     
  •   pengwkgood ·
    pengwk · 2019-12-01 12:20:56 +08:00 · 4248 次点击
    这是一个创建于 1579 天前的主题,其中的信息可能已经有所发展或是发生改变。

    给大家介绍一下我的业余项目: https://github.com/pengwk/touch-callable (求 Star 😝、求建议)

    使用 Python 3 的 type annotation 特性,自动提取 Function 参数类型信息,生成 Web UI,只需要正常编写 Python function 就可以立刻开始一个简易的 Web 服务。

    目前支持的类型有:

    • str
    • int
    • float
    • bool
    • datetime.datetime
    • datetime.date
    • datetime.time
    • enum.Enum
    • io.BytesIO
    • typing.BinaryIO

    做这个项目的目的有两个:

    • 希望集成项目里的各种零散脚本,将他们管理起来,方便大家(会 Python 的,不会 Python 的)使用,降低重复劳动。
    • 希望在界面不是很重要的 Web 服务场景里,快速提供一个简易的 Web UI 开始服务。

    后端使用的是 Flask,前端使用的是 Ant Design。

    看一个例子:

    # example.py
    from datetime import datetime, date, time
    from enum import Enum
    import io
    import typing
    
    
    class Languages(Enum):
      Python = 'Python'
      PHP = 'PHP'
      Java = 'Java'
    
    
    def demo(int_: int, str_: str, float_: float, bool_: bool,
             enum_: Languages,
             datetime_: datetime = datetime.now(),
             date_: date = date.today(),
             time_: time = time(1, 2, 3),
             bytes_io: io.BytesIO = None,
             binary_io: typing.BinaryIO = None):
      pass
    

    会生成下面的界面:

    29 条回复    2019-12-02 21:13:41 +08:00
    ipwx
        1
    ipwx  
       2019-12-01 13:11:50 +08:00 via Android   ❤️ 2
    泼一桶冷水:fastapi 已经很完善了
    ila
        2
    ila  
       2019-12-01 13:43:06 +08:00 via Android   ❤️ 1
    swagger
    pengwkgood
        3
    pengwkgood  
    OP
       2019-12-01 16:16:09 +08:00
    @ipwx 我想解决的不是 fastapi 想要解决的问题。fastapi 结合 type annotation 出 API 方便、专业,加上 swagger 调试起来很舒服,但是不是准备给不懂开发的人用的。

    touch-callable 希望做到的是能生成一个简易但是非技术人员也能使用的 Web 界面,不需要使用这在界面上费心。只需要写好 function 加上 annotation 就好了。
    pengwkgood
        4
    pengwkgood  
    OP
       2019-12-01 16:16:41 +08:00
    @ila swagger 太专业了,不是给非技术人员使用的。
    rubycedar
        5
    rubycedar  
       2019-12-01 16:23:35 +08:00 via iPhone
    py 迟早变成 php
    pengwkgood
        6
    pengwkgood  
    OP
       2019-12-01 16:25:40 +08:00
    @rubycedar 这一起黑了,为什么?
    rubycedar
        7
    rubycedar  
       2019-12-01 16:30:06 +08:00 via iPhone   ❤️ 3
    @pengwkgood 编程就是程序员经过专业学习才能做的事情,为什么要考虑非技术人员?
    rubycedar
        8
    rubycedar  
       2019-12-01 16:42:25 +08:00 via iPhone   ❤️ 1
    为什么相比较而言大多数人都在黑 PHP ? PHP 不好吗?不是。PHP 开发者不积极维护吗?也不是。为什么网上的三个月速成就业班大多是针对于 PHP 而不是 Java 的?为什么 CTF 题里 Web 向的大多数都是和 PHP 相关的?不禁发人深省。🤔
    pengwkgood
        9
    pengwkgood  
    OP
       2019-12-01 17:01:36 +08:00
    @rubycedar 严肃的编程本身确实不需要考虑非技术人员。但是有多场景不需要那么严肃的编程,比如,想通过编程解决一些重复劳动、或者想做些小工具,做这些事情的人很多没有足够的专业知识或者没有足够的时间来做,提供这样一个工具给他们,就能降低难度,方便他们做出他们想要工具。
    pengwkgood
        10
    pengwkgood  
    OP
       2019-12-01 17:06:35 +08:00
    @rubycedar 语言的简单确实容易让很多人不受专业训练就能做,拉低从业人员水平。。。招黑
    renmu
        11
    renmu  
       2019-12-01 18:00:35 +08:00 via Android   ❤️ 1
    支持楼主,这样在公司可以快速做一些小工具作为 web 服务直接提供给同事,不要折腾去打包成 exe,希望楼主能添加更多的 demo
    BingoXuan
        12
    BingoXuan  
       2019-12-01 18:21:26 +08:00 via Android   ❤️ 1
    @rubycedar
    你有考虑一些其他专业人士吗?声学光学等方面的面向工业领域技术人员大多都用 LabVIEW 或者 MATLAB。对于他们来说,快速可用,可调试非常重要,直接在工作上使用 python 编写程序,其实是影响效率的。
    ipwx
        13
    ipwx  
       2019-12-01 18:39:00 +08:00   ❤️ 1
    感觉是个伪命题,“非专业人士”和你想象的“非专业人士”可能不太一样。至少照着 demo 引入一个库,加个什么函数装饰器,然后运行一个什么 xxxserver xxxmodule:xxxfunc 这样的命令启动一个 API server 还是没啥难度的,并不需要 Web UI。
    ipwx
        14
    ipwx  
       2019-12-01 18:39:53 +08:00   ❤️ 1
    你这东西要是给 AWS Lambda 之类的云服务器厂商用上也许还有点价值,至少给“非专业人士”免除了部署服务器的麻烦。
    pengwkgood
        15
    pengwkgood  
    OP
       2019-12-01 19:03:07 +08:00
    @ipwx 提供一个 API server 确实很简单,但是一个简单的内部服务或者小工具要调 API 才能用,那就很麻烦了。
    pengwkgood
        16
    pengwkgood  
    OP
       2019-12-01 19:05:12 +08:00
    @ipwx 嗯嗯,要是云函数有这个功能该多好啊!🤣做内部管理后台,写完云函数就有一个可用的了。
    pengwkgood
        17
    pengwkgood  
    OP
       2019-12-01 19:06:20 +08:00
    @renmu 谢谢你的支持,还给我发了 PR。你说的场景就是这个工具想要解决的。
    ClericPy
        18
    ClericPy  
       2019-12-01 21:02:35 +08:00   ❤️ 2
    之前发现函数可以自省以及类型注解以后, 确实想过函数可以自动转 UI (web ui, gui, terminal ui), 前段时间用 inspect 和 pydantic 弄了个类似的 https://github.com/ClericPy/ask4args , 主要是为了体验下 inspect 的一些用法, 后来发现 Gooey 和 Wooey, 感觉白折腾 UI 方面的了, 只要做好函数自省和类型转换的框架就够了...
    等真做完了发现, 并不太需要这玩意, 就当写着练手了...... 难怪 PM 总是因为一句"你不是真的需要"把需求砍了
    shidenggui
        19
    shidenggui  
       2019-12-01 21:27:54 +08:00   ❤️ 1
    感觉还不错,Google 有个类似的库,不过是将 function 变成 cli 的
    pengwkgood
        20
    pengwkgood  
    OP
       2019-12-01 23:36:16 +08:00
    @shidenggui 😊,Google 的 https://github.com/google/python-fire

    CLI 有两个问题:

    - 表达能力不够:CLI 的输入基本只能以字符串为主(文件什么的也是字符串的形式),不够直观。输出的展示也是字符串为主,或者字符画,对输出做可视化支持成本很高。Web 在这方面优势很大,基本就是选择框架,对接数据结构即可。
    - 不够易用:命令行需要在每个使用者的机器上都安装,懂命令行怎么使用,这要求使用者懂点技术。Web 只需网络和浏览器,这一点只要是网民都可以。
    cydian
        21
    cydian  
       2019-12-02 01:37:59 +08:00 via Android   ❤️ 1
    我赞成易用的 web
    支持楼主。
    rubycedar
        22
    rubycedar  
       2019-12-02 09:11:00 +08:00 via iPhone   ❤️ 1
    @BingoXuan 有道理🤔 不过还是这些非专业人士不小心写点漏洞 再不小心放在公网上 就成安全隐患了哈哈哈
    pengwkgood
        23
    pengwkgood  
    OP
       2019-12-02 20:14:38 +08:00
    @rubycedar 安全确实蛮重要的,我建一个 issue 跟进。😝
    pengwkgood
        24
    pengwkgood  
    OP
       2019-12-02 20:15:28 +08:00
    @cydian 谢谢!你目前有使用这种工具的需求吗?
    pengwkgood
        25
    pengwkgood  
    OP
       2019-12-02 20:18:33 +08:00
    @ClericPy 我觉得是这些工具都不是足够好用,所以大家没用起来。等输入输出支持的丰富些,做几个例子,大家能很直观感受到这种工具的价值,可能就会用起来了。
    pengwkgood
        26
    pengwkgood  
    OP
       2019-12-02 20:19:03 +08:00
    @BingoXuan 能具体说说他们的需求吗?
    pengwkgood
        27
    pengwkgood  
    OP
       2019-12-02 20:22:50 +08:00
    @ClericPy 嗯,我应该把这几个工具的异同都列出来放在 Readme 里。
    BingoXuan
        28
    BingoXuan  
       2019-12-02 21:11:41 +08:00
    @pengwkgood
    现阶段来说完成度已经非常高了,如果做成 jupyter notebook 类似就最好。分割成不同的块,允许用户根据需求执行不同的块。不过 jupyter 是承载代码,我觉得你可以加一个 table 控件用于承载函数的信息。最好能调用一些内置函数,如 sleep。
    ClericPy
        29
    ClericPy  
       2019-12-02 21:13:41 +08:00
    @pengwkgood #27 Just do "IT". 反正闲着也是闲着, 我也是为了避免长时间不敲代码手生, 才搞那么个玩意, 当时问 V2 有没有现成的轮子, 没问到, 就自己撸了试试, 看你的项目和我的时间还挺接近哈哈, 不过做到 web UI 的时候, 实在感觉无聊, 就丢那了, 实际上做到函数自省成一个 kwargs, 然后做好类型自动转换, 剩下的直接转命令行的 argparse 兼容格式, 就能直接套进 Gooey 和 Wooey

    这东西自己搞感觉搞不太起来, 搞起来也就自己在用, 不像 google 的 fire 和 linkedin 的 shiv, 那是他们内部确实大范围解决过问题的

    溜了溜了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2618 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 15:52 · PVG 23:52 · LAX 08:52 · JFK 11:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.