Python路由Router
视图集极大地简化了我们写视图的代码,但是路由中还是有较多的重复代码,可供我们优化。回忆一下我们在视图集中写的URL路由代码:同一个视图类中,不同的视图方法加载多个不同的序列化器一般都是视图集在使用这个功能。urlpatterns〔path(serastudents,views。Student2ModelViewSet。asview({get:list,post:create})),repath(serastudents(?Ppkd)34;,views。Student2ModelViewSet。asview({get:retrieve,put:update,delete:destroy,})),〕
上面Student2ModelViewSet,我们没必要在路由中编写。对于已经继承了Viewset的视图集,我们工作中一般使用路由类自动生成路由信息即可。
对于视图集ViewSet,我们除了可以自己手动在路由url。py中设置当前客户端的http请求方式与动作action之间的对应关系外,在drf中还可以使用Routers路由类来自动帮我们快速生成视图集的路由列表。
RESTframework提供了两个router路由类,这两个路由类几乎没区别。后面我们讲下他们的小区分。SimpleRouterDefaultRouter使用方法
路由的使用分三个步骤:引入路由类并初始化创建router对象fromrestframework。routersimportDefaultRouter,SimpleRouterrouterSimpleRouter()
DefaultRouter会比SimpleRouter多出一个调试界面,列出当前子应用下所有的路由类的视图集接口地址。除此之外,大家用法一致。
2。注册视图集到路由类中,例如:router。register(routerstudents,views。Student2ModelViewSet,basenameserastudent)
register(prefix,viewset,basename)参数解释:prefix该视图集的访问地址路由前缀viewset视图集类,不要加asview!!!basename路由别名的前缀,一般把URL地址前缀复制过来,然后遇到斜杠改成横杠如上述代码会形成的路由如下:studentsrouterstudents〔namestudentslist〕studentsrouterstudents(?Ppk〔。〕)〔namestudentsdetail〕
3。把路由类生成的路由信息合并到路由列表urlpatterns中。因为django只认定urlpatterns这个变量名:
有两种方式:urlpatterns〔。。。〕urlpatternsrouter。urls
使用路由类给视图集生成路由地址,视图集代码无需改动,保持原样即可:fromrestframework。viewsetsimportModelViewSet,ReadOnlyModelViewSetclassStudentModelViewSet(ModelViewSet):querysetStudent。objects。all()serializerclassStudentModelSerializerdeflogin(self,request):学生登录功能print(self。action)returnResponse({message:登录成功})
路由代码:fromdjango。urlsimportpath,repathfrom。importviewsurlpatterns〔。。。〕使用drf提供路由类router给视图集生成路由列表实例化路由类drf提供一共提供了两个路由类给我们使用,他们用法一致,功能几乎一样在这个例子中,浏览器访问127。0。0。1:8000students时,SimpleRouter会出现报错大黄页,DefaultRouter会出现调试页面fromrestframework。routersimportDefaultRouterrouterDefaultRouter()注册视图集router。register(路由前缀,视图集类,别名前缀)router。register(routerstudents,views。Student2ModelViewSet,basenameserastudent)把生成的路由列表追加到urlpatternsurlpatternsrouter。urls
面的代码就成功生成了路由地址(增删改查一条查多条的功能),但是不会自动我们在视图集自定义方法的路由。
如果我们需要给自定义方法生成路由,则需要进行action动作的声明,比如〔通过action装饰器声明视图集中新定义类方法〕(drfviewset。md通过action装饰器声明视图集中新定义类方法)。