驚了!最通俗易懂的Djongo入門竟然在這里!


  • Django簡介
  1. python下有多款不同的web框架,Django是最有代表行的一種。許多成功的網站和app都基於djanfo。
  2. django是一個開源的web應用框架,由python寫成。
  3. django采用了MVC的軟件設計模式,即模型M,視圖V和控制器C。
 
  • Django特點
  1. 強大的數據庫功能:用python的類繼承,幾行代碼就可以擁有一個動態的數據庫操作API,如果需要也能執行SQL語句。
  2. 自帶的強大的后台功能:幾行代碼就讓網站擁有一個強大的后台,輕松管理內容。
  3. 優雅的網址:用正則匹配網址,傳遞到對應函數。
  4. 模板系統:強大,易擴展的模板系統,設計簡易,代碼和樣式分開設計,更易管理。
  5. 緩存系統:與memcached或其它緩存系統聯用,表現更出色,加載速度更快。
  6. 國際化:完全支持多語言應用,允許你定義翻譯的字符,輕松翻譯成不同國家的語言。
 
  • Django項目目錄

  manage.py:用來管理當前項目的一個命令行工具

  myproject/: 項目主文件夾

  myproject/__init__.py:空文件,用來指明當前的myproject為一個可導入的模塊包

  myproject/settings.py:項目主要配置文件

  myproject/urls.py:項目主要路由配置文件

  myproject/wsgi.py:項目部署WSGI並發服務器時所需要的配置

  • 安裝Django

    •      pip install django 默認安裝最新版本
    •      pip install django==2.0.4   (指定版本號安裝)

 

  • 創建項目

 

    • django-admin startproject mypro
 
    創建好項目之后,我們進入項目文件夾中。用下面的命令就可以運行Django項目了。默認情況下,我們可以通過 http://127.0.0.1:8000/來訪問正在運行的項目。由於沒有任何頁面,所以會顯示這么一個調試窗口。
 
  • 開啟開發服務器
    • cd myproject                                進入項目目錄
    • python manage.py runserver                 開啟服務
    • python manage.py runserver 7000        改變服務監聽端口
    • python manage.py runserver 0:8000       改變服務監聽IP:端口
 
  • 配置settings.py
    • BASE_DIR : 當前項目工作目錄,用來在每一次開啟項目時動態找到相關資源路徑
    • SECRET_KEY : 加密的hash值以及保護某些簽名數據的關鍵密鑰
    • DEBUG : 調試模式
    • ALLOWED_HOSTS : 有哪些主機或域名可以訪問當前django站點,如設置為*代表全部可訪問。
    • INSTALL_APPS : django項目中所有使用的應用名稱,自創建子應用也要加到這里,不然ORM數據庫無法被識別到!
    • MIDDLEWARE : django中間件,用來在request或reponse過程中添加功能,比如確保安全性,傳輸保存Session等
    • SecurityMiddleware : xss腳本過濾,一些安全設置
    • SessionMiddleware : session支持中間件,在每次用戶訪問django項目時,添加session對每一個瀏覽器
    •  CommonMiddleware : 通用組件,比如為路由添加末尾斜杠
    •  CsrfViewMiddleware : 防跨站請求偽造令牌,為客戶端添加csrf_token密鑰,在表單提交時需提交該值
    • AuthenticationMiddleware : admin用戶組件,每個request對象都會被添加admin下的user屬性
    • MessageMiddleware : 消息中間件 展示一些后台消息給前端
    • XFrameOptionsMiddleware : 防止欺騙點擊攻擊出現;自身頁面被嵌入到他人頁面中,點擊欺騙
    • ROOT_URLCONF : 主路由配置文件,字符串填寫url.py文件路徑
    •  TEMPLATES : 模板文件配置項
    • WSGI_APPLICATION : WSGI服務器配置項,找到當前django下的wsgi引入APP文件
    •  DATABASES : 數據庫配置項,默認使用SQLite3,一個本地文件數據庫
    •  AUTH_PASSWORD_VALIDATORS : 檢查用戶密碼強度的驗證程序列表,不過是針對admin界面下的用戶,而非自定義
    •  LANGUAGE_CODE : django所使用語言文件
    • TIME_ZONE : django所使用時區
    • USE_I18N : 國際化支持 18表示Internationalization這個單詞首字母I和結尾字母N之間的字母有18個
    • USE_L10N : 是localization的縮寫形式,意即在l和n之間有10個字母
    • USE_TZ :開啟了Time Zone功能,則所有的存儲和內部處理,包括print顯示的時間將是是UTC時間格式
    • STATIC_URL : URL訪問靜態資源時的路徑
  • 創建子應用
    • 項目和應用有啥區別?
         應用是一個專門做某件事的網絡應用程序——比如博客系統,或者公共記錄的數據庫,或者簡單的投票程序。
         項目則是一個網站使用的配置和應用的集合。項目可以包含很多個應用。應用可以被很多個項目使用
 
  • 創建app
      在Django項目中,app表示更小的一個功能單位,比方說在一個博客管理系統中,對博客的增刪查改等功能就應該聚合在一個app中。進入項目目錄中,用startapp命令創建app。
      • cd mypro
      • django-admin startapp helloapp
 
  • 頁面和視圖
    • 視圖函數
        打開app下的views.py文件Web訪問起始就是通過一個URL連接地址訪問到服務器上的一個函數在views.py中我們通過編寫函數的形式,接收用戶請求的request並返回一個response

 

