你的第一个Django程序
本文使用Pycharm、Django 2.0.9、Python 3.6環境,本文大綱
- 建立Django項目
- 建立頁面
- 什么是URLconf和ROOT_URLCONF
- Django怎么處理URL請求
- 關于URL尾部的“/” 反斜線
1. 建立一個Django項目
Application name如果填寫會自動幫你建立一個APP,而且APP是必須的,就算你用命令行去創建一個項目也需要再次使用命令創建APP。勾選Enable Django admin,這個后面也會用到。下面是默認的結構。
我們先把下面的內容注釋掉,因為還用不到數據庫。
啟動你的項目
點擊鏈接你會看到下面的內容
2. 你的第一個頁面
再次啟動項目,不過這次你點擊以后會出現404錯誤,你在URL中輸入,將會看到你所期待的頁面。
這時候你可能有一些疑問,我必須要輸入/hello么,如果我需要輸入127.0.0.1:8000就直接看到Hello world頁面怎么辦?畢竟網站都是有一個默認主頁不想輸入下一級?這時候我們就需要修改URL配置了。
這時候無論你是否輸入/hello都會顯示這個頁面,如下圖
URL中什么都不加也就是網站的根目錄其實也根配置其他URL一樣需要些一個匹配模式,這個模式就是空??赡芗毿牡耐瑢W發現我這里的URL匹配模式中沒有了^和$,包括網站根目錄也僅僅是一對引號而不是之前的’^$’這種形式。這是在Django 2.0開始發生的變化,2.0以前都是需要加^和$的。但是這里有個問題這里的URL不是正則類型的不是正則就很容易匹配到多個,如果我想使用正則類型的怎么辦?看下圖:
同樣還是主頁,這里我們用了正則的寫法效果還是一樣的,這個寫法就和Django 1.x里面一樣了,只是這里用了re_path,而且在Django 2.x中要想使用支持正則的URL匹配必須使用這個。
現在我們要討論幾個問題
2.1?什么是URLconf和ROOT_URLCONF
一個URL配置文件也就是上面這樣的,用于配置URL匹配模式的文件就是URLconf。那什么是ROOT_URLCONF呢?
在項目層級的settings.py文件中有一個ROOT_URLCONF配置選項,這個選項又指向了默認項目層級自動生成的urls.py這個URLconf文件。其實這個ROOT_URLCONF就是告訴DJANGO從哪里開始去找匹配你輸入的URL的匹配模式,當第一個匹配到之后就執行對應的動作。如果一直找不到就返回404.
2.2?Django是怎么處理請求的呢
比如你輸入 http://127.0.0.1:8000/hello的時候它怎么就能返回你所期待的內容呢?其實就像上面的ROOT_URLCONF說的那樣,它指向了一個包含URL匹配模式得URL配置文件,這些文件同時還可以再包含其他URL配置文件,那么Django就從ROOT_URLCONF配置的地方開始加載URL配置文件,然后逐一去匹配,找到第一個匹配的就執行對應的動作,如果找不到就返回404.
當輸入/hello時就匹配到了這條,然后去執行hello這個函數,這個函數定義在mysite.views中
這個函數要執行的具體內容是做一個HTTP響應,返回內容是Hello world。就是這樣一個過程。簡單一句話URL的配置就是把HTTP請求中的URL映射到具體的Python函數上。
直白一點說請求/hello Django將會調用mysite.views.hello(request),如果有參數,參數也會被傳遞進來,至于參數怎么傳遞之后在介紹。
2.3?關于URL尾部的“/”
這個“/”是必須的嗎?我好像輸入URL時也沒有輸入這個它自己怎么就給我加上了呢。對于URL來說末尾有沒有“/”無所謂,但是到底需不需要是你自己來決定的。默認情況下雖然你不輸入“/”django會自動給你加上,但至于能不能訪問到你期望的內容就要看你的URL配置是怎樣的。
我們的URL配置是這樣的 “hello/” 而且Django默認會自動在末尾增加“/”如果你沒輸入的話,所以這種情況下你在瀏覽器中是否輸入“/”都會訪問到你所期待的網頁。但如果你這個時候把你URL配置更改一下如下圖:(去掉“/”)
這時候由于django默認自動在末尾增加“/”所以這時候你就看不到那個頁面了,將會得到404.
為什么會這樣呢?很顯然 http://127.0.0.1:8000/hello 和 http://127.0.0.1:8000/hello/ 是兩個URL,后者無法被URL配置文件匹配到啊,所以你看它給你的提示第三項就說的很明白了。如果我就不想要這個“/”那應該怎么辦呢?修改settings.py文件,怎講下面的內容就禁止自動在末尾增加“/”。
這時候你再訪問http://127.0.0.1:8000/hello 這個URL就可以訪問到了。
但是如果你這時候訪問http://127.0.0.1:8000/hello/ 這個就會得到404,為什么?匹配不到啊。我們再次修改一下URL配置
views.py中增加一個方法
再次訪問
所以URL配置中的URL末尾是否包含“/”則是根據喜好都可以。不過根據REST原則“/”只表示分級無特殊意義,所以在URL末尾不建議增加“/”.不過對于傳統WEB頁面來說加與不加都表示同一資源也就是顯示同一結果,所以django才會自動默認加上“/”。
REST AP設計
2.4?難道所有的URL配置都寫在默認的urls.py文件中嗎?
顯然不是這就用到一個include函數了。通常情況下每一個APP都有自己的URL配置文件。
mysite是我們的APP,它下面并沒有配置URL的地方, 其實URL配置文件就是一個.py文件沒有什么特殊的,我們手動建立一個就行。
空空如也的文件,需要寫什么呢?照貓畫虎,參照之前那個默認生成的urls.py就可以。先說一下需求,所有關于mysite這個APP的URL全部在APP里面的URL配置文件中配置。我們先看這個我們新建的URL配置怎么寫:
修改默認的url.py文件
到這里就修改完畢。結果就是輸入 http://127.0.0.1:8000 結果不變還是我們定義的主頁,然后 http://127.0.0.1:8000/mysite/hello? 則顯示mysite.views.hello函數執行結果。如下圖:
雖然上面兩個URL顯示結果一樣(因為執行的都是相同的東西),但我們的目的是為了說明URL的引入以及不同APP的URL應該在APP里面設置而不是都寫到默認生成的urls.py文件中。
Include()函數的作用就是允許引入其他的URLconf設置,當Django遇到帶有include()的URL匹配是,如果匹配到那么它會截斷匹配的內容將剩余的字符串發送到include()里面的URL配置中繼續匹配。
http://127.0.0.1:8000/mysite/hello 在默認的URL配置文件中匹配到/mysite/就截斷,然后將hello發送到mystie里面的urls.py去繼續匹配。
轉載于:https://www.cnblogs.com/rexcheny/p/9635647.html
總結
以上是生活随笔為你收集整理的你的第一个Django程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拉普拉斯变换的应用
- 下一篇: 2022华为杯研究生数学建模竞赛选题建议