在前一篇當中,我們已經產生了一個叫做 myweb 的專案,接著要建立一個應用程式(App)。
這部份基本上也可以參考 Django 官方的教學文件 [1]。
專案(Project)與應用程式(App)的關係為何?
其實因為本來我在看文件時,都會跳著看我需要的部份,所以忽略了其中一小部份細節,導致花了很多時間實驗為什麼結果不如預期
而被我忽略的地方就是 Project 和 App 這段。
在 Django 當中,一開始透過 startproject 指令建立的是 Project,也就是前一篇當中建立的 myweb。
但 Project 裡面又可以建立 App,那麼 Project 跟 App 的差別在哪呢?
從 [1] 的官方文件中,對於 Project 和 App 差異的描述如下。
What’s the difference between a project and an app? An app is a Web application that does something – e.g., a Weblog system, a database of public records or a simple poll app. A project is a collection of configuration and apps for a particular website. A project can contain multiple apps. An app can be in multiple projects.
具體來說,其實我也不知道該怎麼分類 Project 跟 App,不過依據浪費的時間告訴我的是,實作應該要寫在 App 裡
Project 只是用來建立整個網站的全域設定用的。
PS. 這是目前我的理解,當然這也不一定完全正確。
接著這裡先跳一下,來比較一下 Project 的資料夾和 App 的資料夾的差異。
首先是 Project 的資料夾:
[project_name] ├─── __init__.py ├─── settings.py ├─── urls.py └─── wsgi.py
再來是 App 的資料夾:
[app_name]
├─── migrations
└─── __init__.py
├─── __init__.py
├─── admin.py
├─── apps.py
├─── models.py
├─── tests.py
└─── views.py
其實從資料夾的結構也可以看出,Project 跟 App 的功能完全不同,例如 Project 並沒有 Admin 介面等等。
建立並設定應用程式(App)
建立應用程式
要建立 App,需要透過 startapp 指令來建立。這裡先假設要建立的 App 是部落格,所以就命名成 blog 吧。
python manage.py startapp blog
這樣就建好一個應用程式了 XD。可以檢查一下,正常來說 Django 應該會幫忙產生好上述的 App 資料夾。
在應用程式中建立預設的首頁
在 App 資料夾中,可以找到 view.py 這個檔案(也就是在這個例子中,位在 /blog/views.py)
可以在裡面先寫上一個最簡單的 Hello World~XD
from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.
def index(request):
return HttpResponse("Hello world")在 views.py 裡追加了 index 這個函式,並且指定輸出 “Hello world” 這個字串。
這樣就完成一個只會吐出 Hello world 字樣的頁面了。
為剛剛建立的頁面設定連結
接著要告訴 Django,當網站的哪些連結被存取時,要回覆 index 給客戶端。
這裡會分成兩個階段的工作,第一個階段是在 App 當中建立規則,第二個階段則是在 Project 中建立規則。
首先是在 App 中建立規則的部份,因為 Django 對於網址的規則習慣用 urls.py 檔案,因此這裡依循習慣也使用 urls.py 來建立。
在 blog 資料夾中建立一個新的檔案 urls.py(亦即 /blog/urls.py)後,在裡面寫上下述的程式碼:
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.index, name='index'),
]這段程式碼的重點在於第六行,也就是宣告當存取這個 App 時
只要網址符合指定的正規表示式 “^$” 的條件,就以 views.index() 這個函式來服務他
而 views.index() 當然如上述所說,只會回覆 Hello world 字樣。
再來第二階段是要在 Project myweb 裡註冊 blog 這個 App,否則 Project 不知道遇到什麼網址時要讓客戶端存取 blog。
這時要在 myweb 的資料夾中,修改 urls.py(亦即 /myweb/urls.py)。
"""assetmgmt URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.11/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.conf.urls import url, include
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^blog/', include('blog.urls'))
]這裡為了表示這個 Project 的 urls.py 跟前面提到的 App 的 urls.py 不同,因此連檔案裡本來就有的註解也一起貼上來 XD。
這段主要增加的是第 21 行的部份,不過這裡宣告的是當網址遇到滿足 “^blog/” 時,就引用 blog.urls 的規則進來
綜合上面的兩個 urls.py 後,實際效果就是若網址輸入像是 http://127.0.0.1:8000/blog/ 時,就會呼叫 blog 這個 App 了。
而 blog.urls 裡定義任意字串都去呼叫 views.index 函式,所以 http://127.0.0.1:8000/blog/ 就會顯示出 Hello world 了。
啟動 Django 伺服器
最後,要啟動 Django 的網頁伺服器才能真的在瀏覽器上看出效果。
python manage.py runserver
不過因為截圖很麻煩,所以就…略過了 XD。總之正常應該會出現一個空白頁面,上面只有寫 Hello world 這樣。
沒有留言:
張貼留言