熱線電話:13121318867

登錄
首頁精彩閱讀如何在網頁中執行一段 pandas 代碼?(CDA官網干貨內容分享)
如何在網頁中執行一段 pandas 代碼?(CDA官網干貨內容分享)
2022-01-11
收藏

作者:劉早起

來源:早起Python

如何在線執行 pandas 代碼感興趣,今天就簡單來說一下我探索這一功能的過程。

首先在設計這一功能時,需要先明確大致需求:

  • ???用戶可以在當前頁面執行
  • 不同用戶之間獨立運行
  • 不需要加載額外代碼或操作

其中最重要的一點就是用戶可以在當前網站、當前單元格執行代碼,其次盡可能的減少其他操作。

其實為了實現這個功能,我探索了大半個月,不斷修改方案,刪掉了幾個寫了很久但是不能完美實現的代碼,幾度放棄,最后還是磕磕碰碰的做出來,下面是我的一些經驗,僅供參考。

方案1

首先最簡單的思路就是用自己的服務器,前端寫一個輸入框,然后將用戶提交的代碼到后臺,執行后再返回前端,就像這樣

如何在網頁中執行一段 <a href='/map/pandas/' style='color:#000;font-size:inherit;'>pandas</a> 代碼?

但是思索了一番還是放棄了,除了要防止惡意用戶執行sudo rm - rf /*之類的代碼,為了滿足第二個需求就要給每個用戶分配一定的空間,這就很吃服務器的配置,例如前天最高100+用戶同時運行,我的 4c8g 服務器肯定是帶不動的。

并且如果采取這個的方案,理論上可以實現,但除了升級服務器要錢,我也沒有開發類似產品的經驗,時間成本不好預估,遂放棄。

方案2

之后又是一番面向 stackoverflow 編程,我了解到很多可以在線執行代碼的網站,就像這樣

如何在網頁中執行一段 <a href='/map/pandas/' style='color:#000;font-size:inherit;'>pandas</a> 代碼?

確實可以在線執行一段代碼,但是除去我是否能做出來,如何控制權限等問題,這樣的網站主要是以執行代碼為主,無法完成 pandas 教程的任務。

并且代碼不能預設置,只能進入頁面后手動輸入,本地數據也不好加載,而且執行一次就要跳轉到一個新的頁面,十分繁瑣(寫一個爬蟲接口也是一個辦法,但是就太依賴對方網站),于是很快放棄了這條思路。

Jupyterhub

繼續一番搜索后,我發現了一個神器 —— Jupyterhub

如何在網頁中執行一段 <a href='/map/pandas/' style='color:#000;font-size:inherit;'>pandas</a> 代碼?

如上圖架構展示的一樣,使用Jupyterhub 可以給每個用戶分配一個獨立的Jupyter Notebook,并且無需考慮權限等問題,我也可以提前將代碼和數據進行預設。

但問題在于采取此方案無法滿足教程需求,因為全部內容都需要放在 Jupyter Notebook中,整體上就是將 pandas300題做成了在線版,而我想要的是一個網站。

并且使用Jupyterhub不可避免的要進行一些 docker 或 k8s 操作,這也不是我熟悉的領域,雖熱在這條思路上走了一段時間,但還是放棄了。

JupyterBook

之后又是一番檢索,但無非都是上面幾種方案,在我感覺要放棄做這個網站時,無意中發現一個項目JupyterBook

如何在網頁中執行一段 <a href='/map/pandas/' style='color:#000;font-size:inherit;'>pandas</a> 代碼?

簡單來說,他可以將你的 Jupyter Notebook 轉換為 html 頁面(基于 sphinx),并且一個很重要的特點就是可以在線、交互式執行代碼。

如何在網頁中執行一段 <a href='/map/pandas/' style='color:#000;font-size:inherit;'>pandas</a> 代碼?

具體怎么實現的呢?首先需要將你的項目上傳到一個公共資源平臺binder,這個網站會為你的項目創建一個鏡像,這樣可以方便給不同用戶使用

如何在網頁中執行一段 <a href='/map/pandas/' style='color:#000;font-size:inherit;'>pandas</a> 代碼?

簡單來說,可以理解為將你的 Jupyter Notebook 掛在這個網站,別人就能去在線執行,但是很明顯,我們都需要跳轉到這個頁面去使用,而我希望在當前頁面執行代碼。

這時就需要在使用另一個項目(Thebe

如何在網頁中執行一段 <a href='/map/pandas/' style='color:#000;font-size:inherit;'>pandas</a> 代碼?

它使用JupyterLab API,通過加載一段JS代碼,再指定一個執行后端(上面提到的binder),就可以在當前頁面執行代碼。

聽起來很復雜,但是實現起來很簡單,上面我們說到,JupyterBook 是基于 Sphinx制作頁面的,所以只需要提前在配置 Sphinx時加載 sphinx_thebe插件即可,

如何在網頁中執行一段 <a href='/map/pandas/' style='color:#000;font-size:inherit;'>pandas</a> 代碼?

至此,開頭我需求中的1、2就完美實現了,還剩最后一個問題就是如何讓用戶更少的執行代碼?

如果你體驗過我的網站,你會發現執行一個 pandas 操作連 import pandas as pd和讀取數據的操作都不用!

其實這些代碼在啟動jupyter notebook時就預先加載了,只需要在對應單元格上加上 thebe-init的 tag 即可。

當然,使用 JupyterBook 還是有很多坑,消耗我最多的時間就是在修改樣式上,默認的樣式如下,可能英文狀態下表現還行,但是到中文并不是很適配

如何在網頁中執行一段 <a href='/map/pandas/' style='color:#000;font-size:inherit;'>pandas</a> 代碼?

為了大家不僅用的爽,我對網站顏值的要求也很高,于是爆改了幾千行的 css 和 js 代碼,甚至組件的位置都調整到小數點后兩位才讓我滿意,磕磕碰碰一個多月終于將整個網站做出來

最后,本文僅是對在線執行代碼做了一個快速、不完整的總結。由于篇幅限制,還有很多搭建、部署網站細節的內容沒有涉及到,如果你覺得不錯,歡迎點贊、轉發。

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