Django微講解(四)
阿新 • • 發佈:2022-05-15
Django微講解(四)
虛擬環境
在實際開發專案工作中,針對不同的專案需要為其配備對應的直譯器環境,為了無障礙的開啟並執行,我們有兩種辦法,方式一:把 所有需要用到的模組全部下載下來,如果有相同模組不同版本每次都重新下載替換;很明顯方式一是不可取的,所以還有第二種方式:提前準 備好多個直譯器環境,針對不同的專案進行切換即可,很明顯第二種方式更合理,所以我們就要用到虛擬環境。 # 1.建立虛擬環境 點選File-->New Project-->Pure Python-->New environment using-->Create即可建立一個虛擬環境 # 2.識別虛擬環境 目錄下有一個紅色的venv資料夾 # 3.如何切換環境 我們先在建立好的虛擬環境下載好我們先要模組或者框架,然後就可以建立新的pycharm視窗,選擇不同的直譯器即可。
建立虛擬環境
切換環境
Django版本區別
Django的版本區別主要在於1.x與2.x、3.x之間的區別,因為2.x與3.x基本沒有大的區別,我們講一下1.x與另外兩個版本在路由 層的區別。 # 1.路由匹配的方法不一樣 (1)1.x使用的是url方法,第一個引數支援正則 (2)另外兩個版本使用的是path方法,第一個引數不支援正則,如果想要使用正則,也提供了一個re_path方法,只需要匯入該模組 即可 # 2.path方法提供了轉換器功能 匹配對應位置的資料並且會自動轉換型別,一共有五中轉換器,分別是: str:匹配除了路徑分隔符(/)之外的非空字串,這是預設的形式 int:匹配正整數,包括0 slug:匹配字母、數字、下劃線以及橫槓組成的字串 uuid:匹配格式化的uuid path:匹配任何非空字串,包含了路徑分隔符,不能用'?' ''' 例子:path('admin/<int:id>',views.index) '''
檢視函式返回值
# 檢視函式必須返回一個HttpResonse物件
我們前面講過的Django小白必會三板斧HttpResonse、render、redirect其實其實最後返回的都是HttpResonse物件
# 1.HttpResonse
class HttpResonse(...):
pass
# 2.render
def render(...):
return HttpResonse(...)
# 3.redirect
def redirect(...):
# 多繼承
JsonResponse物件
from django.http import JsonResponse def test(request): user_dict = {'name': 'oscar','password': 123,'hobby': '與世無爭'} return JsonResponse(user_dict,json_dumps_params={'ensure_ascii': False}) ''' 通過檢視原始碼來學習,有已知推導未知 Django對json序列化的資料型別的範圍做了擴充,所以我們使用JsonResponse而不是原始的json模組 '''
form表單上傳檔案
form表單上傳的資料中如果含有檔案,那麼需要做一下幾件事:
1.method必須是post
2.enctype必須修改為multipart/form-data,預設不修改的是application/x-www-form-urlencoded
3.後端需要使用request.FILES獲取
# 示例
print(request.FILES) # 專門獲取檔案資料
file_obj = request.FILES.get('my_file')
print(file_obj.name) # 檢視檔名
with open(file_obj.name,'wb') as f:
for line in file_obj: # 支援for迴圈
f.write(line)
request其他方法
# 1.request.body
存放的是接收過來的最原始的二進位制資料,request.POST、request.GET、request.FILES這些獲取資料的方法其實都是從body
中獲取資料並解析存放的
# 2.request.path、request.path_info
獲取路徑
# 3.request.get_full_path()
獲取路徑並且還可以獲取到路徑後面攜帶的引數
FBV與CBV
# 1.FBV:基於函式的檢視
url(r'^index/',函式名)
# 2.CBV:基於類的檢視
from django import views
class MyViews(views.View):
def get(self,request):
return HttpResponse('來著CBV的get方法')
def post(self,request):
return HttpResponse('來自CBV的post方法')
url(r'^CBV/', views.MyViews.as_view())
'''
如果請求方法是GET,會自動執行類裡面的get方法
如果請求方式是POST,會自動執行類裡面的post方法
'''
CBV原始碼剖析
# 1.切入點:路由匹配
因為我們使用類名加點呼叫屬性as_view並且還加了括號,所以我們初步判斷as_view可能是普通的靜態方法,或者是繫結給類
的方法。我們通過'ctrl+滑鼠左鍵'點選檢視原始碼發現,as_view是繫結給類的方法。
# 2.物件查詢屬性的順序
先從物件自身開始、再從產生物件的類、之後時候該類繼承的各個父類
url(r'^CBV/', views.MyViews.as_view())以這個為例子,我們使用類名加點呼叫了屬性as_view,我們現在我們自己定義的類
中查詢,發現並沒有這個屬性或者說方法,所以我們就去繼承的父類中檢視,發現這是一個繫結給類的方法。
# 3.函式名加括號執行優先順序最高
url(r'^CBV/', views.MyViews.as_view()),我們來看as_view加括號呼叫了,所以專案一啟動就會執行as_view方法,查
看原始碼得知這個繫結給類的方法返回了一個閉包函式名view
def as_view(cls):
def view(cls):
pass
return view
所以上述例子我們可以這樣認為:url(r'^CBV/', views.view),所以CBV與FBV在路由匹配上本質是一樣的。
# 4.路由匹配成功之後執行view函式
def view(request, *args, **kwargs):
self = cls(**initkwargs) # cls是我們自己寫的類
if hasattr(self, 'get') and not hasattr(self, 'head'):
self.head = self.get
self.request = request
self.args = args
self.kwargs = kwargs
return self.dispatch(request, *args, **kwargs)
# 5.執行dispatch方法
執行view函式返回了dispatch方法,物件加點呼叫了這個方法,我們先在產生物件的類中查詢,發現沒有沒有方法,然後就去
繼承的父類中查詢
def dispatch(self, request, *args, **kwargs):
if request.method.lower() in self.http_method_names: # 判斷當前請求方式是否在http_method_names中
handler = getattr(self, request.method.lower(), self.http_method_not_allowed) # 利用反射通過字串
來操作物件的屬性或者方法,裡面的引數分別為:自己寫的類產生的物件,請求資料的方法,當找不到請求資料方法的時候會用的引數
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'] # 請求資料的八種
方法
模板語法傳值
# 1.Django提供的模板語法只有兩個符號
{{}}: 主要用於變數相關操作
{%%}: 主要用於邏輯相關操作(迴圈、判斷)
# 2.傳值的兩種方式
1.指名道姓的傳,適用於資料量較少的情況,節省資源
示例:return render(request,'index.html',{'name': 'oscar'})
2.打包傳值,適用於資料量較多的情況,有時候會浪費資源,有一個方法'locals()',會將當前名稱空間中所有的名字全部傳遞
給HTML頁面
示例:return render(request,'index.html',locals())
# 3.傳值的範圍
1.基本資料型別都可以
2.函式名,模板語法會自動加括號執行並將函式的返回值展示到頁面上,不支援傳參,模板語法會自動忽略有參函式
3.檔名,直接顯示檔案IO物件
4.類名,自動加括號例項化成物件
5.物件名,直接顯示物件的地址,並且具備呼叫屬性和方法的能力
# 4.Django模板語法針對容器型別取值
使用'句點符',既可以點key,也可以點索引
這裡是IT小白陸祿緋,歡迎各位大佬的指點!!!