url controller and responder

url controller and responder

A custom route (original method)

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("")

Second, the view class inheritance (ViewSetMixin)

ModelViewSet(....,GenericViewSet)>GenericViewSet(ViewSetMixin, generics.GenericAPIView)

ViewSetMixin rewrite as_view in the class must pass actions

It must route incoming requests manner as in the method of the view mapping is performed as follows:

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'})),
]

Third, the automatic generation of the route

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)

  • The prefixes prefix viewset

  • viewset set of views

  • Base_name routing prefix name

SimpleRouter

router = routers.SimpleRouter() # 生成两条路由

^books/$    name: book-list

^books/{pk}/$   name: book-detail

DefaultRouter and SimpleRouter difference is, DefaultRouter will be more comes with a default root view of the API returns data in response to a hyperlink that contains a list of all views.

Additional links and behavior

Any @detail_route decorative function or @list_route url path will be provided:

# 自定义的权限管理类
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):

Routing address generated for:

URL pattern: ^users/{pk}/set_password/$ Name: 'user-set-password'

View of the action set contains additional

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):
    ...

This view of the assembly formed by the route:

^books/latest/$    name: book-latest
^books/{pk}/read/$  name: book-read

Second, the responder (typically no configuration)

# 1.局部配置
 在视图类中配置:
    renderer_classes=[JSONRenderer,BrowsableAPIRenderer]
    
# 2.全局配置
 在setting中:
    REST_FRAMEWORK = {
        'DEFAULT_RENDERER_CLASSES':['rest_framework.renderers.JSONRenderer']
    }

Guess you like

Origin www.cnblogs.com/9527mwz/p/11200595.html
URL
URL
URL
URL