热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用Django与Piston构建RESTfulWebService及Django

转自:http:www.360doc.comcontent130226179342056_268046626.shtmlDjango一款是Python的强大web开

转自:http://www.360doc.com/content/13/0226/17/9342056_268046626.shtml

Django一款是Python的强大web开发框架, 由于它是url配置式的框架, 感觉上用它做RESTful的webservice应该是得心应手的。

果然我在探寻之下, 发现一款优秀的基于Django的轻量级RESTful api搭建框架: Piston。官方网址:https://bitbucket.org/jespern/django-piston/

基本上这货有这些主要功能:

  • 直接链接Django内部auth机制(BasicAuth)
  • 内置OAuth认证的实现,能快速使用
  • 可绑定Model也可直接使用任意资源(任意Object)
  • 支持JSON,YAML,Python Pickle, XML等各种数据格式,还可以自己扩展
  • 提供Form验证和请求限制等实现

工作之余,写几篇文章介绍下这个东西之

Piston的RESTful实现

REST是Representational State Transfer (表述性状态转移)的缩写, 是一种轻量级的WebService架构比SOAP和XML-RPC简洁多了. REST架构遵循了CRUD原则, 即对于资源使用的四种行为: Create(创建), Read(读取), Update(更新),  Delete(删除).

在Piston中, 我们需要写的就是对于资源(封装为piston.resource.Resouce, 在url配置中会使用)的操作类,即 Handler 类(全都继承与piston.handler.BaseHandler). 举个简单的例子好了

先在工程目录里加个api模块, 然后用这个结构就可以了

api/
__init__.py
urls.py
handlers.py

在handlers.py里简单写个Handler类来说明下Piston的结构:

class EntryHandler(BaseHandler):
model = TestModel
allowed_methods = ('GET', 'POST', 'PUT', 'DELETE')
fields = ('title', 'content', ('author', ('username', 'first_name')),'author_count')
exclude = ('id', re.compile('^private_'))
def create(self, request):
...
def read(self, request, pk=None):
...
def update(self, request, pk):
...
def delete(self, request, pk):
...
@classmethod
def author_count(cls, m):
...

我们可以看到CRUD中的四个方法灰常直接了当得呈现出来了, REST的四个方法分别对应于:

  • 当收到GET请求时, 调用read方法, 读取并返回资源,不做修改
  • 当收到POST请求时, 调用create方法, 创建新的资源, 并返回(或返回内建的rc.CREATED)
  • 当收到PUT请求时, 调用update方法, 更新现有资源, 并返回(或返回内建的rc.ALL_OK)
  • 当收到DELETE请求时,调用delete方法, 删除现有资源, 只返回rc.DELETED

写了几个Handler类之后, 简单得小结一下几点:

  • 属性model不是必须的, 但是如果设了model后,该Handler将自动和Django的模型绑定
  • 如果settings中不设置PISTON_IGNORE_DUPE_MODELS为True,则一个model只能绑定一个BaseHandler和一个AnonymousBaseHandler, 不能同时绑定两个及以上BaseHandler
  • 当model绑定后, BaseHandler中就实现了对该模型默认的以上4种操作. 不进行重写方法的话,这四种操作都能正常进行(前提是request中传来的必须是正确的Model序列化后的数据,否则将报错)
  • 重写CRUD方法可以实现各种自定义操作, 如果不绑定Model, 那必须重写CRUD, 因为BaseHandler中的CRUD方法都是基于绑定模型的
  • Handler是可以添加任意自定义函数的, 但是自定义函数必须加上@classmethod 装饰器, 因为自定义函数唯一的用途就是在field中使用(下面会介绍), 它能获得的只有两个参数,一个是Handler的类, 另一个Model的对象
  • 我们可以在属性allowed_method中设置, 该handler类可以接受哪些请求
  • exclude属性: 可以剔除返回的数据中, Model里的哪些Field是不需要的, 可以使用正则表达式来剔除
  • field属性: 这个和exclude相反, 似乎优先级更高, 而且它还可以内联, 和使用自定义函数
    • 内联可以联的是外键或者多对多关系
    • 内联的方法是在field里加入一个Tuple, 如(‘author’, (‘username’, ‘first_name’))
      其中author是外键或多对多关系的引用名,后面则是author中显示的内容
    • 内联的层级是可以N层的
    • field中可以使用自定函数的结果, 即Handler中自定义的函数

