zoukankan      html  css  js  c++  java
  • django 视图模式

    一 视图

    1. FBV --- function based view(基于函数视图)
    2. CBV --- class based view(基于类的视图函数)

    二 请求方式

    • get
    • post
    • put/patch
    • delete
    • head
    • option

    三 基于CBV的简单演示实例

    • urls.py
    from django.contrib import admin
    from django.urls import path
    
    
    from app01 import views
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('login/', views.LoginView.as_view()),
        path('books/', views.BookView.as_view()),
    ]
    • views.py文件
    from django.shortcuts import render,HttpResponse
    
    # Create your views here.
    
    import json
    
    #第一步导包
    from django.views import View
    #自定义一个类接口,必须继承View
    class LoginView(View):
    
        def dispatch(self, request, *args, **kwargs):
            print("接受请求...")
            ret=super().dispatch(request, *args, **kwargs)
            return ret
        def get(self,request):
            return render(request,"login.html")
    
        def post(self,request):
    
            print(request.POST.get("user"))
            print(request.POST.get("pwd"))
            return HttpResponse("OK")
    
        def delete(self,request):
    
            return HttpResponse("delete...")
    
    
    class BookView(View):
    
        def get(self,request):
            book_list=["python","linux","go"]
            return HttpResponse(json.dumps(book_list))
    • login.html
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    
    
    <form action="" method="post">
        {% csrf_token %}
        用户名:<input type="text" name="user">
        密码:<input type="password" name="pwd">
        <input type="submit">
    </form>
    </body>
    </html>

    四 from django.views import View 源码解析

    1 步骤一

    执行urls.py中的 path('login/', views.LoginView.as_view())

    2 步骤二

    先在自己定义LoginViews类中查找as_iew(),找不到再到父类中查找

     def as_view(cls, **initkwargs):
            """Main entry point for a request-response process."""
        
            #...看不懂的省略。
            def view(request, *args, **kwargs):
               #...看不懂的省略。
                return self.dispatch(request, *args, **kwargs)
            view.view_class = cls
            view.view_initkwargs = initkwargs
             
            #...看不懂的省略。
            return view    #这就是我们要找的,返回一个函数
    这一步的结果:
     path('login/', views.LoginView.as_view())---》path('login/', View.view),

    3 步骤三

    #执行view代码
    def view(request):
           #看不懂代码省略
                  
            return self.dispatch(request, *args, **kwargs) #返回一个分发函数的结果

    4 步骤四

    def dispatch(request, *args, **kwargs):
           if request.method.lower() in self.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)  #返回执行结果

    此步骤:根据请求方式分发给不同的执行函数

    5 步骤五

    执行请求方式对应的函数,先从自己的类(LoginView)中寻找。

    没找到就执行父类的方法

    注意:self代表的是LoginView类

  • 相关阅读:
    Qt 数据库篇
    js字符串函数(转)
    如何解决IE无法识别html5中的新标签(article、abbr、header等)
    web多页打印问题
    诡异的Spinner级联样式
    discuz x2用户删除了,帖子不能用了,恢复帖子的办法
    创业公司如何招聘优秀工程师
    清除目录下的SVN信息
    .NET 项目SVN 全局排除设置
    编程技术面试的五大要点
  • 原文地址:https://www.cnblogs.com/angle6-liu/p/10474045.html
Copyright © 2011-2022 走看看