• 周日. 10 月 6th, 2024

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

Django函数视图与类视图

admin

11 月 28, 2021

一、函数视图

1、在子应用的views.py文件中定义

2、必须传递参数request

3、路由条目配置:路由与函数视图引用 映射

示例:

def index(request):
    """
    :param request: WSGI对象,自动传递
    :return: HttpResponse对象
    """
    print(request)
    print(type(request))
    # 查看继承关系
    print(type(request).__mro__)
    return HttpResponse("hi~ django.")


def get_project(request, pk):
    return HttpResponse(f"project{pk}")


def project_name(request, name):
    return HttpResponse(f"project: {name}")

二、类视图

1、在子应用的views.py文件中定义

2、必须继承View或View的子类

3、类视图中定义的视图方法名必须与请求方法名一一对应,即get–>GET   post–>POST   put–>PUT    patch–>PATCH …

4、路由条目的配置:路由与类视图引用.as_view() 映射

示例:

class ProjectsView(View):

    def get(self, request, pk):
        data = {
            'id': pk,
            'name': 'xx项目',
            'leader': 'ppd'
        }
        data2 = [
            {
                'id': pk,
                'name': 'xx项目',
                'leader': 'ppd'
            },
            {
                'id': 2,
                'name': 'xx项目2',
                'leader': 'ppd2'
            }
        ]
        json_str = json.dumps(data, ensure_ascii=False)
        """
        1、JsonResponse 是 HttpResponse的子类
        2、HttpResponse接收的content必须是str或byte类型
        3、JsonResponse用于返回json数据,接收的data可以是dict或嵌套dict的list,默认是dict
        4、JsonResponse接收的data是list时,必须设置safe=False
        """
        # return HttpResponse(json_str, content_type='application/json')
        # return JsonResponse(data, json_dumps_params={'ensure_ascii': False})
        return JsonResponse(data2, json_dumps_params={'ensure_ascii': False}, safe=False)

    def post(self, request, pk):
        return HttpResponse("post")

    def put(self, request):
        return HttpResponse("put")

    def delete(self, request):
        return HttpResponse("delete")

路由配置示例:

urlpatterns = [
    # 1、定义视图函数的路由:path(路由, 视图函数名)
    path('index/', index),
    path('<int:pk>/', get_project),
    re_path(r'^name/(?P<name>w{3})/$', project_name),
    # 2、定义视图类的路由:path(路由, 视图类名.as_view())
    path('project/<int:pk>/', ProjectsView.as_view())
]

三、函数视图与类视图对比:

1、函数视图优点:好理解;缺点:代码可读性与复用性不佳

2、类视图优点:可读性与复用性更好;不同的请求方式用不同的方法呈现(dispatch方法做了分发)

本博客仅为本人学习过程中的记录,欢迎一起交流经验。

发表回复