[譯] 通過 SSH 遠端使用 Python 直譯器來執行 Flask

你的可嚶已上線發表於2018-07-06

許多應用程式中出現 bug 的普遍原因是開發環境和生產環境不同。雖然在大多數情況下不可能為開發提供生產環境中的精確副本,但追求生產-開發的均衡是值得的。

大多數應用程式會被部署到某種型別的 Linux 虛擬機器中。或許你正在使用的是傳統的 web 主機,即所謂的 VPS 主機。

如果我們想在一個類似於我們生產環境的環境中進行開發,那我們如何才能做到這一點呢?最好的方法就是為了開發目的而設定第二個虛擬機器。讓我們看看 PyCharm 是如何連線到 VPS 環境。

我們的應用程式

我太懶了,所以我將使用自己去年做的一款 web-app 作為示例。該應用程式是一個非常簡單的老式留言系統。在去年的部落格中,我使用 Dockeer Compose 來描述了一個包含 Python 服務和 PostgreSQL 資料庫的環境。

首先克隆倉庫,然後切換到 ‘with-database’ 分支。開啟專案之後,我們需要配置伺服器。我使用 AWS EC2 例項,但是你也可以使用任何其他的 Linux 環境(包括樹莓派)。

想要配置直譯器,請開啟設定/專案設定,並使用齒輪圖示新增直譯器:

新增直譯器

在左邊選擇 SSH。如果你沒有看到 SSH,首先要確保自己使用的是 PyCharm Professional 2018 或者更高版本。然後,按照指示連結到 SSH 框即可:

連線到 SSH

在本教程中,我們將主要使用預設值。唯一的例外是你的 Linux 環境只安裝了 Python 3,而且並沒有將 /usr/bin/python 連線到該版本。考慮到 AWS 的當前版本 Ubuntu 16.04 AMI,我們將確保會更改直譯器路徑:

新增 SSH 直譯器 —— 第二步

我們配置好直譯器後,就可以開始執行程式碼了。比如,開啟 Python 控制檯,就可以在遠端控制檯上執行程式碼了:

Python 遠端控制檯

在我們可以執行我們 Flask 指令碼之前,還有一些事情需要我們處理。

配置我們的環境

Docker Compose 非常方便,因為它允許我們以非常簡潔的方式指定和配置伺服器。如果我們想要在常規 Linux 機器上工作,我們需要自己處理這個配置。因此,我們先開始下載 PostgreSQL。

開啟 SSH 會話,也可以轉到工具/SSH 會話,或者使用 Ctrl+Shift+A 查詢 ‘Start SSH session’ 操作:

開啟 SSH 會話

現在,我們可以執行 sudo apt-get install postgresql。如果你正在樹莓派上實驗,也是如此。如果我們正在開發一個應用程式,那麼記錄我們正在做的事情,可以確保我們以後正確重現環境。

一款配置 Linux 機器的優秀軟體是 Ansible。使用 Ansible,我們可以通過 YAML 檔案來描述 Linux 伺服器的所需狀態,然後使用 Ansible 工具來應用所需的配置。

用 Ansible 安裝 PostgreSQL,如下所示:

- hosts: localhost
  become: yes
  tasks:
   - name: Install PostgreSQL
     apt:
       name: postgresql-9.5
複製程式碼

如果我們使用這些內容新建一個 setup.yml 檔案,PyCharm 會自動將其上傳到我們在專案配置期間配置的位置。預設情況下,這是 /tmp/ 的子資料夾。因此,我們先安裝 Ansible,導航到這個資料夾,執行這個檔案(在 Ansible 術語中稱為 playbook)。你可以通過在伺服器上執行這些命令(使用你之前啟動的 SSH 會話)來實現這一點:

sudo apt update && sudo apt install -y ansible
cd /tmp/pycharm*
ansible-playbook ./setup.yml
複製程式碼

看下這個,PostgreSQL 已經安裝了:

Ansible Output

