Django - DRF - URL路由控制

目录

一、原始方式

二、ViewSetMixin - 重写as_view,拦截分发至指定方法

2-1 路由设计

2-2 视图函数

三、routers自动生成路由(不推荐使用)

3-2 路由设计


一、原始方式

from django.conf.urls import url
from app01 import views
urlpatterns = [
    url(r'^publish/$', views.PublishView.as_view()),
    url(r'^publish/(?P<pk>\d+)', views.PublishDetailView.as_view()),
]


'''
视图函数
'''

# -----------基于restful的增删改  --------------
class PublishView(APIView):
    def get(self, request):
        publish_list = models.Publish.objects.all()
        ser = MySerializer.PublishSerializers(publish_list, many=True)
        return JsonResponse(ser.data, safe=False)

    def post(self, request):
        ser = MySerializer.PublishSerializers(data=request.data)
        if ser.is_valid():
            ser.save()
            return JsonResponse(ser.data, safe=False)
        else:
            return JsonResponse(ser.errors, safe=False)


class PublishDetailView(APIView):
    def get(self, request, pk):
        publish_obj = models.Publish.objects.filter(pk=pk).first()
        ser = MySerializer.PublishSerializers(publish_obj, many=False)
        return JsonResponse(ser.data, safe=False)

    def put(self, request, pk):
        publish_obj = models.Publish.objects.filter(pk=pk).first()
        ser = MySerializer.PublishSerializers(data=request.data, instance=publish_obj)
        if ser.is_valid():
            ser.save()
            return JsonResponse(ser.data, safe=False)
        else:
            return JsonResponse(ser.errors, safe=False)

    def delete(self, request, pk):
        models.Publish.objects.filter(pk=pk).delete()
        return JsonResponse("delete", safe=False)

二、ViewSetMixin - 重写as_view,拦截分发至指定方法

2-1 路由设计

from django.conf.urls import url
from django.contrib import admin
from app01 import views
urlpatterns = [
    # 基于ViewSetMixin
    url(r'^publish/$', views.PublishView.as_view({'get': 'list', 'post': 'create'})),
    url(r'^publish/(?P<pk>\d+)', views.PublishView.as_view({'get': 'retrieve', 'put': 'update','delete':'destroy'})),

]
'''
PublishView类内包含list、create、retrieve、update、destory等方法

get请求-list方法,post请求-create方法
.PublishView.as_view({'get': 'list', 'post': 'create'})

get请求-retrieve方法,put请求-update方法,delete请求-destory方法
.PublishView.as_view({'get': 'retrieve', 'put': 'update','delete':'destroy'})
'''



from django.conf.urls import url,include
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^test1/$', views.TestAll.as_view({'get': 'test'})),
    url(r'^test2/$', views.TestAll.as_view({'get': 'test2'})),
    url(r'^test3/$', views.TestAll.as_view({'get': 'test3'})),

    url('', include(router.urls)),

]
'''
test1 - 触发test方法
test2 - 触发test2方法
test3 - 触发test3方法

'''

2-2 视图函数

'''
!!注意!!由于viewSetMixin重写了as_view方法和APIView内冲突,所以继承时必须前置
'''
class PublishView(ViewSetMixin,APIView):

    def list(self, request, *args, **kwargs):
        pass

    def create(self, request, *args, **kwargs):
        pass

    def retrieve(self, request, *args, **kwargs):
        pass

    def update(self, request, *args, **kwargs):
        pass

    def destroy(self, request, *args, **kwargs):
        pass

三、routers自动生成路由(不推荐使用)

3-2 路由设计

from django.conf.urls import url,include
from django.contrib import admin
from app01 import views


from rest_framework import routers
# 生成一个router对象
router=routers.DefaultRouter()
# 需要传两个参数,第一个参数就是匹配的路径,第二个参数,是视图类
# publish匹配PublishView视图函数
router.register('publish',views.PublishView)
# !!!注意!!!PublishView方法必须继承于ModelViewSet

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url('', include(router.urls)),


]

猜你喜欢

转载自blog.csdn.net/qq_33961117/article/details/85054945
今日推荐