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_routedetail_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有两种,SearchFilterOrderingFilter 的两种方式,用法如下 ,我的理解是需要设置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中加的代码

原创粉丝点击