Django框架——CBV及源碼分析

CBV (基於類的視圖函數)html

代碼示例:mysql

urls.pysql

url(r'^login/',views.MyLogin.as_view())

views.pydjango

from django.views import View

class MyLogin(View):
    def get(self,request):
        print("from MyLogin get方法")
        return render(request,'login.html')
    def post(self,request):
        return HttpResponse("from MyLogin post方法")

研究方向:瀏覽器

1.從url進入app

url(r'^login/',views.MyLogin.as_view())

因爲函數名加括號執行優先級最高,因此這一句話一寫完會馬上執行as_view()方法,返回view函數

@classonlymethod
def as_view(cls, **initkwargs):  # cls就是咱們本身的寫的類 MyLogin
    def view(request, *args, **kwargs):
        self = cls(**initkwargs)  # 實例化產生MyLogin的對象  self = MyLogin(**ininkwargs)
        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)  # dispatch返回什麼 瀏覽器就會收到什麼
        # 對象在查找屬性或者方法的時候 你必定要默唸 先從對象本身這裏找  而後從產生對象的類裏面找  最後類的父類依次日後
    return view

經過源碼發現url匹配關係能夠變造成post

url(r'^login/',views.MyLogin.view)  # FBV和CBV在路由匹配上是一致的 都是url後面跟函數的內存地址

2.當瀏覽器中輸入login會馬上觸發view函數的運行,走上面的view函數,再進入到dispatch方法測試

def dispatch(self, request, *args, **kwargs):
    # Try to dispatch to the right method; if a method doesn't exist,
    # defer to the error handler. Also defer to the error handler if the
    # request method isn't on the approved list.
    # 咱們先以GET爲例
    if request.method.lower() in self.http_method_names:  # 判斷當前請求方法是否在默認的八個方法內
        # 反射獲取咱們本身寫的類產生的對象的屬性或者方法
        # 以GET爲例  request.method.lower()是get   handler = getattr(self,'get','取不到報錯的信息')
        # handler = get(request)
        handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
    else:
        handler = self.http_method_not_allowed
    return handler(request, *args, **kwargs)  # 直接調用咱們本身的寫類裏面的get方法
# 源碼中先經過判斷請求方式是否符合默認的八個請求方法 而後經過反射獲取到自定義類中的對應的方法執行

經過獲取對應的方法(get,post),而後執行view.py中對應的請求方法url

Django快速新建測試腳本

1.隨便新建一個test.py文件作測試文件

2.寫以下代碼

import os

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysqltest.settings")    #前面這幾行是從manage.py複製的
import django django.setup()

相關文章
相關標籤/搜索