1 # 每一個視圖函數都需要有一個必須參數 request,用來接收用戶訪問時的請求內容
2 from django.http import HttpResponse
3 def index(request):
4     return HttpResponse("<h1>Hello world</h1>

 

     HttpResponse函數用來像用戶返回一個字符串。

  • 路由配置
  創建好了一個可以在請求時返回H1標簽的視圖函數,但是現在通過瀏覽器還是訪問不到需要我們為這個app下的函數進行路由配置
    • 第一種簡單的路由配置,直接在主控路由文件下,找到這個視圖函數
 1 #myproject/urls.py
 2 from django.contrib import admin
 3 from django.urls import path
 4 from myapp import views
 5 urlpatterns = [
 6     path('admin/', admin.site.urls),    #admin控制界面路由
 7     path('',views.index)
 8     #path函數第一個參數為訪問地址,空字符串代表:當用戶直接訪問首頁時
 9     #第二個參數代表訪問該地址時對應的視圖函數,我們引入了app下的views中的index視圖函數。
10 ]

 

      接下來訪問127.0.0.1:8000,那么你會看到一個非常大的Hello world。

    • 以上將視圖函數的查找直接寫到主控路由並不是最好的辦法,我們的項目通常會有非常多的路由配置項,如果都堆到這個文件中肯定是非常亂的,難以維護;我們可以在對應app下創建一個子路由控制文件,並在其中設置視圖的路由配置。
1 #myapp/urls.py
2 from django.urls import path
3 from . import views
4 urlpatterns = [
5     path("",views.index)
6 ]

 

    •  現在雖然配置了app下的路由文件,但是訪問時,是看不到對應視圖的結果這是因為默認的url查找動作將會從主控路由文件開始,我們還需要在主控路由文件下進行路由分發設置,讓主控路由可以找到子app下的路由
 1 #myproject/urls.py
 2 from django.contrib import admin
 3 from django.urls import path,include
 4 from myapp import views
 5 urlpatterns = [
 6     path('admin/',admin.site.urls),
 7     #path('',views.index)
 8     path('',include("myapp.urls")),
 9     # 函數 include() 允許引用其它 URLconfs
10 ]

 

      接下來再次嘗試,在瀏覽器中訪問主機域名;如果可以看到的話,恭喜你,效果已經很棒了!

 路由查找流程:

  1. 查找主控路由文件下的 urlpatterns 全局變量,這是一個序列數據類型,其中每一個元素都是對應的一個路由匹配規則

  2. 如果在規則中查找到符合匹配規則的,則執行其中的對應執行函數

  3. 如果對應的不是一個執行函數,而是一個 include 路由包含,那么截斷與此項匹配的 URL 的部分,並將剩余的路由字符串發送到 include所包含的子路由文件中以供進一步處理4. 如果沒有匹配到的任何結果,django默認拋出 Page not found (404)

  注意:Django的路由不考慮HTTP請求方式,僅根據URL進行路由,即,只要URL相同,無論POST、GET等哪種請求方式都指向同一個操作函數。

  • path
  path函數用來處理一個路由對應的事件
1 path(route, view, name)
2 #route: 匹配規則,是一個字符串
3 #view:對應的視圖函數
4 #name:未來我們會用到他,用來為匹配規則命名,這樣方便日后修改路由而不影響全局下的路由使用
  • re_path
  re_path是path函數的加強版;可以在re_path函數的第一個位置的字符串參數,寫入一個標准Python正則表達式,其余參數與path相同
  注意:匹配模式的最開頭不需要添加/,因為默認情況下,每個url都帶一個最前面的/,既然大家都有的部分,就不用浪費時間特別寫一個了。
 
  • 模板頁面

  返回一個字符串這肯定是不行的,太low了,也不好看,現在來返回一個正式的HTML頁面。並在HTML頁面中加入模板變量,由視圖函數動態傳遞值;配置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')],     # 就是這一行設置靜態模板路徑
 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 ]                    

 

  創建template目錄並在其中創建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 }}來等待接收視圖函數傳來的數據,在HTML頁面中這樣的變量也叫做模板變量,常用雙大括號語法。

  接下來修改之前的視圖函數,由視圖函數傳遞變量給到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一樣在頁面中使用雙大括號,來提前定義一些模板變量。模板變量可以由后台視圖函數構建一個字典數據類型傳遞,字典的key是模板變量名,value值該模板變量對應的數據。 當然,模板變量的內容遠不止此,還會再后面繼續為大家敘述。。。
 
  •     為什么模板文件夾中還要在創建一個hello子文件夾呢?
    這是由於django的文件搜索機制所導致的。當搜索模板文件的時候django會從所有app的templates文件夾中搜索,但是並不會區分它們,所以如果在多個app中有相同的文件名,django會使用找到的第一個。因此為了區分它們我們只能自己多創建一層文件夾用於區分。
  • 頁面中使用URL
  當我們在頁面中需要使用路徑的時候,不要硬編碼路徑,最好使用url標簽。例如下面這樣的。
1 <a href="{% url 'hello' '張三' %}">你好,張三</a>
  這里url標簽中指定的名稱是urls.py文件中路徑的name參數。
1 path('hello/<str:name>', views.hello, name='hello')
當項目中存在多個app的時候,需要使用命名空間來區分。做法很簡單,在urls.py文件中添加app_name屬性。
1 app_name = 'hello' urlpatterns = [ path('', views.index, name='index'), path('hello/<str:name>', views.hello, name='hello') ]
然后在標簽上添加用冒號分隔開的命名空間名稱即可。
1 <a href="{% url 'hello:hello' '張三' %}">你好,張三</a>
  • 靜態文件

  雖然有了模板頁面,可以來展示一些標簽的效果,但是整個HTML還是感覺很丑陋,所以,我們還要繼續引入
一些類似css、img這樣的靜態資源,來裝飾我們的頁面。
  在django中模板頁面的靜態資源使用,不能像之前寫HTML代碼直接引入,需要我們首先在項目中創建目錄保
存對應的靜態資源。

    • 在settings中配置靜態文件保存目錄,添加如下內容:

         有些靜態文件可能是多個app公用的,這時候需要進行一點額外設置。首先在和app同級的目錄創建static文件夾並將靜態文件放入。然后在配置文件中添加額外的搜索路徑配置。

       還是由於django文件搜索機制,我們最好在靜態目錄中添加一個public子文件夾和其他靜態文件區分。

1 STATICFILES_DIRS = (
2         os.path.join(BASE_DIR, 'static'),
3 )
4 # STATICFILES_DIRS 該配置項用來告訴django在查找靜態資源時,應該訪問哪個目錄
    • 在項目中創建static目錄,static目錄下創建專門保存圖片的img目錄,在里面存一張圖片1.jpg
 
      文件結構類似下圖:

 

  需要注意的是,由於前面介紹的django文件搜索機制,在靜態文件夾中,我們最好在指定一級和app同名的文件夾用來區分不同app間的靜態文件。
    • 有了圖片,接下來在模板頁面中去引入並使用它,打開index.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     <h1>{{ message }}</h1>
10     <img src='{% static "img/1.jpg" %}' alt="圖片">
11 </body>
12 </html>

 

    • 這里用到了一個特殊語法: {% tag %} 這個叫靜態標簽,靜態標簽不同於模板變量,靜態標簽經常用來加載數據,或創建邏輯,比如之后我們要學到的 {% if %} ,使用靜態標簽可以方便我們在模板頁面上實現某些只有在后台代碼中才可以實現的邏輯功能。
    • 在頁面中要引入靜態資源,圖片,CSS,JS文件,在引入時都需要通過 {% static "path" %} 來進行引入,並且在模板頁面頭部需要使用 {% load staticfiles %} 標簽進行靜態資源的加載。
  • 模型數據庫
