Django – 跑在Server上的第一個Hello World (2)

django_online_hello_world

前言:

上一篇文章,我們直接在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快速連入主機的人,可以看這篇

架站101站長基本工具-使用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啟動開發伺服器

小結:

整理一下,本文提醒大家,這邊會有三個坑

  1. project setting.py 裡面ALLOW HOST IP 要填
  2. project urls.py 裡面 include調用前 要先加 from django.conf.urls import include在第三行
  3. 記得在主機後台新增防火牆的TCP 8000 port才能做遠端測試

現在Django的Hello World , Online,雖然已經在瀏覽器,透過存取主機獨立的IP看到了,但這不是一個正規的做法,充其量還是一個開發階段的做法。正規的方法是轉交由網頁伺服器,例如Apache 去處理Django程式對外部Client或API的存取。

當然這是一個很好的開始,應該可以你閃掉很多坑,避免浪費大量時間卡關,特別是新手,我知道你會非常無助。後續如何真正讓Apache託管,透過80埠存取Django生成的網頁? 航道已經進行一半了,讓我們下一篇見。

Photo by Taylor Murphy on Unsplash

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *