url控制器与响应器
一、自定义路由(原始方式)
urls.py
from django.conf.urls import url
from app01 import views
urlpatterns = [
url(r'^books/$', views.BookView.as_view()),
url(r'^books/(?P<pk>\d+)$', views.BookDetailView.as_view()),
]
views.py
class BookView(APIView):
def get(self, request):
book_list = models.Book.objects.all()
bs = BookSerializers(book_list, many=True)
return Response(bs.data)
def post(self, request):
# 添加一条数据
print(request.data)
bs=BookSerializers(data=request.data)
if bs.is_valid():
bs.save() # 生成记录
return Response(bs.data)
else:
return Response(bs.errors)
class BookDetailView(APIView):
def get(self,request,pk):
book_obj=models.Book.objects.filter(pk=pk).first()
bs=BookSerializers(book_obj,many=False)
return Response(bs.data)
def put(self,request,pk):
book_obj = models.Book.objects.filter(pk=pk).first()
bs=BookSerializers(data=request.data,instance=book_obj)
if bs.is_valid():
bs.save() # update
return Response(bs.data)
else:
return Response(bs.errors)
def delete(self,request,pk):
models.Book.objects.filter(pk=pk).delete()
return Response("")
二、视图类继承(ViewSetMixin)
ModelViewSet(....,GenericViewSet)>GenericViewSet(ViewSetMixin, generics.GenericAPIView)
ViewSetMixin类内重写as_view 必须传入actions
所以路由中必须传入 请求方式与视图中方法的映射关系如下所示:
urls.py
from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^books/$', views.BookView.as_view({'get': 'list', 'post': 'create'})),
url(r'^books/(?P<pk>\d+)',
views.BookView.as_view({'get': 'retrieve', 'post': 'update', 'delete': 'destroy'})),
url(r'^publish/', views.PublishView.as_view({'get': 'list', 'post': 'create'})),
url(r'^author/', views.AuthorView.as_view({'get': 'list', 'post': 'create'})),
url(r'^Text/', views.Text.as_view({'get': 'test1'})),
]
三、自动生成路由
urls.py
from rest_framework.routers import SimpleRouter,DefaultRouter
from django.conf.urls import url,include
from django.contrib import admin
from app01 import views
from rest_framework.routers import SimpleRouter,DefaultRouter
#SimpleRouter 自动生成两条路由
#DefaultRouter自动生成四条路由
#router=SimpleRouter()
router=DefaultRouter()
router.register('publish',views.PublishView)
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'', include(router.urls)),
# DefaultRouter实例化的可以用 以下方式访问
# 1 http://。。。/publish/
# 2 http://。。。/publish.json
# 3 http://。。。/publish/3
# 4 http://。。。/publish/3.json
]
register(prefix, viewset, base_name)
prefix 该视图集的路由前缀
viewset 视图集
base_name 路由名称的前缀
SimpleRouter
router = routers.SimpleRouter() # 生成两条路由
^books/$ name: book-list
^books/{pk}/$ name: book-detail
DefaultRouter与SimpleRouter的区别是,DefaultRouter会多附带一个默认的API根视图,返回一个包含所有列表视图的超链接响应数据。
另外的链接和行为
任何被@detail_route 或者 @list_route装饰的函数都会被设置url路径:
# 自定义的权限管理类
from myapp.permissions import IsAdminOrIsSelf
from rest_framework.decorators import detail_route
class UserViewSet(ModelViewSet):
...
@detail_route(methods=['post'], permission_classes=[IsAdminOrIsSelf])
def set_password(self, request, pk=None):
生成的路由地址为:
URL pattern: ^users/{pk}/set_password/$ Name: 'user-set-password'
视图集中包含附加action的
class BookInfoViewSet(mixins.ListModelMixin, mixins.RetrieveModelMixin, GenericViewSet):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
@action(methods=['get'], detail=False)
def latest(self, request):
...
@action(methods=['put'], detail=True)
def read(self, request, pk):
...
此视图集会形成的路由:
^books/latest/$ name: book-latest
^books/{pk}/read/$ name: book-read
二、响应器(一般不用配置)
# 1.局部配置
在视图类中配置:
renderer_classes=[JSONRenderer,BrowsableAPIRenderer]
# 2.全局配置
在setting中:
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES':['rest_framework.renderers.JSONRenderer']
}