有了以上內容的修飾,現在感覺還是缺少一些什么,我們在視圖函數中為前端頁面返回的是一個提前定義好的
變量,這顯然在真正開發中是很少出現的,我們的數據大都來自於數據庫中,那么現在需要我們在項目中加入
數據庫,並且在視圖函數中通過對數據庫的訪問來拿到數據
    • 創建數據庫,這里使用項目自帶的SQLite3數據庫,默認已經是配好的,接下來需要我們進入到app下的models.py文件中,編寫一個類,這個類就對應數據庫中的一張表。
1 #myapp/models.py
2 from django.db import models
3 # Create your models here.
4 class Weather(models.Model):
5     weather = models.CharField(max_length=100,verbose_name="天氣")
6     class Meta:verbose_name_plural = "天氣"
7     # 設置當前表名的一個可讀的性更好的名字
8     def __str__(self):
9         return self.weather

 

 
    • 在這里我們使用到了django的orm映射關系用來創建數據庫表,繼承自django的models.Model類,一個類用來表示一張表,類中的一個屬性代表一個字段,這里我們定義了一個類型為CharField,長度為100的字段,用來存儲天氣。
    • 下面的class Meta是模型類的元類,用來設置當前表的一些屬性;這里我們使用verbose_name_plural屬性設置當前表在admin后台查看時的名字
    •  在這里我們還定義了一個屬於實例的函數__str__,用來描述當前數據在返回時的默認展示結果,為weather字段的值
    • django在創建模型類對應的數據表時,默認使用 應用名 加 下划線 加 模型類名 作為表的名字;比如當前Weather表名為:myapp_Weather
      • orm映射關系,是django與數據庫之間的一個橋梁,可以使開發者不再關注如何去編寫SQL語句,直接通過一套ORM所提供的API接口即可方便對各種數據庫進行交互。
    • 當某個子應用APP涉及到了數據庫的使用時,要記得在settings文件中進行配置:
 1 #myproject/settings.py
 2 INSTALLED_APPS = [
 3     'django.contrib.admin',
 4     'django.contrib.auth',
 5     'django.contrib.contenttypes',
 6     'django.contrib.sessions',
 7     'django.contrib.messages',
 8     'django.contrib.staticfiles',
 9     'myapp',
10 ]

 

    • 接下來通過manage.py命令行管理工具提供的兩條,創建我們所需要的數據。
    •  注意:默認django本身就已經需要一些數據的創建,所以我們在初次執行以下兩條命令時可能會看到很多數據表和字段的創建,不要驚訝,這是正常的
1 python manage.py migrate     # 根據數據庫遷移文件生成對應SQL語句並執行
2 # 初次執行是為了先把默認django需要的數據庫創建出來
3 python manage.py makemigrations     # 創建數據庫遷移文件
4 # 這次執行是為了創建APP中Weather模型類的遷移文件
5 python manage.py    # 將新添加的模型類遷移文件生成對應SQL並執行,實際創建出對應的Weathe表
    如果提示結果正常,那么代表相應的數據表已經創建好了,接下來就需要我們去到django為我們提供的admin(數據庫管理界面)來進行相關表的操作
  • Django Admin

    • admin控制台是django為我們提供的一個非常便捷的用來管理數據庫的界面。在主控路由文件下,其實你已經看到了它對應的路由設置:path('admin/', admin.site.urls),
      • 進入admin界面,初次訪問連接:127.0.0.1/admin,會提示我們輸入賬號密碼,這是因為django的admin界面是需要一個超級管理員來登陸訪問的,所以還需要我們創建對應的admin界面下的超級用戶
      • 創建admin超級用戶,使用manage.py命令行執行如下命令:
python manage.py createsuperuser

 

      •      
Username (leave blank to use 'lienze'): root
Email address:
Password:Password (again):
This password is too short. It must contain at least 8 characters.
This password is too common.
This password is entirely numeric.
Password:
Password (again):
This password is too common.
This password is entirely numeric.
Password:
Password (again):
Superuser created successfully.

 

      • 以上是我們創建超級用戶的過程,非常坎坷;可以看到,在輸入太短(不滿足8位),或是只包含數字的簡單密碼,超級用戶的創建都是被拒絕的所以我們把用戶賬號創建為 root ,而密碼創建為 a1234567 ,接下來開啟測試服務器,並通過創建好的超級用戶登陸訪問,如果幸運的話,你已經可以看到后台的admin界面啦admin界面已經展示出了默認django所使用的兩張表,用戶表和組表,用來保存當前管理后台的用戶以及對應權限分組,可以點入用戶表查看其中我們剛創建的root。
  • 啟動開發服務器

