利用Django实现RESTful API

简介:

利用Django实现RESTful API

  RESTful API现在很流行,这里是它的介绍 理解RESTful架构和 RESTful API设计指南.按照Django的常规方法当然也可以实现REST,但有一种更快捷、强大的方法,那就是 Django REST framework.它是python的一个模块,通过在Django里面配置就可以把app的models中的各个表实现RESTful API。下面是实现方法:

一、安装配置

pip install djangorestframework
pip install markdown       # Markdown support for the browsable API.pip install django-filter  # Filtering support

再到Django的 settings.py 中的INSTALLED_APPS添加 rest_framework,如下:

1
2
3
4
INSTALLED_APPS  =  (
     ...
     'rest_framework' ,
)

 在根目录的 url.py 文件中为rest_framework框架的 login 和 logout 视图添加url:

1
2
3
4
urlpatterns  =  [
     ...
     url(r '^api-auth/' , include( 'rest_framework.urls' , namespace = 'rest_framework' ))
]

 

二、创建model和Serializer

创建app,名为 snippets.。在视图 models.py 中添加一张表如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from  django.db  import  modelsfrom pygments.lexers  import  get_all_lexers          # 一个实现代码高亮的模块 
from  pygments.styles  import  get_all_styles
LEXERS  =  [item  for  item  in  get_all_lexers()  if  item[ 1 ]]
LANGUAGE_CHOICES  =  sorted ([(item[ 1 ][ 0 ], item[ 0 ])  for  item  in  LEXERS])  # 得到所有编程语言的选项
STYLE_CHOICES  =  sorted ((item, item)  for  item  in  get_all_styles())      # 列出所有配色风格
class  Snippet(models.Model):
     created  =  models.DateTimeField(auto_now_add = True )
     title  =  models.CharField(max_length = 100 , blank = True , default = '')
     code  =  models.TextField()
     linenos  =  models.BooleanField(default = False )
     language  =  models.CharField(choices = LANGUAGE_CHOICES, default = 'python' , max_length = 100 )
     style  =  models.CharField(choices = STYLE_CHOICES, default = 'friendly' , max_length = 100 )    
     class  Meta:
         ordering  =  ( 'created' ,)


然后开始同步到数据库中:

1
2
. / manage.py makemigrations snippets
. / manage.py migrate

接下来需要做的就是创建 Serializer 类,类似于 Form。它的作用就是从你传入的参数中提取出你需要的数据,并把它转化为 json 格式(注意,已经是字节码了),同时支持反序列化到model对象。在 snippets 文件夹中添加 serializers.py 并在其添加如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
from  rest_framework  import  serializersfrom snippets.models  import  Snippet, LANGUAGE_CHOICES, STYLE_CHOICES
class  SnippetSerializer(serializers.Serializer):                 # 它序列化的方式很类似于Django的forms
     id  =  serializers.IntegerField(read_only = True )
     title  =  serializers.CharField(required = False , allow_blank = True , max_length = 100 )
     code  =  serializers.CharField(style = { 'base_template' 'textarea.html' })      
     # style的设置等同于Django的      
     widget = widgets.Textarea
     linenos  =  serializers.BooleanField(required = False )                          
     # 用于对浏览器的上的显示
     language  =  serializers.ChoiceField(choices = LANGUAGE_CHOICES, default = 'python' )
     style  =  serializers.ChoiceField(choices = STYLE_CHOICES, default = 'friendly' )    
     def  create( self , validated_data):        
         """
         Create and return a new `Snippet` instance, given the validated data.        
         """
         return  Snippet.objects.create( * * validated_data)     def  update( self , instance, validated_data):        
         """
         Update and return an existing `Snippet` instance, given the validated data.        
         """
         instance.title  =  validated_data.get( 'title' , instance.title)
         instance.code  =  validated_data.get( 'code' , instance.code)
         instance.linenos  =  validated_data.get( 'linenos' , instance.linenos)
         instance.language  =  validated_data.get( 'language' , instance.language)
         instance.style  =  validated_data.get( 'style' , instance.style)
         instance.save()        
         return  instance

 

三、使用Serializer

先使用 ./manage.py shell 进入Django的shell中。操作如下:

可以看到 Serializer 的使用如同 Django 的 forms.它的反序列化如下:

1
2
3
from  django.utils.six  import  BytesIO
stream  =  BytesIO(content)
data  =  JSONParser().parse(stream)

这是再把得到的数据转化为实例:

1
2
3
4
5
6
serializer  =  SnippetSerializer(data = data)
serializer.is_valid()    
# 开始验证
# Trueserializer.validated_data
# OrderedDict([('title', ''), ('code', 'print "hello, world"\n'), ('linenos', False), ('language', 'python'), ('style', 'friendly')])serializer.save()
# <Snippet: Snippet object>

同时,我们还可以对 querysets 进行序列化,只需简单地在设置参数 many=True,如下:

1
2
3
serializer  =  SnippetSerializer(Snippet.objects. all (), many = True )
serializer.data
# [OrderedDict([('id', 1), ('title', u''), ('code', u'foo = "bar"\n'), ('linenos', False), ('language', 'python'), ('style', 'friendly')]), OrderedDict([('id', 2), ('title', u''), ('code', u'print "hello, world"\n'), ('linenos', False), ('language', 'python'), ('style', 'friendly')]), OrderedDict([('id', 3), ('title', u''), ('code', u'print "hello, world"'), ('linenos', False), ('language', 'python'), ('style', 'friendly')])

 

四、使用 ModelSerializer

ModelSerializer类似于Django的 modelform, 可以直接关联到models中的表。如下:

1
2
3
4
class  SnippetSerializer(serializers.ModelSerializer):    
     class  Meta:
         model  =  Snippet
         fields  =  ( 'id' 'title' 'code' 'linenos' 'language' 'style' )

 

五、在Django的视图中使用Serializer

首先,可以像常规Django视图的写法一样写,返回序列化的输出数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from  django.http  import  HttpResponse, JsonResponse
from  django.views.decorators.csrf  import  csrf_exempt
from  rest_framework.renderers  import  JSONRenderer
from  rest_framework.parsers  import  JSONParser
from  snippets.models  import  Snippet
from  snippets.serializers  import  SnippetSerializer
 
 
@csrf_exemptdef  snippet_list(request):    
     """
     List all code snippets, or create a new snippet.    
     """
     if  request.method  = =  'GET' :
         snippets  =  Snippet.objects. all ()
         serializer  =  SnippetSerializer(snippets, many = True )        
         return  JsonResponse(serializer.data, safe = False )    
     elif  request.method  = =  'POST' :
         data  =  JSONParser().parse(request)
         serializer  =  SnippetSerializer(data = data)        
         if  serializer.is_valid():                 
             serializer.save()            
             return  JsonResponse(serializer.data, status = 201 )        
         return  JsonResponse(serializer.errors, status = 400 )

也可以写一个视图对应其models中的表,实现对它的删、改、查。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@csrf_exemptdef  snippet_detail(request, pk):    
     """
     Retrieve, update or delete a code snippet.    
     """
     try :
         snippet  =  Snippet.objects.get(pk = pk)    
     except  Snippet.DoesNotExist:        
         return  HttpResponse(status = 404 )    
         if  request.method  = =  'GET' :
             serializer  =  SnippetSerializer(snippet)        
             return  JsonResponse(serializer.data)    
         elif  request.method  = =  'PUT' :
             data  =  JSONParser().parse(request)
             serializer  =  SnippetSerializer(snippet, data = data)        
             if  serializer.is_valid():
                 serializer.save()            
                 return  JsonResponse(serializer.data)        
             return  JsonResponse(serializer.errors, status = 400 )    
         elif  request.method  = =  'DELETE' :
             snippet.delete()        
             return  HttpResponse(status = 204 )

添加对应的url, snippets/urls.py 中设置如下:

1
2
3
4
5
6
from  django.conf.urls  import  urlfrom snippets  import  views
 
urlpatterns  =  [
     url(r '^snippets/$' , views.snippet_list),
     url(r '^snippets/(?P<pk>[0-9]+)/$' , views.snippet_detail),
]

最后还要在根目录的 url.py 中添加对应的映射。

1
2
3
4
urlpatterns  =  [  
  ...
     url(r '^' , include( 'snippets.urls' )),
]

这时,所有的配置已经完成了。接下来就是测试我们的API

六、测试API

为了方便我们可以使用 httpie 模块来测试,启动Django,再在客户端输入 http://127.0.0.1:8000/snippets/,操作如下:

 还可以进行 put 操作,修改对应的内容



 本文转自 sjfbjs 51CTO博客,原文链接:http://blog.51cto.com/11886896/2064575

相关文章
|
25天前
|
API 数据库 数据安全/隐私保护
利用Django框架构建高效后端API服务
本文将介绍如何利用Django框架构建高效的后端API服务。通过深入分析Django框架的特性和优势,结合实际案例,探讨了如何利用Django提供的强大功能来构建高性能、可扩展的后端服务。同时,还对Django框架在后端开发中的一些常见问题进行了解决方案的探讨,并提出了一些建设性的建议。
40 3
|
4天前
|
安全 Java API
RESTful API设计与实现:Java后台开发指南
【4月更文挑战第15天】本文介绍了如何使用Java开发RESTful API,重点是Spring Boot框架和Spring MVC。遵循无状态、统一接口、资源标识和JSON数据格式的设计原则,通过创建控制器处理HTTP请求,如示例中的用户管理操作。此外,文章还提及数据绑定、验证、异常处理和跨域支持。最后,提出了版本控制、安全性、文档测试以及限流和缓存的最佳实践,以确保API的稳定、安全和高效。
|
7天前
|
小程序 前端开发 API
小程序全栈开发中的RESTful API设计
【4月更文挑战第12天】本文探讨了小程序全栈开发中的RESTful API设计,旨在帮助开发者理解和掌握相关技术。RESTful API基于REST架构风格,利用HTTP协议进行数据交互,遵循URI、客户端-服务器架构、无状态通信、标准HTTP方法和资源表述等原则。在小程序开发中,通过资源建模、设计API接口、定义资源表述及实现接口,实现前后端高效分离,提升开发效率和代码质量。小程序前端利用微信API与后端交互,确保数据流通。掌握这些实践将优化小程序全栈开发。
|
16天前
|
前端开发 Java API
构建RESTful API:Java中的RESTful服务开发
【4月更文挑战第3天】本文介绍了在Java环境中构建RESTful API的重要性及方法。遵循REST原则,利用HTTP方法处理资源,实现CRUD操作。在Java中,常用框架如Spring MVC简化了RESTful服务开发,包括定义资源、设计表示层、实现CRUD、考虑安全性、文档和测试。通过Spring MVC示例展示了创建RESTful服务的步骤,强调了其在现代Web服务开发中的关键角色,有助于提升互操作性和用户体验。
构建RESTful API:Java中的RESTful服务开发
|
20天前
|
XML JSON 安全
谈谈你对RESTful API设计的理解和实践。
RESTful API是基于HTTP协议的接口设计,通过URI标识资源,利用GET、POST、PUT、DELETE等方法操作资源。设计注重无状态、一致性、分层、错误处理、版本控制、文档、安全和测试,确保易用、可扩展和安全。例如,`/users/{id}`用于用户管理,使用JSON或XML交换数据,提升系统互操作性和可维护性。
14 4
|
22天前
|
安全 API 开发者
构建高效可扩展的RESTful API服务
在数字化转型的浪潮中,构建一个高效、可扩展且易于维护的后端API服务是企业竞争力的关键。本文将深入探讨如何利用现代后端技术栈实现RESTful API服务的优化,包括代码结构设计、性能调优、安全性强化以及微服务架构的应用。我们将通过实践案例分析,揭示后端开发的最佳实践,帮助开发者提升系统的响应速度和处理能力,同时确保服务的高可用性和安全。
25 3
|
29天前
|
缓存 前端开发 API
构建高效可扩展的RESTful API:后端开发的最佳实践
【2月更文挑战第30天】 在现代Web应用和服务端架构中,RESTful API已成为连接前端与后端、实现服务间通信的重要接口。本文将探讨构建一个高效且可扩展的RESTful API的关键步骤和最佳实践,包括设计原则、性能优化、安全性考虑以及错误处理机制。通过这些实践,开发者可以确保API的健壮性、易用性和未来的可维护性。
|
30天前
|
API 开发者 UED
深入探讨RESTful API设计原则及最佳实践
在当今互联网时代,RESTful API已成为各种软件系统之间进行通信的重要方式。本文将从资源定义、URI设计、HTTP方法选择、状态码规范等方面深入探讨RESTful API设计的原则与最佳实践,帮助开发者更好地构建高效、健壮的API。
|
JSON API PHP
CI中如何保护RESTful API
步骤5 保护RESTful API   为了保护RESTful API,可以在application/config/rest.php中设置安全保护级别,如下所示: $config['rest_auth'] = 'basic';    其中保护级别有如下设置:   None:任何人都...
904 0
|
10天前
|
缓存 前端开发 API
API接口封装系列
API(Application Programming Interface)接口封装是将系统内部的功能封装成可复用的程序接口并向外部提供,以便其他系统调用和使用这些功能,通过这种方式实现系统之间的通信和协作。下面将介绍API接口封装的一些关键步骤和注意事项。

热门文章

最新文章