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_route
和detail_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有两种,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中加的代码