Django(1) - 初識Django框架

葛老頭發表於2022-12-27

1.前言

該專欄學習筆記環境引數如下:

  • Windows 10
  • Xampp/Navicat for MySQL
  • Python 3.8+
  • Django 3.0.*
  • Vue 2.6+

 

開發工具:

  • PyCharm 專業版
  • VS Code

 

補充說明:

本人電腦存在多個版本的python,那麼當你電腦存在多個版本python,如何使用?如何指定pip安裝到指定版本?透過py 選擇版本,然後進行相關命令操作。詳見:https://blog.csdn.net/stone_tigerLI/article/details/121496828,自行百度不贅訴

2.初識Django框架

2.1.Django介紹

Django分層設計也是透過MTV,區別於Flask,這些相關內容Django都有,不需要依賴擴充套件。安裝Django時,自己要在網上查詢一下你安裝的Django版本和你的Python版本相容不相容!

2.2.開發基礎知識

2.2.1.Django的安裝

  • 方式一:pip安裝【推薦】 pip install django 

  •  方式二:前往官網pypi.org下載原始碼安裝,cd到setup.py目錄下,執行 python setup.py install 

  •  檢測是否安裝成功
    Django(1) - 初識Django框架
    import django
    django.__version__
    View Code

2.2.2.Django專案的建立

  • 方式一:使用命令列生成模板 django-admin[.py] startproject my_project ,這個命令的django-admin是什麼?在我們pip安裝好django後,在圖示目錄生成exe。命令引數含義:【.py】是可選的;startproject建立;my_project建立的專案名稱。

2.2.3.Django專案的檔案目錄結構

templates:模板目錄

test_django:專案目錄

  • __init__.py:包的入口檔案
  • asgi.py:部署配置
  • settings.py:專案配置檔案
  • urls.py:url訪問地址配置檔案
  • wsgi.py:部署配置

manage.py:命令列管理工具

2.2.4.Django專案開發伺服器的啟動

啟動伺服器方式一: python manage.py runserver 

 啟動伺服器方式二:

思考:我想指定啟動的埠怎麼辦? 

 

2.3.開發流程講解

2.3.1.開發伺服器的啟動配置

知識點1:選擇專案直譯器,透過cmd執行django-admin建立的專案需要進行選擇。pycharm方式建立的專案不需要選擇,因為在建立專案的時候已經選擇過了直譯器

知識點2:啟動開發伺服器 python manage.py runserver ,runserver常用引數

  • 指定埠:
    • 命令列啟動 python manage.py runserver 9527 
    • pycharm啟動

  • 指定IP及埠:
    • 命令列啟動python manage.py runserver 0.0.0.0:9527
    • pycharm啟動

指定IP啟動後,根據頁面提示資訊,我們需要在setting.py配置ALLOWED_HOSTS,由於安全的需要,需要指定哪些主機是可以訪問的;新增好之後,再次訪問就OK了

2.3.2.專案模組的建立

建立示例hello模組: python manage.py startapp hello ,模組的含義以及生成的內容會在後面筆記中寫,該篇隨筆只是認識Django框架

2.3.3.完成第一個頁面

第一步:在views.py檔案中寫個函式

第二步:在urls.py配置規則

3.從請求到響應

3.1.從請求到響應

知識點:

  • 瞭解URL的設計及配置
  • 掌握檢視的定義及作用
  • 掌握URL和檢視的關係
  • 瞭解檢視響應的內容

 

什麼是檢視?

一個檢視函式,簡稱為檢視,是一個簡單的Python函式。函式定義的位置是在模組的views.py檔案中,傳入request引數,request這個引數是固定的必須得有,當然你也可以叫其他名字。

檢視函式的作用:就是接受一個請求,返回一個響應;

 

URL的設計:設計簡單優雅的URL:使用正規表示式、指定引數型別

