1. 程式人生 > 其它 >Django微講解(四)

Django微講解(四)

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小白陸祿緋,歡迎各位大佬的指點!!!