# 將 python flask Web app 部屬到 Render 雖然 Render 上有提供簡單的步驟,但是實際操作上還是遇到許多困難。以下整理一下途中遇到的問題,以及解決的方法。由於 Heroku 的免費方案結束了,Render 作為其中一個替代方案相信也有人會使用。 ## 1. Flask 先準備好你的 flask 程式並將其部屬在 github 上 (或者 Render 可以支援的其他網站,這部分我沒有研究@@)。 接著準備兩個檔案放在 app.py 同一層的目錄底下: > 1. requirements.txt > 2. build.sh 其中 requirements 是告訴 Render 中的 python 我要使用的套件,之後透過 pip install -r requirement.txt 來安裝,這也是官方文件中的 build command。但是實際情形要複雜一點,所以這裡先把 requirements.txt 搞定。 ### requirement.txt ```shell= pip freeze > requirements.txt ``` 在 terminal 中輸入這行指令就會產生所有 pip 中使用的套件,但有一個問題是因為我是用 conda,在 conda 環境中每個套件後面都會帶有 @file://... 的文字。不過 Render 的環境當然沒有這些檔案位置,因此會造成 build 失敗,所以經過查詢使用 ([參考1](https://stackoverflow.com/questions/62885911/pip-freeze-creates-some-weird-path-instead-of-the-package-version)、[參考2](https://blog.csdn.net/qq_36078992/article/details/109435000)): ```shell= pip list --format=freeze > requirements.txt ``` 接著我們打開 requirements.txt: ```shell argon2-cffi==21.3.0 argon2-cffi-bindings==21.2.0 asttokens==2.0.5 attrs==21.4.0 backcall==0.2.0 beautifulsoup4==4.11.1 bleach==4.1.0 certifi==2022.9.24 ipython-genutils==0.2.0 ``` 形如 [套件名稱]==[版本號] 但是有一個問題是其實 build flask 的套件不用那麼多,而且其中也沒有 Render 啟動 flask app 的 gunicorn。 所以我們必須要保留必要的套件 flask,並加上 guicorn,另外 flask 的相依套件會在安裝時自動安裝,所以如 click、Jinja2 等套件都不用保留。 如果是非常簡單的 flask 的話可以只留 flask 跟 guicorn,至於其他就看 import 的套件中有哪些在使用前透過 pip install 安裝,就要寫在裡面。 以一個最簡單的 requirements.txt 為例: ``` gunicorn Flask==2.2.2 ``` ### build.sh 這個檔案就是「在 build 時要執行的指令」,相當於 Render 設定中的 build command,但是 build command 只有一行,所以就變成: 1. 先把所有指令寫好 2. Render 上的 build command 變成:「執行這些指令」 #### build.sh 的內容 首先需要: ``` #!/bin/bash ``` 這一行來讓這個 shell 檔變成可執行的。 接下來: ``` pip install --upgrade pip pip install -r requirements.txt ``` 第一行的意思是「請更新 pip」,不更新會報錯導致 build 失敗。 第二行就是原本 Render 提供的 build command,就是「安裝 requirements.txt 中的套件」 最後再總結: * requirements.txt ```= gunicorn Flask==2.2.2 ``` (若有使用其他套件要自行輸入) - build.sh ```= #!/bin/bash pip install --upgrade pip pip install -r requirements.txt ``` ⚠️ 注意如果是在 push 到 git 上之後新增檔案,記得 commit 後 push 上去。 ## 2. Render 上的設定 如果查閱官方文件,Render 提供三個步驟: 1. Environment 設定成 Python 2. **Build Command** 設定成 `pip install -r requirements.txt` 3. **Start Command** 設定成 `gunicorn app:app` 其中 1、3 都不用更改。 步驟 2 改成: > **Build Command** 設定成 `./build.sh` 「**./**」的意思就是「執行這個檔案」,因此使用這個指令就是告訴 Render 環境,執行剛剛我們寫好的 shell 指令。 接下來就可以試試看能否 build 成功了!🤩