Django 的管理界面默認就是啟用的。讓我們啟動開發服務器,看看它到底是什么樣的。
如果開發服務器未啟動,用以下命令啟動它:
$ python manage.py runserver

 

現在,打開瀏覽器,轉到你本地域名的 "/admin/" 目錄, -- 比如 " http://127.0.0.1:8000/admin/" 。你應該會看見管理員登錄界面:
  • 進入管理站點頁面

現在,試着使用你在上一步中創建的超級用戶來登錄。然后你將會看到 Django 管理頁面的索引頁:
你將會看到幾種可編輯的內容:組和用戶。它們是由  django.contrib.auth 提供的,這是 Django 開發的認證框架。
 
  • admin注冊表
    雖然admin界面已經可以進來,但是為什么看不到剛才創建的Weather表呢,這是因為默認的表創建之后,還需要通過對應app下的 admin.py 文件進行admin后台注冊,只有注冊在這個文件中的模型類對應的表才可以在admin界面所看到
    • 在app下的admin.py文件中進行模型類的注冊:
1 #myapp/admin.py
2 from django.contrib import admin
3 from myapp import models
4 admin.site.register(models.Weather)
5 #使用register函數接收模型類作為參數即可完成
    
    注冊成功之后,在服務器,通過瀏覽器訪問 admin 界面,就可以看到創建好的Weather表了。
      鼠標點擊進去之后,就可以看到對應的表數據界面;右上角提供了可以添加功能的選項,試試給這個表來一些數據吧。
    • 例:
 
注意事項:
  • 這個表單是從問題 Question 模型中自動生成的
  • 不同的字段類型(日期時間字段  DateTimeField 、字符字段  CharField)會生成對應的 HTML 輸入控件。每個類型的字段都知道它們該如何在管理頁面里顯示自己。
  • 每個日期時間字段  DateTimeField 都有 JavaScript 寫的快捷按鈕。日期有轉到今天(Today)的快捷按鈕和一個彈出式日歷界面。時間有設為現在(Now)的快捷按鈕和一個列出常用時間的方便的彈出式列表。
頁面的底部提供了幾個選項:
  • 保存(Save) - 保存改變,然后返回對象列表。
  • 保存並繼續編輯(Save and continue editing) - 保存改變,然后重新載入當前對象的修改界面。
  • 保存並新增(Save and add another) - 保存改變,然后添加一個新的空對象並載入修改界面。
  • 刪除(Delete) - 顯示一個確認刪除頁面。
  如果顯示的 “發布日期(Date Published)” 和你在  教程 1 里創建它們的時間不一致,這意味着你可能沒有正確的設置  TIME_ZONE 。改變設置,然后重新載入頁面看看是否顯示了正確的值。
       通過點擊 “今天(Today)” 和 “現在(Now)” 按鈕改變 “發布日期(Date Published)”。然后點擊 “保存並繼續編輯(Save and add another)”按鈕。然后點擊右上角的 “歷史(History)”按鈕。你會看到一個列出了所有通過 Django 管理頁面對當前對象進行的改變的頁面,其中列出了時間戳和進行修改操作的用戶名:
 
  • 視圖操作模型
      最終我們希望可以在視圖函數中通過orm接口來訪問到表中的數據,那么來打開視圖文件吧,views.py
1 #myapp/views.py
2 from django.shortcuts import render
3 from myapp import models
4 def index(request):
5     weathers = models.Weather.objects.all()
6     content = {
7         "weathers":weathers,
8     }
9     return render(request, 'index.html', content)

 

  光返回是不行的,雖然我們綁定到了模板版變量的字典中,但是還得修改一下對應的要渲染的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 %} 可以用來在模板頁面出迭代訪問取出每一個數據,具體對於不同序列數據的訪問我們會在后面詳細為大家介紹, {% empty %} 標簽用來判斷當循環訪問數據為空時要做的事情,最后循環標簽要有 {% endfor %} 標簽進行結束。因為HTML中並沒有像Python縮進這樣的方式來控制代碼塊。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM