REST的環(huán)境
virtualenv envsource env/bin/activate
在虛擬環(huán)境下:
pip install django
pip install djangorestframework
pip install pygments # 代碼高亮
Serializer序列化
ModelSerializer
models.py同目錄下建立serializer.py
并且對應(yīng)于models.py
class SnippetSerializer(serializers.ModelSerializer):
class Meta:
model = Snippet
fields = ('id', 'title', 'code', 'linenos', 'language', 'style') // 對應(yīng)于model中的字段```
用戶POST且沒有CSRF token時需要:
@csrf_exempt
*最終目的:用于將model中的instances進(jìn)行序列化并輸出即*:
my_msg_list = ModelMsgList.objects.filter(user_id=user_id) // 取出model中的instances
msglist = MsgListSerializer(my_msg_list, many=True) //將instances進(jìn)行序列化
msglist.data //取出序列化后的數(shù)據(jù)
Response(msglist.data) //返回數(shù)據(jù)
### 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
調(diào)用方法:
from rest_framework import serializers
serializer.<Fieldname>
列出一些常見的序列化關(guān)系:
- `ForeignKey`外鍵關(guān)系
- `ManyToManyField`多對多關(guān)系
- `OneToOneField`一對一關(guān)系:用于擴(kuò)展表屬性
- `PrimaryKeyRelatedField`主鍵關(guān)系
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=<modelname>-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
### 內(nèi)容協(xié)商:根據(jù)不同的媒體類型進(jìn)行不同的serilization
request.renderer
request.accepted_media_type
### Authentication認(rèn)證
request.user通常返回`django.contrib.auth.models.User`的一個實例禀忆,雖然該行為取決于所使用的認(rèn)證策略嘱吗。
request.user
`request.auth`返回任何附加的身份驗證上下文辽俗。 `request.auth`的確切行為取決于所使用的認(rèn)證策略隧熙,但它通常可以是請求被認(rèn)證的令牌的實例。 如果請求未認(rèn)證,或者沒有其他上下文,則`request.auth`的默認(rèn)值為`None`
request.auth
request.authenticators
### enhancements
request.method //返回HTTP method名,大寫
### 標(biāo)準(zhǔn)HTTP Response屬性
request.META // HTTP Header
request.session // SESSION
## Response
Response(data, status=None, template_name=None, headers=None, content_type=None)
render // 渲染器
data // 要返回的數(shù)據(jù)內(nèi)容
frome rest_framework import status
status.HTTP_404_NOT_FOUND
(關(guān)于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認(rèn)證
permission_classes = (permissions.IsAdminUser,) // 僅僅管理者用戶能接入這個view
## Returning URLs
一般情況下,返回一個URI絕對的絕對路徑比相對路徑更好,例如`http://example.com/foobar`比`/foobar`好REST框架提供兩個工具函數(shù)幫助Web API返回URI的絕對路徑
reverse(viewname, *args, **kwargs)
reverse_lazy(viewname, *args, **kwargs)