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()