# PyCon TW 2023 演講 Draft [TOC] # 你就仗著 pynecone 這點好學 這點全端 ## 1.pynecone 發展簡介 - (共 3 min) - 它的使命是:盡可能將 React 全部的能耐帶過來用,同時又以 python簡易方式來用 - 市場定位分析 - 寫給關注未來趨勢的您 - 目前狀況-截至 2023 年 7 月,我們處於 Public Beta 階段。 - ✅ Public Alpha: 任何人都可以安裝與使用 Reflex,或許包含問題, 但我們正在積極的解決他們。 - 🔶 Public Beta: 對於不涉及商業目的使用情境來說足夠穩定。 - Public Hosting Beta: Optionally, 部屬跟託管你的 Reflex! - Public: 這版本的 Reflex 是可用於軟體產品的。 - 目前適合發展定位 - Maker 創客 - 國中生、大學生、研究生專案 - 發展各類慈善類 side-project - 與開發社群一起貢獻與前進 - 預測未來定位 - 通用 WebApp 方案,帶動就新的全端開發者的新就業市場 - 使用小的研發成本,作更彈性的市場客製化。 - WebApp通用解,更接近市場,不再只是求職中的輔助技能,**讓 Python 語言成為求職時的主技能**。 - 因為單一語言與單一檔案就能打造全端開發的特性,非常適合用 ChatGPT 溝通便可拿作各類全端應用。 - 經濟架構面 - 寫給在商業的您 - 2023 Q1 全球成長最快開源新創 - 2023 8 月 5M USD(約1億5千萬台幣)的種子輪投資,天使投資人包含**ChatGPT 陣營的 Altman** 以及 CTO, Cortex at **Palo Alto Networks** 等。 - 與 streamlit 全focus於Data的市場定位不同,主要是WebApp通用解決方案 - 相似方案 Anvil, PyWebIO, Atri Lab ,以 Anvil 最為類似,但該方案需付費也閉源,直接被綁住在特定IDE環境。開發上受限。 - 技術架構面 - 寫給的喜愛技術開發的您 - 以 **React** 為前端: 採取 bun-runtime 作 nextjs server-side rendering - Server-side rendering React 有很好的效能 ![](https://hackmd.io/_uploads/SJTU1HWg2.png) 這篇介紹 Bun runtime https://www.youtube.com/watch?v=O-NWCjC9iRw - python FastAPI 接後端,ORM 支持 sqlite, postgreSQL, Supabase (Firebase的開源替代方案) - 開發者體驗(Development Experience): 對開發者而言,就是一個 .py 檔的簡易性 - **真正的 Low Code** , 開發體驗方便,可以拿來教國中生。 - Milo 目前是 Reflex 全球(非員工)貢獻數量最多的 open source developer ## 2. 初始環境設定 - (共 2 min) - VSCode + conda + n (poetry也行但台灣比較少人用) - live demo - 使用 pynecone-colab-ide 開源 (1 min) - Windows 機器在學校有很多狀況,但用colab就不怕了 - https://github.com/milochen0418/pynecone-colab-ide - live demo ## 3. 布署與發佈 (共 5 min) ### 3.1 佈署到自己的伺服器 Self-Hosting (3 min) 這個是我部署好的貪石蛇 https://pynecone-frontend.covidicq.net 以下是我的 nginx 設定檔 我 backend跑 8701 port 透過 pynecone-backend.covidicq.net 提供服務 ```conf= server{ server_name pynecone-backend.covidicq.net; location / { proxy_pass http://localhost:8701; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # WebSocket support proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_redirect off; } listen 443 ssl; # managed by Certbot ssl_certificate /root/wildcard.covidicq.net/fullchain.pem; # managed by Certbot ssl_certificate_key /root/wildcard.covidicq.net/privkey.pem; # managed by Certbot } ``` 我 frontend跑 3711 port 透過 pynecone-frontend.covidicq.net 提供服務 ```conf= server{ server_name pynecone-frontend.covidicq.net; location / { proxy_pass http://127.0.0.1:3711; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # WebSocket support proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_redirect off; } listen 443 ssl; # managed by Certbot ssl_certificate /root/wildcard.covidicq.net/fullchain.pem; # managed by Certbot ssl_certificate_key /root/wildcard.covidicq.net/privkey.pem; # managed by Certbot } ``` 專案的config 設定中,記得 api url 要設到 pynecone-backend.covidicq.net 去 以下是 pcconfig.py 算是舊版時的設定檔,它是配合上方nginx 一起搭配的 切換到 reflex 之後就是使用 reflex 了 ```python= import pynecone as pc general_deploy_config = pc.Config( app_name="practice", port=3711, backend_port=8701, api_url="https://pynecone-backend.covidicq.net", bun_path="$HOME/.bun/bin/bun", db_url="sqlite:///pynecone.db", env=pc.Env.PROD, ) development_config = pc.Config( app_name="clock", port=3001, backend_port=8001, api_url="http://localhost:8001", bun_path="$HOME/.bun/bin/bun", db_url="sqlite:///pynecone.db", env=pc.Env.DEV, ) orig_config = pc.Config( app_name="practice", db_url="sqlite:///pynecone.db", env=pc.Env.DEV, ) config = general_deploy_config #config = development_config ``` ### 3.2 使用官方的布署發佈 (1 min) reflex deploy (尚未支援) ![](https://hackmd.io/_uploads/H1XMG_-A3.png) ### 3.3 透過 pynecone-colab-ide 一鍵發佈成果(1 min) live demo ## 4. pynecone 應用開發實作 - (共 15 min) - 與 DB 資料庫 整合應用 : DB 資料庫運用現成的 ORM 來作 - https://reflex.dev/docs/database/overview/ - 國中生案例 - 與 AI 人工智慧整合應用: 請參考 GPT Demo ,這是使用 ORM 以及 Database 的實作 (直接run code) - 3.4. 國中生案例 - 與 物聯網 IoT 整合應用: 物聯網 IoT 整合應用比較少, 這邊多說明 ![](https://hackmd.io/_uploads/rysE7OWRn.png) ![](https://hackmd.io/_uploads/HyBIEOZC3.png) 由於 IoT 的世界是個複雜高度變化的 distributed system,而 publish subscribe pattern 是這方面很好用的解。因此我們可以透過 reflex 的 API Route,將 reflex webapp 與 IoT 作結合。 - 範例 https://github.com/reflex-playground/reflex-community-examples/tree/main/iot-mqtt - MQTT 簡介 https://ithelp.ithome.com.tw/articles/10224407 - reflex 能實現線上多人即時協作 - reflex 能與 MQTT 整合 - reflex 可以包入 mobile app 內 {%youtube q2ydu3Wl-T0 %} ## 5. 國中生教學現場分享 (共 5 min) 好奇心是科技創新源頭 {%youtube exqGg79vrVA%} WebApp DALL-E {%youtube nn14TmbJOyk%} Python 控制作吸塵器 {%youtube b9ybCF6fcZc%} Python 控制設計亮燈 {%youtube dwFug9qFcTw%} ## 6. 其它資訊 想參與 Reflex 專案貢獻的人,可以從這篇了解起 https://hackmd.io/@milochen0418/reflex-contribute-sprints **9/16 周六 Taipei Hackerspace 烤肉,大家可以來聚聚** 更多聊聊 Reflex 這個東西,一起來build 台灣的 Python WebApp 開發者小社群 想來的可以會後,直接來跟我面對面聯絡,我先幫大家預約烤肉人數 有開發的問題,可以在這邊線上討論 https://github.com/reflex-playground/reflex-community-examples