Python-Django-REST-Framework-Restfull api
Python-Django-REST-Framework-Restfull api
http://www.ruanyifeng.com/blog/2011/09/restful.html
http://www.cnblogs.com/alex3714/articles/5420433.html
理解RESTful架构
越来越多的人开始意识到,网站即软件,而且是一种新型的软件。
这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency)、高并发等特点。
网站开发,完全可以采用软件开发的模式。但是传统上,软件和网络是两个不同的领域,很少有交集;软件开发主要针对单机环境,网络则主要研究系统之间的通信。互联网的兴起,使得这两个领域开始融合,现在我们必须考虑,如何开发在互联网环境中使用的软件。
RESTful架构,就是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
但是,到底什么是RESTful架构,并不是一个容易说清楚的问题。下面,我就谈谈我理解的RESTful架构。
https://www.cnblogs.com/luotianshuai/p/5438420.html
Restful API接口规范的设计与实现
理解RESTful架构 : http://www.ruanyifeng.com/blog/2011/09/restful
RESTful API 设计指南 : http://www.ruanyifeng.com/blog/2014/05/restful_api.html
了解Restful API设计规范后如果能使用起来是最好了,平时需要注意的是URL中不能有动词。
我们总结一下什么是RESTful架构:
- 每一个URI代表一种资源;
- 客户端和服务器之间,传递这种资源的某种表现层;
- 客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。
最常见的一种设计错误,就是URI包含动词。因为"资源"表示一种实体,所以应该是名词,URI不应该有动词,动词应该放在HTTP协议中。
举例来说,某个URI是/posts/show/1,其中show是动词,这个URI就设计错了,正确的写法应该是/posts/1,然后用GET方法表示show。
如果某些动作是HTTP动词表示不了的,你就应该把动作做成一种资源。比如网上汇款,从账户1向账户2汇款500元,错误的URI是:
POST /accounts/1/transfer/500/to/2
正确的写法是把动词transfer改成名词transaction,资源不能是动词,但是可以是一种服务:
POST /transaction HTTP/1.1
Host: 127.0.0.1
from=1&to=2&amount=500.00
另一个设计误区,就是在URI中加入版本号:
http://www.example.com/app/1.0/foo
http://www.example.com/app/1.1/foo
http://www.example.com/app/2.0/foo
因为不同的版本,可以理解成同一种资源的不同表现形式,所以应该采用同一个URI。版本号可以在HTTP请求头信息的Accept字段中进行区分(参见Versioning REST Services)http://www.informit.com/articles/article.aspx?p=1566460:
Django API框架
重中之重:接口设计好
- 可对内外灵活开放接口
- 接口定义要标准化
- 一定要提供排错依据
- 数据返回要标准
- 要能增删改查
- 所有异常要抓住为了排错
- 接口安全要注意
接口定义要标准化 (不能说随便起个名字 返回的数据的格式标准化)
在别人调用你接口的时候的,要提示它因为什么原因导致出错了,比如他提交的数据不合法/或者服务器问题,为什么要做这个:防止给自己找麻烦,因为别人在调用你端口的时候刚开始很容易出错)
理解API:
API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
简单理解API是我们提供的一个URL当用户按照指定的格式提交到URL中,我们在内部的views里执行操作,然后返回给用户状态or数据!
那么有没有现成的提供了以上“重中之重的API设计里提到的那些API设计原则呢”?
django-rest-framework 是一款比较不错的API模块,他为我们定义了很多功能和规范并且可以通过网页查看API
Some reasons you might want to use REST framework:
- The Web browsable API is a huge usability win for your developers.
- Authentication policies including packages for OAuth1a and OAuth2.
- Serialization that supports both ORM and non-ORM data sources.
- Customizable all the way down - just use regular function-based views if you don't need the more powerful features.
- Extensive documentation, and great community support.
- Used and trusted by large companies such as Mozilla and Eventbrite.
利用Django实现RESTful API
安装配置
pip install djangorestframework pip install markdown # Markdown support for the browsable API. pip install django-filter # Filtering support
1 settings.py module: #所有人都能访问,默认访问是只读 2 REST_FRAMEWORK = { 3 # Use Django's standard `django.contrib.auth` permissions, 4 # or allow read-only access for unauthenticated users. 5 'DEFAULT_PERMISSION_CLASSES': [ 6 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly' 7 ] 8 } 9 再到Django的 settings.py 中的INSTALLED_APPS添加 rest_framework,如下: 10 在根目录的 url.py 文件中为rest_framework框架的 login 和 logout 视图添加url: 11 INSTALLED_APPS = ( 12 ... 13 'rest_framework', 14 ) 15 在根目录的 url.py 文件中为rest_framework框架的 login 和 logout 视图添加url: 16 17 #------------------------------app01.rest_urls----------------------------------------------------------- 18 from django.conf.urls import url, include 19 from rest_framework import routers 20 from app01.rest_views import UserViewSet,GroupViewSet 21 22 router = routers.DefaultRouter() 23 router.register(r'users', UserViewSet) 24 router.register(r'groups',GroupViewSet) 25 26 # 使用自动化URL路由,转配我们的API. 27 # 如有额外需要, 我也为可视化API添加了登陆URLs. 28 urlpatterns = [ 29 url(r'^', include(router.urls)), 30 #url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), 31 ] 32 #------------------------------app01. rest_viewset----------------------------------------------------------- 33 from django.contrib.auth.models import User,Group 34 from rest_framework import viewsets 35 from app01.rest_serializers import UserSerializer, GroupSerializer 36 37 38 class UserViewSet(viewsets.ModelViewSet): 39 """ 40 API端:允许查看和编辑用户 41 """ 42 queryset = User.objects.all().order_by('-date_joined') 43 serializer_class = UserSerializer 44 45 46 class GroupViewSet(viewsets.ModelViewSet): 47 """ 48 API端:允许查看和编辑组 49 """ 50 queryset = Group.objects.all() 51 serializer_class = GroupSerializer 52 53 #------------------app01.rest_serializers----------------------- 54 from django.contrib.auth.models import User, Group 55 from rest_framework import serializers 56 57 58 class UserSerializer(serializers.HyperlinkedModelSerializer): 59 class Meta: 60 model = User 61 fields = ('id','url', 'username', 'email', 'groups') 62 63 64 class GroupSerializer(serializers.HyperlinkedModelSerializer): 65 class Meta: 66 model = Group 67 fields = ('url', 'name')
具体文件
测试
创建超级用户 python3 manage.py createsuperuser #admin/123456 同步一次数据库 python3 manage.py migrate
登陆admin后台
查看API接口平台
可以对接口增删改查
注API适用场景
在什么情况适用API呢?
外部和内部需要快速访问数据的时候适用,如果是自己的APP或者Project下不能适用,虽然可以使用但是相当于一个环了本来可以从自己内部快速取出来的(自己写的代码取)如果从APP取就慢很多了,相当于绕了一圈!
当然API也可以自己写不用他这个框架,但是提示的内容和标准自己在写API的时候需要注意!
API安全
那么问题来了API,上面写的API随便谁都可以调用API进行操作,肯定这个是不安全的!那怎么办呢?
方案如下:
原理:
原理:
1、客户端与服务器都存放着用于验证的Token字段,值字段无论通过什么方法外部的黑客都是无法获取的。
2、客户端吧本地的用户名+时间戳+Token的组合进行MD5加密生成一段新的md5-token
3、客户端访问的时候携带:用户名、时间戳、生成的一段新的md5-token
4、服务端收到请求后,先判断用户名、时间戳是否合法(时间戳和当前时间不能大于2分钟)
5、用户名和时间戳都合法了,在去Redis中判断是否有当前用户的key判断是否在这2分钟有访问过,我这里设置Redis2分钟过期,即合法用户第一次访问后,把他的用户名加入到Redis中作为key:MD5作为vlaue存储。如果存在说明是在2分钟内访问的。拒绝
6、以上都通过之后说明是合法用户和合法请求,然后在判断MD5值是否相等如果相同认证通过,执行相关Veiws然后并返回相关的状态或数据