一、函数视图
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方法做了分发)