6.30-7.2 LL--实习日志--Restful API 调用和编写

1.这里写链接内容
2. 怎么理解 Django 中url标签和reverse()函数 参考地址
需求:如果在urls.py 中修改了某个页面的地址,那么所有的地方(views.py和template中)都要修改。如果是个很大的工程,那么要修改的地方就很多。举例如下
url 的设置如下  

urlpatterns = patterns(‘‘,    
    (r‘^article$‘,‘get_news_index‘ ),
)

Templates里的html类似资讯这样的设置有很多个,并且分散在不同的页面,如果有一天,我要改成资讯 会很麻烦


现在的问题是怎么处理把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 json
resp =requests.post(BASE_URL_1,auth=AUTH,data=item,headers={ "Content-Type":"application/json","Accept": "application/json"})
    print resp.status_code
    print resp.content
test_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_import
from django.contrib.auth.models import User
from rest_framework import permissions, viewsets, renderers
from rest_framework.decorators import (
    permission_classes, detail_route
)
from rest_framework.response import Response

from .serializers import MySerializer, UserSerializer
from .models import MyModel
class 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中加的代码

你可能感兴趣的:(JLL实习日子)