django-rest-framework框架的学习使用

REST的环境

virtualenv envsource env/bin/activate

在虚拟环境下:

pip install django
pip install djangorestframework
pip install pygments  # 代码高亮

Serializer序列化

ModelSerializer

models.py同目录下建立serializer.py
并且对应于models.py

class SnippetSerializer(serializers.ModelSerializer):    
  class Meta:        
    model = Snippet        
    fields = ('id', 'title', 'code', 'linenos', 'language', 'style')        // 对应于model中的字段```

用户POST且没有CSRF token时需要:

@csrf_exempt


*最终目的:用于将model中的instances进行序列化并输出即*:

my_msg_list = ModelMsgList.objects.filter(user_id=user_id) // 取出model中的instances
msglist = MsgListSerializer(my_msg_list, many=True) //将instances进行序列化
msglist.data //取出序列化后的数据
Response(msglist.data) //返回数据

### Serializer Fields
`source`字段

URLField(source='get_absolute_url')

`format`字段

serializers.CharField(format="%Y-%m-%d %H:%M:%S.%f")

`allow_null`字段

serializers.CharField(allow_null=True)

`default`字段

serializers.CharField(default='')

`label`字段

serializers.CharField(label='ID')

`required`字段
`queryset`字段

serializers.PrimaryKeyRelatedFieldqueryset=User.object.all()

`read_only`字段

serializers.IntegerField(read_only=True)


### Serializer relations
调用方法:

from rest_framework import serializers
serializer.

列出一些常见的序列化关系:
- `ForeignKey`外键关系
- `ManyToManyField`多对多关系
- `OneToOneField`一对一关系:用于扩展表属性
- `PrimaryKeyRelatedField`主键关系

class AlbumSerializer(serializers.ModelSerializer):
tracks = serializers.HyperlinkedRelatedField(many=True,read_only=True, view_name='track-detail')
class Meta:
model = Album
fields = ('album_name', 'artist', 'tracks')

将序列化成:

{
'album_name': 'Graceland',
'artist': 'Paul Simon',
'tracks': [ // 列表[]需要many = true; URL需view_name=-detail
'http://www.example.com/api/tracks/45/',
'http://www.example.com/api/tracks/46/',
'http://www.example.com/api/tracks/47/',
...
]
}

## Request请求
### 请求解析

request.data // POST,PU,DELETE方法,可返回文件
request.query_params // GET方法
request.parsers


### 内容协商:根据不同的媒体类型进行不同的serilization

request.renderer
request.accepted_media_type


### Authentication认证
request.user通常返回`django.contrib.auth.models.User`的一个实例,虽然该行为取决于所使用的认证策略。

request.user


`request.auth`返回任何附加的身份验证上下文。 `request.auth`的确切行为取决于所使用的认证策略,但它通常可以是请求被认证的令牌的实例。 如果请求未认证,或者没有其他上下文,则`request.auth`的默认值为`None`

request.auth

request.authenticators


### enhancements

request.method //返回HTTP method名,大写


### 标准HTTP Response属性

request.META // HTTP Header
request.session // SESSION


## Response

Response(data, status=None, template_name=None, headers=None, content_type=None)
render // 渲染器
data // 要返回的数据内容
frome rest_framework import status
status.HTTP_404_NOT_FOUND
(关于status code )[http://www.django-rest-framework.org/api-guide/status-codes/]


## View视图

from rest_framework.views import APIView
class ListUsers(APIView):
""" View to list all users in the system.

  • Requires token authentication.
  • Only admin users are able to access this view.
    """
    authentication_classes = (authentication.TokenAuthentication,) //需要token认证
    permission_classes = (permissions.IsAdminUser,) // 仅仅管理者用户能接入这个view
## Returning URLs
一般情况下,返回一个URI绝对的绝对路径比相对路径更好,例如`http://example.com/foobar`比`/foobar`好REST框架提供两个工具函数帮助Web API返回URI的绝对路径

reverse(viewname, *args, **kwargs)
reverse_lazy(viewname, *args, **kwargs)

你可能感兴趣的:(django-rest-framework框架的学习使用)