Python路由Router
视图集极大地简化了我们写视图的代码,但是路由中还是有较多的重复代码,可供我们优化。回忆一下我们在视图集中写的 URL 路由代码: # 同一个视图类中,不同的视图方法加载多个不同的序列化器一般都是视图集在使用这个功能。 urlpatterns = [ path("sera/students/", views.Student2ModelViewSet.as_view({ "get": "list", "post": "create" })), re_path("^sera/students/(?Pd+)/#34;, views.Student2ModelViewSet.as_view({ "get": "retrieve", "put": "update", "delete": "destroy", })), ]
上面 Student2ModelViewSet,我们没必要在路由中编写。对于已经继承了 Viewset 的视图集,我们工作中一般使用路由类自动生成路由信息即可。
对于视图集 ViewSet,我们除了可以自己手动在路由 url.py 中设置当前客户端的 http 请求方式与动作 action 之间的对应关系外,在 drf 中还可以使用 Routers 路由类来自动帮我们快速生成视图集的路由列表。
REST framework 提供了两个 router 路由类,这两个路由类几乎没区别。后面我们讲下他们的小区分。 SimpleRouter DefaultRouter 使用方法
路由的使用分三个步骤: 引入路由类并初始化创建 router 对象 from rest_framework.routers import DefaultRouter, SimpleRouter router = SimpleRouter()
DefaultRouter 会比 SimpleRouter 多出一个调试界面,列出当前子应用下所有的路由类的视图集接口地址。除此之外,大家用法一致。
2.注册视图集到路由类中,例如: router.register("router/students", views.Student2ModelViewSet, basename="sera-student")
register(prefix, viewset, base_name) 参数解释: prefix 该视图集的访问地址路由前缀 viewset 视图集类,不要加 as_view!!! basename 路由别名的前缀,一般把 URL 地址前缀复制过来,然后遇到斜杠 / 改成横杠 - 如上述代码会形成的路由如下: students/ ^router/students/$ [name="students-list"] students/ ^router/students/(?P[^/.]+)/$ [name="students-detail"]
3.把路由类生成的路由信息合并到路由列表 urlpatterns 中。因为 django 只认定 urlpatterns 这个变量名:
有两种方式: urlpatterns = [ ... ] urlpatterns += router.urls
使用路由类给视图集生成路由地址,视图集代码无需改动,保持原样即可: from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet class StudentModelViewSet(ModelViewSet): queryset = Student.objects.all() serializer_class = StudentModelSerializer def login(self,request): """学生登录功能""" print(self.action) return Response({"message":"登录成功"})
路由代码: from django.urls import path, re_path from . import views urlpatterns = [ ... ] """使用drf提供路由类router给视图集生成路由列表""" # 实例化路由类 # drf提供一共提供了两个路由类给我们使用,他们用法一致,功能几乎一样 # 在这个例子中,浏览器访问127.0.0.1:8000/students时, # SimpleRouter会出现报错大黄页,DefaultRouter会出现调试页面 from rest_framework.routers import DefaultRouter router = DefaultRouter() # 注册视图集 # router.register("路由前缀",视图集类,别名前缀) router.register("router/students", views.Student2ModelViewSet,basename="sera-student") # 把生成的路由列表追加到urlpatterns urlpatterns += router.urls
面的代码就成功生成了路由地址(增 / 删 / 改 / 查一条 / 查多条的功能),但是不会自动我们在视图集自定义方法的路由。
如果我们需要给自定义方法生成路由,则需要进行 action 动作的声明,比如 [通过 action 装饰器声明视图集中新定义类方法](drf-view-set.md# 通过 action 装饰器声明视图集中新定义类方法)。
它被称为仙人余粮,上养肺中养脾下养肾,这样搭配效果好说起黄精,或许很多人都不认识,要知道黄精在古代备受推崇,那时候认为黄精属于芝草类,尽的土之精华灵气,有轻身驻颜的功效,又被称为仙人余粮。而神仙芝草经更是指出黄精有宽中益气,使五脏调
它被称为仙人余粮,上养肺中养脾下养肾,这样搭配效果好说起黄精,或许很多人都不认识,要知道黄精在古代备受推崇,那时候认为黄精属于芝草类,尽的土之精华灵气,有轻身驻颜的功效,又被称为仙人余粮。而神仙芝草经更是指出黄精有宽中益气,使五脏调
如果宝宝情绪失控怎么办?教你几个技巧,父母的教育会更有效前天,我在超市门口看到惊喜的一幕一个3岁的小男孩一边哭一边闹,想要超市里玩具柜上的汽车玩具,可是妈妈说家里的玩具都堆成山了!,妈妈就是不同意给他买,小男孩就立马躺在地上打滚,不肯起
如果宝宝情绪失控怎么办?教你几个技巧,父母的教育会更有效前天,我在超市门口看到惊喜的一幕一个3岁的小男孩一边哭一边闹,想要超市里玩具柜上的汽车玩具,可是妈妈说家里的玩具都堆成山了!,妈妈就是不同意给他买,小男孩就立马躺在地上打滚,不肯起
婴儿奶粉出事了!康康姐有话说,说的是最近发生的市场监管新鲜事,这个星期有个新闻,让康康姐挺生气的。倍恩喜公司销售的1段婴儿配方羊奶粉中发现香兰素,被处以罚没款合计699。51万元。这还不是个例,上
哈佛研究从小做家务和不做的孩子,长大后3个差距明显你家孩子在家会不会做家务呢?我曾经认为,孩子做不做家务是无所谓的事情,只要学习成绩好就可以了。可能很多人跟我有类似的想法。可是,随着孩子慢慢长大,我觉得孩子会不会能不能做家务是一件
婴儿奶粉出事了!康康姐有话说,说的是最近发生的市场监管新鲜事,这个星期有个新闻,让康康姐挺生气的。倍恩喜公司销售的1段婴儿配方羊奶粉中发现香兰素,被处以罚没款合计699。51万元。这还不是个例,上
哈佛研究从小做家务和不做的孩子,长大后3个差距明显你家孩子在家会不会做家务呢?我曾经认为,孩子做不做家务是无所谓的事情,只要学习成绩好就可以了。可能很多人跟我有类似的想法。可是,随着孩子慢慢长大,我觉得孩子会不会能不能做家务是一件
儿子都像妈,男孩容易遗传妈妈的三个特征,你家是不是也这样每个家庭中有新生命的降临都会是一件值得开心的事情,亲人之间的话题也都会集中在这个新生儿身上,大家就会去讨论新生儿的外表以及他的气质,并且还会讨论新生儿是像母亲多一些还是像父亲多一些
儿子都像妈,男孩容易遗传妈妈的三个特征,你家是不是也这样每个家庭中有新生命的降临都会是一件值得开心的事情,亲人之间的话题也都会集中在这个新生儿身上,大家就会去讨论新生儿的外表以及他的气质,并且还会讨论新生儿是像母亲多一些还是像父亲多一些
2022年,中国的产房静悄悄2021年,1062万个婴儿在中国降生,比以饥荒载入史册的1960年还少了340万个,这是新中国成立以来出生人数最少的一年2021年是新中国成立以来,新生婴儿数量最少的一年,但很可