我們可以使用 Ansible 做一些更酷的事情,比如配置虛擬環境:

- name: Install pip
  apt:
    name: python3-pip

- name: Copy requirements
  copy:
    src: requirements.txt
    dest: /tmp/requirements.txt

- name: Install virtualenv
  pip:
    name: virtualenv
    executable: pip3

- name: Set up virtualenv
  become: false
  pip:
    requirements: /tmp/requirements.txt
    virtualenv: /home/ubuntu/venv
    virtualenv_python: python3
複製程式碼

我們將這些任務新增到 playbook(setup.yml)並重新執行之後,就可以重新配置 PyCharm 來使用遠端 venv 而不是我們環境的系統直譯器。為此,請返回到設定直譯器的介面。使用齒輪圖示選擇“顯示所有”,然後單擊鉛筆編輯直譯器。更改虛擬環境 (/home/ubuntu/venv/bin/python)中 Python 可執行檔案的路徑:

修改直譯器

既然我們已經準備妥當,我們可以執行 Flask 來執行配置。讓我們先編輯它,這樣它就可以從外界獲取。我們需要提供 host=0.0.0.0 作為 Flask 的附加選項:

Flask Run Configuration

如果你在 AWS 或類似的提供者上執行此程式碼,則可能需要在防火牆中開啟埠 5000。在 AWS 上,你需要向安全組新增一個新規則,允許 TCP 埠 5000 上的入站流量從 0.0.0.0/0 開始。

現在點選 debug 按鈕來執行 Flask:

Flask Starts

讓我們訪問下我們的頁面!

500 Error

用 Butters Stotch 的話來說:oh hamburgers。如果我們回顧一下 PyCharm,就會在除錯視窗看到堆疊的跟蹤資訊,這表明我們仍然需要完成資料庫連線。

在 Flask 應用程式中,為了用於 Docker Compose 配置,資料庫主機被設定為 ‘db’。我們將其改為 127.0.0.1

g.db = psycopg2.connect(dbname='flaskapp',
                       user='flaskapp',
                       password='hunter2',
                       host='127.0.0.1')
複製程式碼

我們實際上還需要建立資料庫和表。感謝我們的朋友 Ansible 可以幫助我們!為了保證這篇部落格更短一些,我會跳過一些細節。切換到 ‘ansible’ 分支。然後執行以下 SSH 命令:

cd /tmp/pycharm*
ansible-playbook setup.yml
ansible-playbook clean-db.yml
複製程式碼

第一個劇本會配置 PostgreSQL 使用者賬戶。第二個劇本會刪除已存在的資料庫,然後建立一個乾淨的資料庫。在這個資料庫中,執行 schema.sql 檔案來建立這個應用程式所需要的表。

你還可以使用 PyCharm 來執行 SQL 命令並檢查資料庫。 閱讀我們關於在樹莓派上執行程式碼的文章來了解更多內容

The Finish Line

在設定資料庫後,我們應該可以使用除錯配置再次啟動 Flask,並檢視我們的炫酷的留言系統:

Results

當然,如果我們要在程式碼中新增一個斷點,我們現在就可以選中它了。嘗試一下,然後告訴我們它的進展!

如果你對 DevOps 感興趣,而且想了解更多資訊:閱讀我們的 AWS 高階教程、我們的樹莓派教程或者我們的 Docker Compose 教程。如果你還有其他想了解的內容,請在評論中告訴我們!

如果發現譯文存在錯誤或其他需要改進的地方,歡迎到 掘金翻譯計劃 對譯文進行修改並 PR,也可獲得相應獎勵積分。文章開頭的 本文永久連結 即為本文在 GitHub 上的 MarkDown 連結。


掘金翻譯計劃 是一個翻譯優質網際網路技術文章的社群,文章來源為 掘金 上的英文分享文章。內容覆蓋 AndroidiOS前端後端區塊鏈產品設計人工智慧等領域,想要檢視更多優質譯文請持續關注 掘金翻譯計劃官方微博知乎專欄

相關文章