6.30-7.2 LL--实习日志--Restful API 调用和编写
来源:互联网 发布:js时间相减 编辑:程序博客网 时间:2024/05/16 23:51
1.这里写链接内容
2. 怎么理解 Django 中url标签和reverse()函数 参考地址
需求:如果在urls.py 中修改了某个页面的地址,那么所有的地方(views.py和template中)都要修改。如果是个很大的工程,那么要修改的地方就很多。举例如下
url 的设置如下
urlpatterns = patterns(‘‘, (r‘^article$‘,‘get_news_index‘ ),)
Templates里的html类似<a href="/article">资讯</a>
这样的设置有很多个,并且分散在不同的页面,如果有一天,我要改成资讯 会很麻烦
现在的问题是怎么处理把json数据传到Api里面去 !
That curl command translated to a Python Requests call would be:
测试的代码是从这边过来的
还是这个问题,怎么通过a.py文件把数据传进去
get foribid <403> when using python coreapi
现在可以输入数据,但是好像数据里面的数据都是空!
现在需要删除数据,修改数据,但是put 方式被拒绝了
显示错误的形式如下
{"detail":"方法 “PUT” 不被允许。"}
现在的进度是可以实现插入新的数,用post
方式,但是修改数据的时候用put
的方式是不可以的?
同时发现插入新的数的时候,数据都是空的
现在需要做的是实现update这个函数功能!
‘查’的功能可以用get的方式得到,传入新的id 号是可以进行的查询的
现在又退回去了,发现写的函数其实是没有用的 ===
item = {"Brand_Name":"test_for_api_20170702"}item=json.dumps(item)BASE_URL_1 = 'https://horizon-retail-sam-leon-ghibli.c9users.io/restful_api/brandviewset/'def test_get_user_lis_2(): # serialize the dictionary from above into jsonresp =requests.post(BASE_URL_1,auth=AUTH,data=item,headers={ "Content-Type":"application/json","Accept": "application/json"}) print resp.status_code print resp.contenttest_get_user_lis_2()
1.Django REST framework 编写 RESTful API
1.1 DjangoRestfulApi的优势
自动生成符合RESTful 规范的 API,支持 OPTION、HEAD、POST、GET、PATCH、PUT、DELETE,还可以根据Content-Type 来动态的返回数据类型(如 text、json)
生成 browserable 的交互页面(自动为 API 生成非常友好的浏览器页面)
非常细粒度的权限管理(可以细粒度到 field 级别)
1.2 生成的步骤
model —–sariaizers———viewsets—–router——–>url
1.2.1生成model 层面,里面有个自定义的field SerializedField
,这个类,还有一个是MyModel(models.Model)
根据数据库创建的类
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)
1.2.2 Serializers ,相当于form的作用
class UserSerializer(serializers.ModelSerializer): class Meta: model = User # 定义关联的 Model fields = ('id', 'username', 'mymodels') # 指定返回的 fields # 下面是为 MyModel 中的外键建立超链接,依赖于 urls 中的 name 参数,不想要这个功能的话完全可以注释掉 mymodels = serializers.HyperlinkedRelatedField( many=True, queryset=MyModel.objects.all(), view_name='model-detail' )class MySerializer(serializers.ModelSerializer): options = MyCustField(max_length=1000, style={'base_template': 'textarea.html'},) class Meta: model = MyModel fields = ('id', 'owner', 'field', 'options') read_only_fields = ('owner',) # 指定只读的 field def create(self, validated_data): """响应 POST 请求""" # 自动为用户提交的 model 添加 owner validated_data['owner'] = self.context['request'].user return MyModel.objects.create(**validated_data) def update(self, instance, validated_data): """响应 PUT 请求""" instance.field = validated_data.get('field', instance.field) instance.save() return instance
1.2.3 ViewSet,可以有四种类型,ViewSet,ModelViewSet(自身带着6个方法),ReadOnlyModelViewSet,下面使用的是ModelViewSet
方式,plaintext()函数是自己定义的,需要使用list_route
和detail_route
两个修饰器装饰
from __future__ import unicode_literals, absolute_importfrom django.contrib.auth.models import Userfrom rest_framework import permissions, viewsets, renderersfrom rest_framework.decorators import ( permission_classes, detail_route)from rest_framework.response import Responsefrom .serializers import MySerializer, UserSerializerfrom .models import MyModelclass UserViewSet(viewsets.ModelViewSet): queryset = User.objects.all() serializer_class = UserSerializer # 指定权限,下面马上讲到 permission_classes = (permissions.IsAuthenticated,)class ModelViewSet(viewsets.ModelViewSet): queryset = MyModel.objects.all() serializer_class = MySerializer permission_classes = (permissions.IsAuthenticatedOrReadOnly,) @detail_route(renderer_classes=[renderers.StaticHTMLRenderer]) def plaintext(self, request, *args, **kwargs): """自定义 Api 方法""" model = self.get_object() return Response(repr(model))
1.2.4 Filters,实现数据过滤的操作
分为两个全局变量的设置,和viewset的设置,全局变量在setting.py设置,viewset的设置需要viewset 的时候定义一个名为filter_backend
的类变量:
class UserListView(generics.ListAPIView): queryset = User.objects.all() serializer = UserSerializer filter_backends = (filters.DjangoFilterBackend,)
同时还有一些是默认的filter和自己定义的filter的方式,默认的filter有两种,SearchFilter
和OrderingFilter
的两种方式,用法如下 ,我的理解是需要设置ordering_fields
,这个表示搜索区域
filter_backends = (filters.OrderingFilter,)ordering_fields = ('username', 'email')
自定义的filter 函数非常简单,只需要定义 filter_queryset(self, request, queryset, view) 方法,并返回一个 queryset 即可。以下是一个例子,作用是根据 nodename 来删选数据!
class NodenameFilter(filters.BaseFilterBackend): """ [nodename]: NeiWang """ def filter_queryset(self, request, queryset, view): nodename = request.QUERY_PARAMS.get('nodename') if nodename: return queryset.filter(nodename=nodename) else: return queryset
1.2.4 Premissions,用来给 ViewSet 设置权限,使用 premissions 可以方便的设置不同级别的权限,rest_framework 中提供了七种权限,可以在两个地方进行设置(上面有讲过),还有第三种就是自己写的权限设置,这个需要自己写一个premissions.py
class IsOwnerOrReadOnly(permissions.BasePermission): def has_permission(self, request, view): """针对每一次请求的权限检查""" if request.method in permissions.SAFE_METHODS: return True def has_object_permission(self, request, view, obj): """针对数据库条目的权限检查,返回 True 表示允许""" # 允许访问只读方法 if request.method in permissions.SAFE_METHODS: return True # 非安全方法需要检查用户是否是 owner return obj.owner == request.user
1.2.5 urls & routers
现在参考上面的代码,我加了一些代码,但是暂时不知道是什么用的,是在url中加的代码
- 6.30-7.2 LL--实习日志--Restful API 调用和编写
- 6.29-6.30 LL--实习日志--Restful API 概念理解+Restful_API编写
- 6.29 LL--实习日志--Restful API 概念理解+Restful_API编写
- 7.27-8.2 JLL实习日志-Ajax +Restful+Api+Variable参数
- 使用Restful api库之后,异常日志不能打印的问题(实习日志)
- RESTful API 编写指南
- RESTful API 编写规范
- 编写restful api
- RESTful API 编写指南
- c#调用Restful API
- C#调用RESTful API
- Django编写RESTful API(二):请求和响应
- Django编写RESTful API(四):认证和权限
- Django编写RESTful API(六):ViewSets和Routers
- Django编写RESTful API(二):请求和响应
- Django编写RESTful API(四):认证和权限
- Django编写RESTful API(六):ViewSets和Routers
- [置顶] RESTful API 编写指南
- Flask扩展: Flask-Moment
- JDK各个版本的新特性jdk1.5-jdk8
- 1.2 Getting Started
- HDFS 读写流程
- You are my brother
- 6.30-7.2 LL--实习日志--Restful API 调用和编写
- H264码流结构分析和rtp打包结构详解
- android平台下的数据存储与解析-sharedprefrences和文件存储
- 1.3 Getting Started
- 微信小程序开发入门教程 含视频 有源码
- 本地打包传maven库
- java中.rtf文件变成文本文件
- SpringBoot的actuator(执行器)常用的访问地址
- ADS1.2卸载不了和重装不上的解决办法