URL的常用配置:函式 path(route,view,name,**kwargs) \函式 include(urls,namespace) ;path函式就是之前上述例子urls.py檔案中使用的,include函式就是我們在使用模組化開發的時候進行使用,希望把某一個模組下的url單獨進行管理,然後再把所有模組的url整合到一起,這個時候就需要用到include函式。

透過django專案的配置檔案settings.py我們看到,根url是圖示的urls檔案

include示例:按模組管理url,首先在hello模組下新建一個urls檔案

URL與檢視的關係:

  • URL的正向解析
  • URL的逆向解析,防止我們硬編嗎,類似flask中的url_for

 

 

檢視響應的內容:

  • 可以是文字
  • HTML內容
  • 影像
  • 甚至是404、重定向等

 

小結:檢視是一個Python函式,用來處理http請求。透過path和include函式配置url,將url和檢視函式關係建立起來。

 

3.2.在檢視中處理業務邏輯

3.2.1.響應HTML內容

3.2.2.獲取URL引數

  • 獲取URL中指定型別的引數
  • 獲取URL中正則匹配的引數

3.2.3.獲取GET引數

3.3.從檔案響應HTML內容

知識點:

  • 回顧 響應HTML內容的原理
  • 瞭解 render_to_string()函式
  • 掌握 render()函式

3.3.1.響應HTML內容的原理

其實和FLASK差不多

  • 第一步,從磁碟讀取HTML檔案
  • 第二步,替換HTML中的特殊字元
  • 第三步,傳送給瀏覽器

 

3.3.2.render_to_string()函式

 render_to_string(template_name,context=None,request=None,using=None) 

  • template_name:模板名稱,必傳
  • request:請求物件
  • context:模板上下文物件(dict)
  • using:模板引擎名稱(如:Jinja2)

 

補充說明:配置檔案settings.py檔案的TEMPLATES屬性說明

  • BACKEND:模板引擎,現在預設是使用django自帶的模板引擎
  • DIRS:模板目錄,去哪裡找html檔案
  • APP_DIRS:為True時,代表可以在模組下面去找html檔案
  • OPTIONS:配置選項

補充說明:Django框架尋找模板的順序,程式會先去根目錄的templates下尋找對應的html檔案,若根目錄下的templates下沒有對應的html檔案,程式會去模組下的templates尋找對應的html。若根目錄和模組目錄的templates都有這個html檔案,會執行根目錄下的html檔案。這個執行順序是無法修改的!

想讓程式去模組目錄裡面找html檔案怎麼配置呢?

3.3.3.render()函式

 render(request,template_name,context=None,content_type=None,status=None,using=None) ,實際工作當中render()的使用頻率要高於render_to_string(),因為它使用起來更簡單。

  • request:請求物件,必傳
  • template_name:模板名稱,必傳
  • context:模板上下文物件(dict)
  • context_type:MIME型別,預設為text/html
  • status:HTTP狀態碼
  • using:模板引擎名稱(如:Jinja2)

3.4.請求響應物件

知識點:

  • 掌握 請求到響應的流程
  • 理解 請求物件
  • 理解 響應物件

3.4.1.請求與響應

3.4.2.請求物件HttpRequest

請求物件HttpRequest其實是Django框架中寫好的一個類,它把我們每一次發過來的請求封裝成一個物件。檢視中使用的使用,方法傳遞進去的request,就是HttpRequest的例項。它裡面有一些常用的屬性和方法可以提供給我們使用:

  • 請求方式method(POST/GET/.....)
  • 請求頭資訊META/headers,META返回的更詳細,header返回的請求頭資訊常用的基本都在。反回的請求頭資訊都是JSON格式,常用的key資訊?
    • REMOTE_ADDR:獲取請求的IP地址
    • HTTP_USER_AGENT:使用者請求終端的資訊
  • 獲取請求傳遞引數
    • GET:GET請求引數
    • POST:POST請求引數
    • COOKIES:cookie資訊
    • FILES:檔案資訊

