Django REST framework 数据处理api

1、url分发

以防有其余业务线的须要,致使url杂乱,将每一个app用到的url都设置在本身的应用中。前端

# 项目下的url 
url(r"^api/(?P<version>\w+)/", include("api.urls")),
# 应用下的url
url(r"^login/$", account.LoginView.as_view()),
url(r"^courses/$", course.CourseViewSet.as_view({"get": "list"})),
url(r"^course/(?P<pk>\d+)/$", course.CourseViewSet.as_view({"get": "retrieve"})),

2、获取多条数据和详细数据

先来看一下示例用到的 model 表结构:vue

从上面的url可知道,这两条接口能够用同一个CBV处理数据:后端

①课程页面,应该包含多条数据(须要分页),因此是基于 Course 表作数据处理的;api

②课程详情页面,就应该基于 CourseDetail 表展开操做,前端要什么数据就返回什么数据,而不是返回全部数据。浏览器

那么让咱们看看用 rest_framework 的序列化作了什么:cookie

对于这条接口:app

http://127.0.0.1:8000/api/v1/courses/

须要获取的数据很简单,以下:测试

从model中知道,level 字段存储的是对应 level 的数字,但咱们不该该给前端返回一、而是返回对应的 level 文字,因此对于 level 字段采用了 get_level_display。url

对于这条接口:spa

http://127.0.0.1:8000/api/v1/course/1/

若是须要返回的数据不少,那么对应的逻辑也就相对复杂一点,具体以下:

那么让咱们看一下这条API返回的数据吧(测试数据提早录入好了~):

只要熟悉了这两条API数据处理方式,基本须要什么数据都能返回。

 3、登陆接口

登陆成功,给用户返回token。

在model中新增两张表:

这里登陆视图继承APIView实现,固然也能够选择其余的,逻辑以下:

4、须要身份认证的视图

前端逻辑:若是这个页面须要登陆才能访问,则跳转到登陆页面,登陆成功,则会获取到后端返回的token,好比vue中使用vue-cookies保存登陆成功的用户信息(包括token),而后再携带token访问这个页面的接口;

后端逻辑:给这个视图加上身份认证便可,这个认证就能够基于token来作。

给这个视图加上认证便可,哪一个视图须要认证就在哪里加,不建议全局配置。

若是在settings.py中配置了:

REST_FRAMEWORK = {
    "UNAUTHENTICATED_USER": None,   # 匿名用户,request.user = None
    "UNAUTHENTICATED_TOKEN": None,  # 匿名用户,request.auth = None
}

在视图中,对于没有登陆的用户(匿名用户),request.user 为 None,若是没设置,则显示 AnonymousUser,建议配置,简洁、更好区分。

综上,结合API要体现接口、体现版本,最好返回JSON格式数据,因此个人 REST_FRAMEWORK 暂时配置以下:

REST_FRAMEWORK = {
    "DEFAULT_RENDERER_CLASSES": [
        "rest_framework.renderers.JSONRenderer",
        # "rest_framework.renderers.BrowsableAPIRenderer",
    ],
    "DEFAULT_VERSIONING_CLASS": "rest_framework.versioning.URLPathVersioning",
    "VERSION_PARAM": "version",  # 参数
    "DEFAULT_VERSION": "v1",  # 默认的版本
    "ALLOWED_VERSIONS": ["v1", "v2"],  # 容许的版本
    "UNAUTHENTICATED_USER": None,
    "UNAUTHENTICATED_TOKEN": None,
}

在开发阶段 BrowsableAPIRenderer 渲染器可使返回的数据在浏览器以更清晰的形式展现,一下就能看出数据总体结构,加快开发速度。实际生产环境记得去掉。

相关文章
相关标签/搜索