APIView
一、FBV和CBV
FBV(function based view)基于函数的视图控制
实例一: 1.在url映射表注册新的映射关系: `url('^login/',view.index)` index是个函数变量,指向函数的内存空间,用户一旦访问正则表达式字符串^index/,视图函数就会 被执行,传一个固定参数request,它是django在wsgiref中封装的request对象 2.在views.py中自定义注册函数 ``` def login_view(self, request): user = request.POST.get("user") pwd = request.POST.get("pwd") queryset=User.objects.filter(user=user,pwd=pwd) if queryset: return HttpResponse("OK") else: return HttpResponse("ERROR") ```CBV(class based view)基于类的视图控制
实例一: 1.在urls.py的映射表中注册映射关系 `url('^login/',views.LoginView.as_view()),`2.在views.py中
from django.views import View
class LoginView(View):
def get(self, request):
return render(request, "login.html")
def post(self, request):
if request.method == "POST":
user = request.POST.get("user")
pwd = request.POST.get("pwd")
return HttpResponse("ok")
查看CBV源码:
在urls.py的映射表中注册映射关系
url('^login/',views.LoginView.as_view()),
views.LoginView对应的是该应用下的views文件里的
LoginView类不是类的实例,该类继承了from django.views import View的View。而LoginView.as_view()是
在LoginView类找这个类方法,在里面没找到就去LoginView类的父类View里面去找。
url(r'^login/', views.LoginView.as_view()),
||
url(r'^login/', View.as_view()),
在父类View里找到
http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']
这是其父类View支持的http方法
@classonlymethod
def as_view(cls, **initkwargs):
for key in initkwargs:
if key in cls.http_method_names:
raise TypeError("xxxxx")
if not hasattr(cls, key):
raise TypeError("xxxxx")
def view(request, *args, **kwargs):
return self.dispatch(request, *args, **kwargs)
return view #返回一个函数变量。
这样,我们就可以将
url('^login/',views.LoginView.as_view())
||
url(r'^login/', View.as_view()),
||
url(r'^login/', View.view),
因为我们还没看到response,就接着到self.dispatch(request, *args, **kwargs)里看里面有没有response。
def dispatch(self, request, *args, **kwargs):
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower())
return handler(request, *args, **kwargs)#执行我们自己的定义的方法。
类有实例方法和类方法
django序列化接口
from app02.models import *
from django.shortcuts import render, HttpResponse
from django.core.serializers import serialize
class UserView(View):
def get(self, request):
queryset = User.objects.all()
queryset = serialize("json", queryset)
return HttpResponse(queryset)
def post(self, request):
pass
RESTful的APIView
下载:
清华源:pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple djangorestframework
pip包管理工具:pip3 install djangorestframework
使用:
1.先注册app
2.url注册:url(r'^user/', v2.UserView.as_view())
3.在视图控制中
from rest_framework.views import APIView
class UserView(APIView):
def get(self, request):
queryset = User.objects.all()
queryset = serialize("json", queryset)
return HttpResponse(queryset)
def post(self, request):
pass