一、自动生成路由
对于我们的视图类只要继承了ViewSetMixin及其子类 那么路由的写法就需要改变
path('books/', views.BookView.as_view({'get': 'list'}))
这个时候有人写了两个路由类 能够自动生成路由,这样我们就可以不用再自己写映射关系了
# 自动生成路由 from rest_framework.routers import SimpleRouter, DefaultRouter # 1.实例化路由对象 router = SimpleRouter() # 2.注册路由 router.register('books', views.BookView, 'books') urlpatterns = [] # 3.添加路由 urlpatterns += router.urls # 这个时候就会自动产生路由了 # DefaultRouter和SimpleRouter区别: DefaultRouter的用法和SimpleRouter的用法是一样的 就是DefaultRouter 会多出一个路径 就是根路径 # 添加路由还有一种添加方式 # 实例化路由对象 router = SimpleRouter() # 注册路由 router.register('books', views.BookView, 'books') urlpatterns = [ path('', include(router.urls)), # 添加路由 这样也是可以的 ]
1 总结
# 我们在写自动产生路由的时候 其实映射关系已经定死了 book/---》get ---》list book/---》post---》create book/1 ---》get---》retrieve book/1---》put----》update book/1---》delete---》destroy # 请求方式与类中的方法其实已经定好了 # 我们在写视图类的时候类中必须有一下方法 -list,create,retrieve,update,destroy方法之一 -就是五个试图扩展类之一+GenericAPIView 九个子类也可以,还有ModelViewSet
2 action装饰器的使用
# 现在我们自动生成路由的时候 想在视图类中写其他方法名字该怎么自动产生路由呢? class BookView(ModelViewSet): queryset = Book serializer_class = BookSerializer def login(self, request): pass # 该怎么让路由匹配成功之后 执行login方法呢? # 我们可以使用action装饰器 class BookView(ModelViewSet): queryset = Book serializer_class = BookSerializer @action(methods=['get'], detail=False, url_path='login', url_name='login') def login(self, request): pass # 这样写了之后 那么以后get请求都会执行该login方法
action参数解析
@action(methods=['get'], detail=False, url_path='login', url_name='login') def login(self, request): # methods 支持的请求方式,因为是列表,所以可以写多个 # detail 默认是False, 控制路由是生成 book/login 还是 book/pk/login False就生成book/login # url_path 控制book/后面的名字是什么 不写就是按照方法名 # url_name 起别名, 作用于反向解析
登入接口编写
# 我们先创建一个用户表先 class User(models.Model): username = models.CharField(max_length=32) password = models.CharField(max_length=32) # 我们现在要想一想如何判断用户是否登入了? ''' 按照之前我们可以有session表可以记录登入用户的随机字符串, 但是我们现在前后端分离了 前端可以是浏览器、小程序、手机页面那么这个时候session就不能帮我们存储了 所以我们需要也需要一个东西帮我们来验证用户是否登入 我们可以在用户登入的时候 返回一个随机字符串 然后之后用户再登入的时候只需要携带这个字符串即可判断用户是否登入 所以我们还需要创建一个存储随机字符串的表 然后与用户表做一对一关系 ''' # 随机字符串表 class UserToken(models.Model): user = models.OneToOneField(to='User', on_delete=models.CASCADE) token = models.CharField(max_length=32) # 其实这个存储随机字符串的字段也可以存储到用户表中 只不过这样分开扩展性
标签:models,认证,---,book,登入,login,路由,drf From: https://www.cnblogs.com/stephenwzh/p/16769179.html