寫下你的第一個Django應用
第一部分
????讓我們通過例子來學習.
????在本教程中,我們將引導您完成基本投票應用程序的創建.
????其中包括兩部分:
- 一個讓人們查看民意調查并投票的公共網站.
- 允許您添加,更改和刪除民意調查的管理網站.
????我們假設你django已經安裝好了,你可以通過下面的shell命令得知django的版本:
python -m django --version
????如果django已經安裝好了,你可以看到安裝的版本.如果沒有,你會得到錯誤提示"No module named django".
????這個教程基于django2.0,支持python3.4以及后面的版本.如果django的版本不匹配,可以在右下角選擇合適的版本,或者升級django版本.如果你正在使用老版本的python,你可以根據下圖去找到合適的點擊django版本.
創建一個項目
????如果這是你第一次使用django,你會關心一些初始化設置.換句話說,你需要下面的指令自動生成一個django項目,其中包含數據庫配置,django特定的選項和應用特定的選項.
????從命令行,cd進入你想創建django項目的文件夾,然后執行下面的指令:????
django-admin startproject mysite
????這條命令將會在你的文件夾中創建一個mysite文件夾.
注釋:
? ? 你需要避免在創建django項目與python或django內置組件相同,尤其是,你應該避免使用django(與django本身發生沖突)或者test(與python內置文件沖突).
代碼應該放置在哪?
????如果你的背景是普通的舊PHP(沒有使用現代框架),那么你可能習慣于把代碼放在Web服務器的文檔根目錄下(比如/ var / www).用Django,你不這樣做.將任何Python代碼放入Web服務器的文檔根目錄中并不是一個好主意,因為它有可能讓人們能夠通過Web查看您的代碼.這樣安全性不好.? ??
????將代碼放在文檔根目錄之外的某個目錄中,例如/ home / mycode.
讓我們看看startproject這個指令都創建了什么:
mysite/manage.pymysite/__init__.pysettings.pyurls.pywsgi.py
下面解釋這些文件:- 外部的mysite/是你項目的容器.它的名字不影響django;你可以隨你喜歡地修改名字
- manage.py:一個代碼管理工具,可以讓你用各種方式與django進行交互.你可以讀到關于manage.py的所有功能在django-admin and manage.py
- 內部的mysite/是你django項目的實際文件夾.它的名字是你需要用來導入任何內容的Python包名(例如:mysite.urls)
- mysite/__init__.py:一個空的文件用來告訴python,這個文件夾是一個python包.如果你是一個python初學者,建議你先了解一下python包的含義
- mysite/setting.py:用于配置django的設置.通過django settings可以了解到settings的工作方式
- mysite/urls.py:django項目的url管理器,可以設置你django項目可以訪問的網頁url.通過URL dispatcher可以了解更多關于URLS
- mysite/wsgi.py:WSGI兼容的Web服務器為您的項目提供服務的入口點
---------------------------------------------------------------------------------------------------------------------
開發服務器
? ? 讓我們檢驗我的django項目.進入外部mysite目錄,運行下面的指令:
python manage.py runserver
? ? 你可以看到下面的命令行輸出? ??
Performing system checks...System check identified no issues (0 silenced).You have unapplied migrations; your app may not work properly until they are applied.
Run 'python manage.py migrate' to apply them.April 11, 2018 - 19:22:09
Django version 2.0.4, using settings 'blogproject.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
注釋:
????現在請忽略數據庫遷移的問題,這個問題會在稍后進行處理.
? ? 你已經開始使用django開發服務器了,這是一個純粹用Python編寫的輕量級Web服務器.這些功能我們已經在django中包含了,所以你可以很快地進行開發,你可以直接進行開發,不需要去配置生產服務器,比如像Apache這樣的網頁服務器.
? ? 注意注意!不要在類似于生產環境的任何情況下使用此服務器。它僅用于開發時使用。 (我們的業務是制作Web框架,而不是Web服務器。)????
? ? 現在服務器正在運行,可以通過http://127.0.0.1:8000/來訪問你的網頁,你可以看到"The install worked successfully! Congratulations!",還有一個起飛的火箭,說明它正在工作.
切換端口:
? ? runserver這個命令默認會以8000作為端口號開啟服務器.
? ? 如果你想要改變服務器的端口號,將它作為命令的參數輸入.下面是個例子,這個命令開啟服務器在8080端口上:
python manager.py runserver 8080
? ? 你如果你想改變服務器的IP地址,將ip地址與端口號一起作為參數傳遞即可,如果出現錯誤,如下
Invalid HTTP_HOST header: '127.1.1.1:8080'. You may need to add '127.1.1.1' to ALLOWED_HOSTS.
? ? 說明你需要把該IP加入setting.py文件中ALLOWED_HOSTS中即可.
? ? 如果你想收聽所有可用的公共IP(如果你正在運行Vagrant或希望在網絡上的其他計算機上炫耀你的工作,這很有用),請使用:
python manage.py runserver 0:8000
0是0.0.0.0的簡稱.有關開發服務器的完整文檔可以在runserver參考中找到。????
自動重新加載服務器:
? ??您無需重新啟動服務器以使代碼更改生效。但是,某些操作(如添加文件)不會觸發重新啟動,因此在這種情況下您必須重新啟動服務.
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
創建一個Polls應用:
? ? 現在你的服務器環境已經搭建好了,你可以開始工作了.
? ? 你在django中編寫的每一個應用都遵循特定的python包.?django帶有一個實用的工具可以自動生成應用的基本目錄結構,所有你可以把注意力放在寫代碼上而不是創建文件目錄.
項目對比應用:
? ? 項目和應用的不用是什么呢?應用是網頁應用程序,它可以執行一些操作,比如公共記錄數據庫或者簡單的投票系統.項目是一個特定網頁配置和網頁應用程序的集合,一個項目可以包含多個應用,一個應用可以在多個項目中.
? ? 你的所有應用可以在你python路徑上的任何地方.在本教程中,我們會創建Poll應用與manage.py文件同一個路徑下,所以它可以被直接作為主模塊被調用,而不是作為mysite的子模塊.
? ? 創建你的應用,確認你已經進入了與manage.py同目錄下,然后執行下面的目錄:
python manage.py startapp polls
? ? 這個命令創建了polls文件夾,?其中目錄像下面這樣:
polls/__init__.pyadmin.pyapps.pymigrations/__init__.pymodels.pytests.pyviews.py
? ? 這個文件夾將包含我們的投票系統應用.-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
編寫你的第一個視圖:
? ? 讓我們編寫第一個視圖.打開polls/views.py這個文件然后將下面的python代碼寫入:
polls/views.py中? ?? ??
from django.http import HttpResponsedef index(request):return HttpResponse("Hello, world. You're at the polls index.")
? ? 這是可能是django中最簡單的視圖了.要調用這個視圖,我們需要將它映射到一個URL - 為此我們需要一個URLconf.
? ? 需要創建一個URLconf在polls文件夾中.創建一個文件叫做urls.py.你的文件夾現在應該是這樣:
polls/__init__.pyadmin.pyapps.pymigrations/__init__.pymodels.pytests.pyurls.pyviews.py
? ? 在polls/urls.py文件中加入下面的代碼:
polls/urls.py文件中
from django.urls import pathfrom . import viewsurlpatterns = [path('',views.index, name='index'),
]
? ? 下一步是將根的URLconf指向polls.urls模塊.在mysite/urls.py添加導入django.urls.include然后在urlpatterns列表中添加一個include(),以便導入polls.urls模塊:
mysite/urls.py文件中
from django.contrib import admin
from django.urls import path,includeurlpatterns = [path('admin/', admin.site.urls),path('polls/',include('polls.urls')),
]
????include()函數允許訪問其他的URLconf.任何時候django碰到include()函數,它會暫停在這個URL在當前URLconf中的匹配,轉而進入include函數中的URLconfs中找尋匹配.
? ? include()函數的主要想法是讓引用URLs更加方便.因為投票是在自己的URLconf中(polls/urls.py),他們可以被放置在"/polls/"之下,或者"/fun_polls/"之下,或者"/content/polls/"之下,或者其他根目錄之下,這個應用都可以工作.
什么時候使用include()函數?
? ? 你應該總是使用include()函數當你要添加其他URL模型時.admin.site.urls 是唯一一個不可以使用的例外.? ? 你現在已經將一個視圖連接到URLconf了,現在驗證它是否工作,運行下面的指令:
python manage.py runserver
? ? 通過瀏覽器訪問http://localhost:8000/polls/,然后你應該可以看到"Hello, world. You’re at the polls index.",這些是你在index中寫下的.
? ? path()函數會傳遞四個參數,其中兩個是必須的:路徑(route)和視圖(view),兩個可以可選屬性:kwargs和名字(name).我們需要回顧一下這四個參數.
路徑(route)
路徑是一個字符串,包含了URL模型.處理請求時,django從urlpattens第一個URL開始往下,匹配請求的URL,直到找到一個匹配的URL.
視圖(view)
當django找到匹配的URL模式,它將HttpRequest對象作為第一個參數并將路由中的任何“捕獲”值作為關鍵字參數調用指定的視圖函數.我們將稍微舉一個例子.
kwargs
關鍵字參數可以在字典中傳遞給目標視圖,我們不打算在教程中使用Django的這個特性。名字(name)
命名你的URL可以讓你從django其他地方明確地引用它,特別是在模板中.這個強大的功能允許你只在單個文件中對項目的URL模式進行全局修改.
如果你對基本請求和響應流程這一節感到滿意,請閱讀本教程的第2節以開始使用數據庫。