惊了!最通俗易懂的Djongo入门竟然在这里!
- Django簡介
- Django特點
- Django項目目錄
manage.py:用來管理當前項目的一個命令行工具
myproject/: 項目主文件夾
myproject/__init__.py:空文件,用來指明當前的myproject為一個可導入的模塊包
myproject/settings.py:項目主要配置文件
myproject/urls.py:項目主要路由配置文件
myproject/wsgi.py:項目部署WSGI并發(fā)服務器時所需要的配置
-
安裝Django
- pip install django 默認安裝最新版本
- pip install django==2.0.4? ?(指定版本號安裝)
?
- 創(chuàng)建項目
?
- django-admin startproject mypro
- 開啟開發(fā)服務器
- cd myproject ? ? ? ? ? ? ? ? ? ? ? ? ? ?進入項目目錄
- python manage.py runserver? ? ? ? ? ? ? ? ?開啟服務
- python manage.py runserver 7000? ? ? ? 改變服務監(jiān)聽端口
- python manage.py runserver 0:8000? ? ? ?改變服務監(jiān)聽IP:端口
- 配置settings.py
- BASE_DIR : 當前項目工作目錄,用來在每一次開啟項目時動態(tài)找到相關資源路徑
- SECRET_KEY : 加密的hash值以及保護某些簽名數(shù)據(jù)的關鍵密鑰
- DEBUG : 調試模式
- ALLOWED_HOSTS : 有哪些主機或域名可以訪問當前django站點,如設置為*代表全部可訪問。
- INSTALL_APPS : django項目中所有使用的應用名稱,自創(chuàng)建子應用也要加到這里,不然ORM數(shù)據(jù)庫無法被識別到!
- MIDDLEWARE : django中間件,用來在request或reponse過程中添加功能,比如確保安全性,傳輸保存Session等
- SecurityMiddleware : xss腳本過濾,一些安全設置
- SessionMiddleware : session支持中間件,在每次用戶訪問django項目時,添加session對每一個瀏覽器
- CommonMiddleware : 通用組件,比如為路由添加末尾斜杠
- CsrfViewMiddleware : 防跨站請求偽造令牌,為客戶端添加csrf_token密鑰,在表單提交時需提交該值
- AuthenticationMiddleware : admin用戶組件,每個request對象都會被添加admin下的user屬性
- MessageMiddleware : 消息中間件 展示一些后臺消息給前端
- XFrameOptionsMiddleware : 防止欺騙點擊攻擊出現(xiàn);自身頁面被嵌入到他人頁面中,點擊欺騙
- ROOT_URLCONF : 主路由配置文件,字符串填寫url.py文件路徑
- TEMPLATES?: 模板文件配置項
- WSGI_APPLICATION : WSGI服務器配置項,找到當前django下的wsgi引入APP文件
- DATABASES : 數(shù)據(jù)庫配置項,默認使用SQLite3,一個本地文件數(shù)據(jù)庫
- AUTH_PASSWORD_VALIDATORS : 檢查用戶密碼強度的驗證程序列表,不過是針對admin界面下的用戶,而非自定義
- LANGUAGE_CODE : django所使用語言文件
- TIME_ZONE : django所使用時區(qū)
- USE_I18N : 國際化支持 18表示Internationalization這個單詞首字母I和結尾字母N之間的字母有18個
- USE_L10N : 是localization的縮寫形式,意即在l和n之間有10個字母
- USE_TZ :開啟了Time Zone功能,則所有的存儲和內部處理,包括print顯示的時間將是是UTC時間格式
- STATIC_URL : URL訪問靜態(tài)資源時的路徑
- 創(chuàng)建子應用
- 項目和應用有啥區(qū)別?
- 創(chuàng)建app
- cd mypro
- django-admin startapp helloapp
- 頁面和視圖
- 視圖函數(shù)
?
1 # 每一個視圖函數(shù)都需要有一個必須參數(shù) request,用來接收用戶訪問時的請求內容 2 from django.http import HttpResponse 3 def index(request): 4 return HttpResponse("<h1>Hello world</h1>?
? HttpResponse函數(shù)用來像用戶返回一個字符串。
- 路由配置
-
- 第一種簡單的路由配置,直接在主控路由文件下,找到這個視圖函數(shù)
?
接下來訪問127.0.0.1:8000,那么你會看到一個非常大的Hello world。
-
- 以上將視圖函數(shù)的查找直接寫到主控路由并不是最好的辦法,我們的項目通常會有非常多的路由配置項,如果都堆到這個文件中肯定是非常亂的,難以維護;我們可以在對應app下創(chuàng)建一個子路由控制文件,并在其中設置視圖的路由配置。
?
-
- ?現(xiàn)在雖然配置了app下的路由文件,但是訪問時,是看不到對應視圖的結果這是因為默認的url查找動作將會從主控路由文件開始,我們還需要在主控路由文件下進行路由分發(fā)設置,讓主控路由可以找到子app下的路由
?
接下來再次嘗試,在瀏覽器中訪問主機域名;如果可以看到的話,恭喜你,效果已經(jīng)很棒了!
?路由查找流程:
1. 查找主控路由文件下的 urlpatterns 全局變量,這是一個序列數(shù)據(jù)類型,其中每一個元素都是對應的一個路由匹配規(guī)則
2. 如果在規(guī)則中查找到符合匹配規(guī)則的,則執(zhí)行其中的對應執(zhí)行函數(shù)
3. 如果對應的不是一個執(zhí)行函數(shù),而是一個 include 路由包含,那么截斷與此項匹配的 URL 的部分,并將剩余的路由字符串發(fā)送到 include所包含的子路由文件中以供進一步處理4. 如果沒有匹配到的任何結果,django默認拋出 Page not found (404)
注意:Django的路由不考慮HTTP請求方式,僅根據(jù)URL進行路由,即,只要URL相同,無論POST、GET等哪種請求方式都指向同一個操作函數(shù)。
- path
- re_path
- 模板頁面
返回一個字符串這肯定是不行的,太low了,也不好看,現(xiàn)在來返回一個正式的HTML頁面。并在HTML頁面中加入模板變量,由視圖函數(shù)動態(tài)傳遞值;配置django中模板頁面的保存路徑,在項目目錄下的settings.py文件中。
1 #myproject/settings.py 2 TEMPLATES = [ 3 { 4 'BACKEND': 'django.template.backends.django.DjangoTemplates', 5 'DIRS': [os.path.join(BASE_DIR,'template')], # 就是這一行設置靜態(tài)模板路徑 6 'APP_DIRS': True, 7 'OPTIONS': { 8 'context_processors': [ 9 'django.template.context_processors.debug', 10 'django.template.context_processors.request', 11 'django.contrib.auth.context_processors.auth', 12 'django.contrib.messages.context_processors.messages' 13 ], 14 }, 15 }, 16 ]?
創(chuàng)建template目錄并在其中創(chuàng)建index.html文件。 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>hi</title> 6 </head> 7 <body> 8 <h1>{{ message }}</h1> 9 </body> 10 </html>?在HTML頁面中,我們并沒有明確指出H1標簽的內容;通過一個{{ message }}來等待接收視圖函數(shù)傳來的數(shù)據(jù),在HTML頁面中這樣的變量也叫做模板變量,常用雙大括號語法。
接下來修改之前的視圖函數(shù),由視圖函數(shù)傳遞變量給到HTML頁面。
1 #myapp/views.py 2 from django.shortcuts import render 3 def index(request): 4 #return HttpResponse("<h1>Hello world</h1>") 5 content = {"message":"你好,世界" #此處的key值message對應頁面中我們寫的{{ message }} 6 } 7 return render(request,'index.html',content)?
模板變量: 在django中的HTML頁面,不光可以編寫原本的標簽等內容,還可以像Vue一樣在頁面中使用雙大括號,來提前定義一些模板變量。模板變量可以由后臺視圖函數(shù)構建一個字典數(shù)據(jù)類型傳遞,字典的key是模板變量名,value值該模板變量對應的數(shù)據(jù)。當然,模板變量的內容遠不止此,還會再后面繼續(xù)為大家敘述。。。- ?為什么模板文件夾中還要在創(chuàng)建一個hello子文件夾呢?
- 頁面中使用URL
- 靜態(tài)文件
雖然有了模板頁面,可以來展示一些標簽的效果,但是整個HTML還是感覺很丑陋,所以,我們還要繼續(xù)引入
一些類似css、img這樣的靜態(tài)資源,來裝飾我們的頁面。
在django中模板頁面的靜態(tài)資源使用,不能像之前寫HTML代碼直接引入,需要我們首先在項目中創(chuàng)建目錄保
存對應的靜態(tài)資源。
-
- 在settings中配置靜態(tài)文件保存目錄,添加如下內容:
?? ? 有些靜態(tài)文件可能是多個app公用的,這時候需要進行一點額外設置。首先在和app同級的目錄創(chuàng)建static文件夾并將靜態(tài)文件放入。然后在配置文件中添加額外的搜索路徑配置。
還是由于django文件搜索機制,我們最好在靜態(tài)目錄中添加一個public子文件夾和其他靜態(tài)文件區(qū)分。
1 STATICFILES_DIRS = ( 2 os.path.join(BASE_DIR, 'static'), 3 ) 4 # STATICFILES_DIRS 該配置項用來告訴django在查找靜態(tài)資源時,應該訪問哪個目錄- 在項目中創(chuàng)建static目錄,static目錄下創(chuàng)建專門保存圖片的img目錄,在里面存一張圖片1.jpg
?
需要注意的是,由于前面介紹的django文件搜索機制,在靜態(tài)文件夾中,我們最好在指定一級和app同名的文件夾用來區(qū)分不同app間的靜態(tài)文件。-
- 有了圖片,接下來在模板頁面中去引入并使用它,打開index.html進行修改:
?
-
- 這里用到了一個特殊語法: {% tag %} 這個叫靜態(tài)標簽,靜態(tài)標簽不同于模板變量,靜態(tài)標簽經(jīng)常用來加載數(shù)據(jù),或創(chuàng)建邏輯,比如之后我們要學到的 {% if %} ,使用靜態(tài)標簽可以方便我們在模板頁面上實現(xiàn)某些只有在后臺代碼中才可以實現(xiàn)的邏輯功能。
- 在頁面中要引入靜態(tài)資源,圖片,CSS,JS文件,在引入時都需要通過 {% static "path" %} 來進行引入,并且在模板頁面頭部需要使用 {% load staticfiles %} 標簽進行靜態(tài)資源的加載。
- 模型數(shù)據(jù)庫
- 創(chuàng)建數(shù)據(jù)庫,這里使用項目自帶的SQLite3數(shù)據(jù)庫,默認已經(jīng)是配好的,接下來需要我們進入到app下的models.py文件中,編寫一個類,這個類就對應數(shù)據(jù)庫中的一張表。
?
-
- 在這里我們使用到了django的orm映射關系用來創(chuàng)建數(shù)據(jù)庫表,繼承自django的models.Model類,一個類用來表示一張表,類中的一個屬性代表一個字段,這里我們定義了一個類型為CharField,長度為100的字段,用來存儲天氣。
-
- 下面的class Meta是模型類的元類,用來設置當前表的一些屬性;這里我們使用verbose_name_plural屬性設置當前表在admin后臺查看時的名字
-
- ?在這里我們還定義了一個屬于實例的函數(shù)__str__,用來描述當前數(shù)據(jù)在返回時的默認展示結果,為weather字段的值
-
- django在創(chuàng)建模型類對應的數(shù)據(jù)表時,默認使用 應用名 加 下劃線 加 模型類名 作為表的名字;比如當前Weather表名為:myapp_Weather
- orm映射關系,是django與數(shù)據(jù)庫之間的一個橋梁,可以使開發(fā)者不再關注如何去編寫SQL語句,直接通過一套ORM所提供的API接口即可方便對各種數(shù)據(jù)庫進行交互。
- 當某個子應用APP涉及到了數(shù)據(jù)庫的使用時,要記得在settings文件中進行配置:
?
- 接下來通過manage.py命令行管理工具提供的兩條,創(chuàng)建我們所需要的數(shù)據(jù)。
-
- ?注意:默認django本身就已經(jīng)需要一些數(shù)據(jù)的創(chuàng)建,所以我們在初次執(zhí)行以下兩條命令時可能會看到很多數(shù)據(jù)表和字段的創(chuàng)建,不要驚訝,這是正常的
-
Django Admin
-
- admin控制臺是django為我們提供的一個非常便捷的用來管理數(shù)據(jù)庫的界面。在主控路由文件下,其實你已經(jīng)看到了它對應的路由設置:path('admin/', admin.site.urls),
- 進入admin界面,初次訪問連接:127.0.0.1/admin,會提示我們輸入賬號密碼,這是因為django的admin界面是需要一個超級管理員來登陸訪問的,所以還需要我們創(chuàng)建對應的admin界面下的超級用戶
- 創(chuàng)建admin超級用戶,使用manage.py命令行執(zhí)行如下命令:
?
-
-
- ?
-
?
- 以上是我們創(chuàng)建超級用戶的過程,非常坎坷;可以看到,在輸入太短(不滿足8位),或是只包含數(shù)字的簡單密碼,超級用戶的創(chuàng)建都是被拒絕的所以我們把用戶賬號創(chuàng)建為 root ,而密碼創(chuàng)建為 a1234567 ,接下來開啟測試服務器,并通過創(chuàng)建好的超級用戶登陸訪問,如果幸運的話,你已經(jīng)可以看到后臺的admin界面啦admin界面已經(jīng)展示出了默認django所使用的兩張表,用戶表和組表,用來保存當前管理后臺的用戶以及對應權限分組,可以點入用戶表查看其中我們剛創(chuàng)建的root。
-
啟動開發(fā)服務器
?
現(xiàn)在,打開瀏覽器,轉到你本地域名的 "/admin/" 目錄, -- 比如 "http://127.0.0.1:8000/admin/" 。你應該會看見管理員登錄界面:-
進入管理站點頁面
- admin注冊表
- 在app下的admin.py文件中進行模型類的注冊:
- 例:
- 這個表單是從問題?Question?模型中自動生成的
- 不同的字段類型(日期時間字段?DateTimeField?、字符字段?CharField)會生成對應的 HTML 輸入控件。每個類型的字段都知道它們該如何在管理頁面里顯示自己。
- 每個日期時間字段?DateTimeField?都有 JavaScript 寫的快捷按鈕。日期有轉到今天(Today)的快捷按鈕和一個彈出式日歷界面。時間有設為現(xiàn)在(Now)的快捷按鈕和一個列出常用時間的方便的彈出式列表。
- 保存(Save) - 保存改變,然后返回對象列表。
- 保存并繼續(xù)編輯(Save and continue editing) - 保存改變,然后重新載入當前對象的修改界面。
- 保存并新增(Save and add another) - 保存改變,然后添加一個新的空對象并載入修改界面。
- 刪除(Delete) - 顯示一個確認刪除頁面。
- 視圖操作模型
?
光返回是不行的,雖然我們綁定到了模板版變量的字典中,但是還得修改一下對應的要渲染的HTML頁面: 1 <!DOCTYPE html> 2 <html lang="en"> 3 {% load staticfiles %} 4 <head> 5 <meta charset="UTF-8"> 6 <title>hi</title> 7 </head> 8 <body> 9 {% for weather in weathers %} 10 <p>{{ weather }}</p> 11 {% empty %} 12 <p>沒有任何天氣</p> 13 {% endfor %} 14 </body> 15 </html> 模板標簽 {% for xxx in xxxs %} 可以用來在模板頁面出迭代訪問取出每一個數(shù)據(jù),具體對于不同序列數(shù)據(jù)的訪問我們會在后面詳細為大家介紹, {% empty %} 標簽用來判斷當循環(huán)訪問數(shù)據(jù)為空時要做的事情,最后循環(huán)標簽要有 {% endfor %} 標簽進行結束。因為HTML中并沒有像Python縮進這樣的方式來控制代碼塊。?
轉載于:https://www.cnblogs.com/onerose/p/10634182.html
總結
以上是生活随笔為你收集整理的惊了!最通俗易懂的Djongo入门竟然在这里!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python3.7.1使用_使用pyth
- 下一篇: 数学建模-分类模型