前言:
上一篇文章,我們直接在AWS lightsail 主機上,開了一個bitnami Django stack。基本的介紹與檔案架構已經介紹完成,接著本文就要來進行第二的部分,也就是修改檔案內容,以及在伺服器上啟動一個服務程式。讓我們用瀏覽器打上伺服器外部的IP,進而看到我們的Hello World Online網頁。
若你還沒看過第一篇,先點這裡看看吧
Django – 跑在Server上的第一個Hello World (1)
本系列文章架構如下 –
- A. 安裝Django
- B. 創建專案 Startproject
- C. 創建APP Startapp
- D. 修改內容
- E. 啟動服務
- F. Apache 託管
- G.完成
礙於篇幅以上ABC 將整為第一篇文章、DE為第二篇文章、FG為第三篇文章
Photo by Geran de Klerk on Unsplash
實際操作:
我們繼續用SSH連入主機進行內容的修改。再次重申,一般正常的方法是先在本地的IDE上開發,然後再把程式部署到主機上。我們這裡將會直接在主機上修改文件,為的是帶大家了解整體在線上運作的流程,變成即戰力。後面就不再解釋開發流程了。有道是黑貓白貓能抓老鼠就是好貓。
還不知道怎麼用SSH快速連入主機的人,可以看這篇
D. 修改內容
接著我們要開始製作HelloWorld的網頁了,讓我們再複習一下專案資料夾裡面有什麼
專案資料夾V1內容
V1/
├── manage.py
└──[V1]
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
應用程式SayHelloOnline 資料夾內容
V1/
├── manage.py
├── [V1]
└── SayHelloOnline
├── admin.py
├── app.py
├── __init__.py
├── [migration]
├── settings.py
├── urls.py
└── wsgi.py
等等會修改的內容有
- 第一步 :專案資料夾V1 裡面的 setting.py
- 第二步 :專案資料夾V1 裡面的 urls.py
- 第三步 :新增專案資料夾V1裡面的應用程式資料夾SayHelloOnline裡面的urls.py
- 第四步:應用程式資料夾SayHelloOnline裡面的views.py
第一步 : 修改專案資料夾V1 裡面的 setting.py
在主機上直接修改的方法可以直接用nano編輯器來處理。
sudo nano setting.py
編輯器打開檔案後,找Installed_apps這邊的意思是要把我們自己新增的APP註冊上去,讓專案知道,這APP是專案的一部分。
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'SayHelloOnline',
]
還要設定一個地方 找到ALLOWED_HOST的地方,把主機的外部IP填入
ALLOWED_HOSTS = ['XX.XX.XX.XX']
若沒有填入正確IP,未來執行 run server 的時候,則會出現以下的錯誤訊息 (XX.XX.XX.XX 是你的主機IP)
DisallowedHost at /
Invalid HTTP_HOST header: 'XX.XX.XX.XX:8000'. You may need to add 'XX.XX.XX.XX' to ALLOWED_HOSTS.
Request Method: GET
Request URL: http://XX.XX.XX.XX:8000/
Django Version: 3.1
Exception Type: DisallowedHost
Exception Value:
Invalid HTTP_HOST header: 'XX.XX.XX.XX:8000'. You may need to add 'XX.XX.XX.XX' to ALLOWED_HOSTS.
Exception Location: /opt/bitnami/python/lib/python3.8/site-packages/django/http/request.py, line 137, in get_host
Python Executable: /opt/bitnami/python/bin/python
Python Version: 3.8.5
Python Path:
['/home/bitnami/V2',
'/opt/bitnami/python/lib/python38.zip',
'/opt/bitnami/python/lib/python3.8',
'/opt/bitnami/python/lib/python3.8/lib-dynload',
'/opt/bitnami/python/lib/python3.8/site-packages',
'/opt/bitnami/python/lib/python3.8/site-packages/setuptools-46.4.0-py3.8.egg',
'/opt/bitnami/python/lib/python3.8/site-packages/pip-20.2.1-py3.8.egg',
'/opt/bitnami/python/lib/python3.8/site-packages/virtualenv-20.0.30-py3.8.egg',
'/opt/bitnami/python/lib/python3.8/site-packages/six-1.15.0-py3.8.egg',
'/opt/bitnami/python/lib/python3.8/site-packages/filelock-3.0.12-py3.8.egg',
'/opt/bitnami/python/lib/python3.8/site-packages/distlib-0.3.1-py3.8.egg',
'/opt/bitnami/python/lib/python3.8/site-packages/appdirs-1.4.4-py3.8.egg']
Server time: Thu, 12 Nov 2020 09:19:58 +0000
......
.......
第二步:修改專案資料夾V1 分面的 urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import include
urlpatterns = [
path('hello/',include('SayHelloOnline.urls')),
path('admin/', admin.site.urls),
]
主要是把 SayHelloOnline.urls 給 include進來,讓專案載入應用程式的路徑檔、也設定好應用程式的存取網址。這是什麼意思??
*為了幫助你了解,這邊要先跳出來特別另外說明一下: 這也是未來連線登入進來的時候,後面要加的路徑名。如下圖,因為網址只有打http://3.34.X.X:8000 ,所以它跳警告說,找不到頁面。目前有登記在V1.urls的有下面兩個資料夾路徑
網址若改成http://3.34.X.X:8000/home 就成功出現了,這後面的home,就是在專案資料夾裡面的urls.py裡面設定的
看到了嗎? path (‘hello/’….. 這就是未來django app的存取路徑
path('hello/',include('SayHelloOnline.urls')),
好了,知道這個的重要性了吧。到這邊我們再跳回去原本的進度,繼續說明。
這邊有個坑,有可能執行後,你的django報錯如下,說找不到include的功能,
NameError: name ‘include’ is not defined
那就一定要把下面的程式碼,擺在第三行。把 include這個功能匯入。
from django.conf.urls import include
第三步:新增專案資料夾V1裡面的應用程式資料夾SayHelloOnline裡面的urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
]
這邊主要就是把views裡面定義的function叫出來。而後面的name =”……
這部分可以參考此文章
第四步:修改應用程式資料夾SayHelloOnline裡面的views.py
一樣直接打“ sudo nano 檔名 ” 來新增一個views.py檔案
from django.shortcuts import render
# Create your views here.
from django.http import HttpResponse
def index(request):
return HttpResponse("Hello world ,Online.")
def index 定義出index這個function,這功能裡面就是列出”Hello world ,Online.”的字串。
關於views.py 這邊有一篇深入的教學
E.啟動服務
在本機開發的時候,只要在終端機程式切換專案資料夾內,再打入
python manage.py runserver
接著開瀏覽器 打入 http://127.0.0.1:8000
就能看到Hello World網頁正常運作了,然後就收工了。這樣的教學去Google翻找,比比皆是。但若搬到線上的服務器,用一樣的指令、或是換成Server的IP,一樣會得到下面的畫面。
天!怎禁止存取了,看別人教程不是很簡單嗎? 自己在本機做也是非常簡單。現在該怎麼辦?
這就是想像跟實際執行的差異,若不說,你一定會找Django的程式碼找半天。原來是防火牆擋住了,網路主機的防火牆沒有開Port,我們又如何透過瀏覽器存取主機的8000 Port呢?
先到後台,點開主機。 接著選擇Networking => Firewall =>Add Rule
如下圖,打入通訊格式為TCP 然後輸入8000 ,這邊的意思就是讓主機把埠號8000這個port打開。
接著我們回到終端機程式,在專案資料夾內打入下面指令 (也就是資料夾裡面有manage.py 這個檔案的地方,若不知道可以打 ls ,來列出檔案。)
這邊 IP就指為0.0.0.0
python manage.py runserver 0.0.0.0:8000
補充一下,為什麼要打0.0.0.0 ?
- 在服務器中,0.0.0.0指的是本機上的所有IPV4地址,如果一個主機有兩個IP地址,192.168.1.1 和10.1.2.1,並且該主機上的一個服務監聽的地址是0.0.0.0 ,那麼通過兩個ip地址都能夠訪問該服務。 … 當一台主機還沒有被分配一個IP地址的時候,用於表示主機本身。 (DHCP分配IP地址的時候)
參考文章連結
F.完成
其實上面先給大家看過了,所以不同的應用程式,可以設定在不同的路徑名。
複習一下本文用到的指令
指令 | 說明 |
---|---|
ls | 列出當前路徑裡面的檔案與資料夾 |
cd [foldername] | 切換資料夾 |
sudo nano [filename] | 開啟nano文字編輯器,按Ctrl + O 可以存檔 、按下Ctrl+X可以離開 |
python manage.py runserver 0.0.0.0:8000 | 啟動開發伺服器 |
小結:
整理一下,本文提醒大家,這邊會有三個坑
- project setting.py 裡面ALLOW HOST IP 要填
- project urls.py 裡面 include調用前 要先加 from django.conf.urls import include在第三行
- 記得在主機後台新增防火牆的TCP 8000 port才能做遠端測試
現在Django的Hello World , Online,雖然已經在瀏覽器,透過存取主機獨立的IP看到了,但這不是一個正規的做法,充其量還是一個開發階段的做法。正規的方法是轉交由網頁伺服器,例如Apache 去處理Django程式對外部Client或API的存取。
當然這是一個很好的開始,應該可以你閃掉很多坑,避免浪費大量時間卡關,特別是新手,我知道你會非常無助。後續如何真正讓Apache託管,透過80埠存取Django生成的網頁? 航道已經進行一半了,讓我們下一篇見。