示例程式碼:

 1 # urls.py檔案照著圖片敲,後面就只貼上知識點程式碼
 2 
 3 def http_request(request):
 4     """請求練習"""
 5     # 1. 請求方式
 6     print(request.method)
 7 
 8     # 2. 請求頭資訊
 9     # 2.1 獲取請求頭資訊META和headers
10     # META
11     headers = request.META  #詳細
12     print(headers)
13     # headers
14     print(request.headers)  #簡略
15 
16     # 2.2 根據key獲取具體屬性資訊
17     # 方式一:META.get(key)
18     ua = request.META.get('HTTP_USER_AGENT',None)
19     print(ua)
20     # 方式二:headers['key'],key的大小寫都支援
21     print(request.headers['User-Agent'])
22     print(request.headers.get('user-agent'))
23 
24     # 3. 獲取請求引數request.Get.get()
25     name = request.GET.get('name','')
26     print(name)
27     print(request.GET.get('cookies'))
28 
29     return HttpResponse('響應')

3.4.3.響應物件

常用響應物件

  • HttpResponse
  • HttpResponseRedirect:重定向
  • JsonResponse:響應json
  • FileResponse:響應檔案

響應物件之間的關係

下面將針對常用的響應物件的屬性和方法進行詳細闡述

 

HttpResponse

  • status:設定HTTP響應狀態碼
  • status_code檢視HTTP響應狀態碼
  • content_type:設定響應的型別
  • write():寫入響應內容
1 def http_response(request):
2     """響應練習"""
3     resp = HttpResponse('響應內容',status=201,content_type='text/html; charset=utf-8')
4     resp.status_code = 200
5     resp.write('lalallalalal')
6     print(resp.status_code)
7     return resp

JsonResponse

1 def http_response(request):
2     """響應練習"""
3     user_info = {
4         'name':'張三',
5         'age':34
6     }
7     return JsonResponse(user_info)

FileResponse

常見的Content-Type

  • text/html:超文字標記語言文字(HTML)
  • text/plain:普通文字
  • text/xml:xml文件
  • image/png、image/jpeg、image/git:圖片或圖形
  • application/json:json資料型別

 

小結:請求物件就一個,響應物件可以有多種型別

 

3.5.檢視快捷方法

知識點:

  • 瞭解 什麼是重定向:這個自行百度
  • 掌握 如何實現重定向

 

實現URL訪問的重定向

  • 方式一:使用HttpResponseRedirect重定向
  • 方式二:使用redirect()快捷方式

 

思考:程式異常怎麼辦?磁碟滿了?資料庫崩了?

 

3.6.內建的檢視及重寫

知識點:

  • 瞭解 常見的錯誤
  • 掌握 重寫內建檢視
  • 瞭解 處理靜態檔案

 

內建的錯誤處理檢視

  • 400 Bad Request
  • 403 Forbidden
  • 404 Not Found
  • 500 Internal Server Error

 

重寫內建的錯誤處理檢視

  • 第一步:在專案urls.py中新增配置
    • handler500 = “my_project.views.page_500”,給handler500報錯賦予處理錯誤檢視函式,為空時,使用框架自帶預設的
    • handler400,handler403,handler404同上配置
  • 第二步:切換到生產模式,將settings.py中的DEBUG改為False

示例

編寫錯誤處理檢視函式,實際專案中,位置一般不放在模組裡面,因為這是所有模組可以公用的。

由於公用,因此新增到根目錄的urls.py檔案中。指定處理500報錯的檢視

模組業務邏輯檢視中,raise丟擲錯誤

配置檔案中將環境改為生產環境,注意改為False時,ALLOWED_HOSTS屬性不能為空值,否則報錯。

 訪問raise丟擲錯誤的模組url。

注意:400幾個的handler,如果編寫其對應的檢視處理函式時,需要傳遞其他的引數?。後面的筆記中用到400幾個handler的時候,會進行詳述。

 

static.serve處理靜態檔案

