您的位置:首页 > 编程语言 > Go语言

利用 Django REST framework 编写 RESTful API

2019-09-12 16:50 218 查看
原文链接:http://www.cnblogs.com/wangyuxing/p/11512749.html

 

  • 自动生成符合 RESTful 规范的 API 支持 OPTION、HEAD、POST、GET、PATCH、PUT、DELETE
  • 根据 
    Content-Type
     来动态的返回数据类型(如 text、json)
  • 生成 browserable 的交互页面(自动为 API 生成非常友好的浏览器页面)
  • 非常细粒度的权限管理(可以细粒度到 field 级别)
  • 示意图

    安装

    $ pip install djangorestframework
    $ pip install markdown

    概述

    Django Rest framework 的流程大概是这样的

    1. 建立 Models
    2. 依靠 Serialiers 将数据库取出的数据 Parse 为 API 的数据(可用于返回给客户端,也可用于浏览器显示)
    3. ViewSet 是一个 views 的集合,根据客户端的请求(GET、POST等),返回 Serialiers 处理的数据
        权限 Premissions 也在这一步做处理
    4. ViewSet 可在 Routers 进行注册,注册后会显示在 Api Root 页上
    5. 在 urls 里注册 ViewSet 生成的 view,指定监听的 url

    希望全面细致了解的人请移步去看官方文档,我这里就不一步步的细说了,而是分块来进行介绍

    准备工作 & Models

    让我们来写个小项目练练手

    1. 先用 
      manage.py startproject rest
       来生成一个项目
    2. 再用 
      manage.py createsuperuser
       创建用户(后面权限管理会用到)
    3. 初始化数据库 
      manage.py migrate

    然后当然是编写 models,为了展示 rest_framework 的强大之处,我给 models 定义了一个自定义的 field

    # myproject/myapp/models.py
    
    #! /usr/bin/env python
    # -*- coding: utf-8
    from __future__ import unicode_literals, absolute_import
    import cPickle as pickle
    
    from django.db import models
    from django.contrib.auth.models import User
    
    class SerializedField(models.TextField):
    
    """序列化域
    用 pickle 来实现存储 Python 对象
    """
    __metaclass__ = models.SubfieldBase  # 必须指定该 metaclass 才能使用 to_python
    
    def validate(self, val):
    raise isinstance(val, basestring)
    
    def to_python(self, val):
    """从数据库中取出字符串,解析为 python 对象"""
    if val and isinstance(val, unicode):
    return pickle.loads(val.encode('utf-8'))
    
    return val
    
    def get_prep_value(self, val):
    """将 python object 存入数据库"""
    return pickle.dumps(val)
    
    class MyModel(models.Model):
    
    created_at = models.DateTimeField(auto_now_add=True)
    # 注意这里建立了一个外键
    owner = models.ForeignKey(User, related_name='mymodels')
    field = models.CharField(max_length=100)
    options = SerializedField(max_length

    转载于:https://www.cnblogs.com/wangyuxing/p/11512749.html

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: