我发现,也许我应该试一试,看看它是否真的比Streamlit更好。虽然我喜欢Streamlit,因为它超级直观的编码体验和从稀薄的空气中生成应用程序的能力,但当你看到界面时,你就知道它是Streamlit。
为了解决这个问题,我写了一篇关于如何纯粹使用Python和Tailwind CSS开发漂亮网络应用程序的博客,这出乎意料地爆炸了。你可以在这里阅读。这个过程对生产更友好,但如果您也想构建可定制的原型呢?
这正是梅索普所做的。

TL;DR:Mesop仍处于初生阶段,所以不要开始在键盘上挖掘小费,从中构建SaaS初创公司。此外,它没有得到谷歌的正式支持。
Mesop的特点开源。易于开始使用预构建组件。惯用Python编写代码。热重新加载。组件基本上是Python函数。建立在Angular上。开始使用Mesop由于我讨厌用关于技术不同功能的长篇文献来烦人,让我们直接用Mesop构建一些基本的用户界面。使用Mesop构建时,您主要需要注意三个组件:

在开始之前,请确保使用pip install mesop安装mesop。
州级应用程序中使用的所有模型都是使用带有装饰器@me.stateclass的状态类实例化的。假设您正在构建一个GenAI应用程序,以使用标题和大纲生成文章,您必须创建一个名为“文章”的状态类,其外观如下:
像我一样进口梅索普@me.stateclass类文章:标题:str大纲:str回应:str
在我们创建的每个函数或组件中,此状态类数据将始终存在,并可在全球范围内访问。
页面和事件与状态类类似,所有页面都使用Mesop中的@me.page()decorator进行标记。
@me.page()def app():me.input(label="Title", type="text")me.input(label="Outline", type="text")
上述代码将生成一个包含两个输入字段的基本页面。为了能够将数据存储在我们之前创建的状态类中,每个字段都需要一个单独的函数。
def on_title_input(标题:me.InputEvent):s = me.state(文章)s.title = title.valuedef on_outline_input(outline:me.InputEvent):s = me.state(文章)s.outline = outline.value@me.page()def app():me.input(label="Title", on_input=on_title_input, type="text")me.input(label="Outline", on_input=on_outline_input, type="text")
要访问状态类,使用的函数是me.state()然后,实例存储在变量s中。
Mesop中的事件使用InputEvent、ClickEvent等类进行处理。
我们可以通过为ClickEvent调用另一个函数来提交输入数据。
#响应模式类博客(typing_extensions.TypedDict):标题:str内容:strdef on_title_input(标题:me.InputEvent):s = me.state(文章)s.title = title.valuedef on_outline_input(outline:me.InputEvent):s = me.state(文章)s.outline = outline.valuedef on_click(点击:me.ClickEvent):s = me.state(文章)prompt = f"就以下文章标题和大纲撰写博客:<article_title>{s.title}</article_title><article_outline>{s.outline}</article_outline>。仅以标记格式返回最终博客和标题。” #添加环境变量以存储钩子URL响应 = model.generate_content(提示,generation_config=genai.GenerationConfig(response_mime_type="application/json",response_schema=博客,温度=0.8))数据 = json.loads(response.text)s.response = 数据@me.page()def app():me.input(label="Title", on_input=on_title_input, type="text")me.input(label="Outline", on_input=on_outline_input, type="text")me.button(“生成博客”,on_click=on_click)
To make stuff interesting, we will be using the Gemini models to generate a blog using Mesop. The on_click function will fetch data s.title and s.outline from the Article instance and inject that into the prompt we have created. The response of the LLM will be a JSON containing the blog content.
款式Mesop中的样式元素与现有的CSS属性相似,但所有属性都是me.style()中的参数。
使用me.style()定义样式后,它们可以存储在变量中,并在组件本身中作为参数调用。
_STYLE_INPUT_WIDTH = me.Style(width="100%")_STYLE_BUTTON = me.Style(背景="#1976D2",color="#fff",padding=me.Padding.symmetric(水平=20,垂直=10),font_size="16px",cursor="指针",margin=me.Margin(底部=20),)@me.page()def app(): with me.box(style=_STYLE_CONTAINER):s = me.state(文章) with me.box(style=_STYLE_MAIN_COLUMN):me.input(label="Title", on_input=on_title_input, type="text", style=_STYLE_INPUT_WIDTH)me.input(label="Outline", on_input=on_outline_input, type="text", style=_STYLE_INPUT_WIDTH)me.button(“生成博客”,on_click=on_click,style=_STYLE_BUTTON) with me.box(style=_STYLE_PREVIEW_CONTAINER): 如果s.response:me.markdown(f"{s.response['content']}", style=_STYLE_PREVIEW)
最终界面
不是最好看的用户界面,但那是因为我没有努力设计足够的风格。它看起来仍然比原始HTML好得多,只需在这里和那里进行一些调整。通过对组件使用所有CSS属性的能力,您可以使UI独一无二。
Streamlit死了吗?不,绝对不是。Mesop仍在开发中,某些方面缺乏文档。部署Mesop应用程序并不简单,需要容器化,除非您直接将其部署到谷歌云。
Streamlit仍然有其自身的一系列优势,并且与Mesop相比从根本上更强大,特别是如果您想在数据可视化领域构建一些东西。此外,Streamlit Cloud对任何希望完全免费共享其应用程序的人来说都是福音。
然而,Mesop有增长的潜力,并且每天都在接收更新,由于其轻量级的性质,使其在REST API上工作的快速工具和简单原型更加可行。
感谢Will和Mesop的所有其他贡献者花时间和精力来开发和维护这样一个框架。
我们需要更多的UI框架看到新的Python UI框架弹出总是好的,例如Streamlit、Nicegui、Gradio和现在的Mesop。Python的惯用语法使编码更容易访问,这从现在Streamlit项目的数量中可以看出。
无论幸运还是不幸,Python是我学到的第一门编程语言,我立即爱上了它。有了更多这样的框架,Python的使用量将迅速增长,我希望将来能看到更多生产级的Python应用程序。
我希望你喜欢Mesop上的这个简短的博客,它将帮助你开始。我本可以更深入地研究,但时间的缺乏使我使这个博客更短,我也考虑了我们所有人的金鱼级别的注意力跨度。如果您能为这篇文章鼓掌,与Python和谷歌社区的更多用户分享,并关注我以获取更多此类文章,我将不胜感激。