具体详细例子, 可以看Piston中的Test=-=

Piston的url配置和使用

上一节是说怎么写一个Handler类, 这里就是使用这个Handler类。 用过Django都知道url配置的重要=-=

Piston的url配制方法其实很简单,只要将Handler封装一下,然后加上认证的部分就可以了。简单的urls.py配置的例子:

_auth = HttpBasicAuthentication(realm='Test')
_AUTHENTICATORS = [_auth,]
_entries = Resource(handler=EntryHandler, authentication=_AUTHENTICATORS)
urlpatterns = patterns('',
url(r'^entries/$', _entries),
)

首先是要有个认证, 这边使用了Piston的HttpBasicAuthentication, 其实这个BasicAuth的账户验证是直接使用了Django自带的auth系统, 认证字符串则是自己的. 这个认证就是将认证字符串写在请求Meta中的HTTP_AUTHORIZATION字段上. 字符的格式是:

'Basic %s' % base64.encodestring('admin:admin').rstrip()

Basic+空格+base64后的”用户名:密码” ,如果格式不同就会认证不通过.认证时其实就是decode出用户名密码后调用Django的auth系统进行验证. 当然这个 Authentication是可以自定义的,可以参考HttpBasicAuthentication改写成任意的认证形式.

同时Piston是支持多认证机制的 只要在_AUTHENTIATORS数组中添加任意个Authenticator就可以实现多种认证机制同时存在

在认证器配置好后,只要用Resource类封装一下Handler和authentiators就可以了. 还有一点就是如果不需要认证的话, 不用添加Authenticator, 只要设置Handler即可. 是否需要认证和Handler是否继承与AnonymousBaseHandler无关, 它只是提供绑定Model的选择.

当请求通过认证后, 就去根据请求类型去到Handler类中的CRUD方法, 这是只要访问request.user即可获得认证后的user信息

url配置也很常规,不多阐述了. 回头说Emitter的时候再具体说一下url配置中的细节.

下一章, 我会说说怎么使用Piston来搭建OAuth认证机制, 还有就是Piston API的传输数据格式(关于Emitter)的问题 ~.~


http://baike.baidu.com/view/962167.htm



推荐阅读
  • Django + Ansible 主机管理(有源码)
    本文给大家介绍如何利用DjangoAnsible进行Web项目管理。Django介绍一个可以使Web开发工作愉快并且高效的Web开发框架,能够以最小的代价构建和维护高 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • SOA架构理解理解SOA架构,了解ESB概念,明白SOA与微服务的区别和联系,了解SOA与热门技术的结合与应用。1、面向服务的架构SOASOA(ServiceOrien ... [详细]
  • RMarkdown是一种用于在R中生成可重复生成的报告的开源工具。它可以帮助您将所有代码,结果和编写都放在一个地方,并以有吸引力且易于消化的方式格式化所 ... [详细]
  • Django3 使用 WebSocket 实现 WebShell
    △点击上方“Python猫”关注,回复“1”领取电子书剧照:《眷思量》作者:从零开始的程序员生活来源:https:www.c ... [详细]
  • Django框架详解:了解Django的含义和作用
    Django是一个开放源代码的Web应用框架,由Python写成。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的;Django主要由模型,模板,视图,UR ... [详细]
  • 本文为转载,原连接:https:www.zhihu.comquestion40822826简单说一下吧做要解释这些要从netconf说起。netconf ... [详细]
  • 阿里首席架构师科普RPC框架
    RPC概念及分类RPC全称为RemoteProcedureCall,翻译过来为“远程过程调用”。目前,主流的平台中都支持各种远程调用技术,以满足分布式系统架构中不同的系统之间的远程 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
author-avatar
mobiledu2502855907
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有