實際專案中會有許多靜態檔案,有使用者上傳的圖片,有專案自帶的js、css、圖片等等。透過django如何展示呢,上面有提到可以透過fileresponse物件展示,還有沒有其他辦法?透過static.server進行處理

  • 第一步:在專案settings.py中新增配置
    •  MEDIA_URL='/media/' :表示媒體media的URL。下面的示例沒有新增該配置項,後面專案實戰筆記會闡述該配置的作用。
    •  MEDIA_ROOT=os.path.join(BASE_DIR,'medias') :我們靜態檔案存放的位置
  • 第二步:在urls.py中新增配置,將我們進行開發的時候,把專案當中的靜態檔案,放到django內建伺服器當中,是我們可以直接進行訪問。

 ?圖,官方說在開發模式下進行使用,為什麼呢?因為django內建的伺服器就是開發伺服器,肯定不能滿足生產環境的需要。在實際生產環境中呢,我們會使用其他的方式進行處理,後面會講。此處重要內容是處理靜態檔案,知道透過django自帶的伺服器,可以訪問靜態檔案。衍生跟專案相關的,後面筆記有。

 

處理靜態檔案示例:

在settings.py中新增MEDIA_ROOT,指明靜態檔案存放的位置。

如何指明靜態檔案存放的位置,使用絕對路徑還是相對路徑?在配置檔案一開始,我們看到django自帶的變數BASE_DIR代表的就是當前專案目錄

 在urls.py檔案中新增圖示配置,那這段程式碼是什麼意思?如果我們開啟了除錯模式即開發模式。在urlpatterns中追加一個路由定址,透過正則匹配,media開頭任意結尾。呼叫的檢視是django.views.static自帶的serve。document_root指向我們剛剛在settings.py檔案中新增的變數MEDIA_ROOT,即靜態檔案目錄。

 settings.py開啟開發模式,訪問地址(按照我們新增的規則,路由即media/開頭),發現成功訪問靜態檔案

 

 

思考:我們在settings.py檔案新增靜態檔案目錄MEDIA_ROOT時,發現有一個STATIC_URL變數,這個是幹什麼用的?

Django有兩種靜態檔案:

  • medias 稱為媒體資料夾,主要用來儲存使用者上傳的檔案,例如圖片等,是變動的,由使用者定義的檔案,如使用者頭像, 使用者上傳的圖片或影片等;
  • static 稱為靜態資料夾,主要存的是CSS, JavaScript, 網站logo等不變的檔案,是不變的,形成網站的核心部件,如 CSS檔案,JS檔案,背景圖片等;

settings中的STATIC_URL = 'static/'配置是靜態路由對映,就是可以讓django利用STATIC_URL來讓瀏覽器可以直接訪問static下的靜態檔案。在urls.py對static檔案路徑進行配置

setting檔案中對STATIC_URL進行配置,預設是static目錄,也可以自行定義。

 

3.7.使用class重寫檢視

思考:檢視函式如何使用物件導向程式設計思想進行改寫?

 

知識點:

  • 理解 類檢視概念
  • 掌握 實現類檢視
  • 瞭解 類檢視的本質
  • 瞭解 內建通用檢視

 

基於類的檢視

  • 檢視是一個可呼叫的物件,可以接受一個請求然後返回一個響應
  • 基於類的檢視可以結構化你的檢視,簡化你的檢視程式碼
  • 基於類的檢視可以利用繼承和混合(多重繼承),重用/複用程式碼
  • 內建的檢視拿來即用,程式碼更簡潔

示例程式碼:

繼承檢視,配置模板地址。不像之前還需要加return render()返回響應,配置模板地址即可

配置URL,HomeView繼承了TemplateView類,使用自帶的as_view()方法透過HomeView類找到檢視

成功訪問 

TemplateView是如何根據我傳入一個模板檔名,就能找到模板呢?其實就是前面3.3.2的補充說明部分

常見的內建通用檢視:後面筆記會對其詳細闡述

小結:使用class改寫檢視實際上是物件導向改造的過程,Django內建的通用檢視使程式碼更簡單

 

 

相關文章