Django搭配restful api

DRF认证源码分析图

安装步骤:

pip install restfulframework

from rest_framework import serializers

导入serializers序列化包

from rest_framework.decorators import api_view

导入装饰器来装饰自定义的api视图

REST框架提供了两种编写API视图的封装。

@api_view装饰器,基于方法的视图。

② 继承APIView类,基于类的视图。

例子:获取留言板内容。

注意视图函数运用restful接口应该通过Response返回,而不是HttpResponse

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from rest_framework import serializers
from rest_framework.decorators import api_view
from rest_framework.response import Response

from ..models.models import Message
from django.http import response

# 类似于ModelForm表单
class msg_serializers(serializers.ModelSerializer):
class Meta:
model = Message
fields = ('message', 'dates', 'msg_author')


@api_view(['GET'])
def msg_api(request):
if request.method == 'GET':
msg = Message.message_.all()
serializer = msg_serializers(msg, many=True)
return Response(serializer.data)

dispatch源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def dispatch(self, request, *args, **kwargs):
"""
`.dispatch()` is pretty much the same as Django's regular dispatch,
but with extra hooks for startup, finalize, and exception handling.
"""
self.args = args
self.kwargs = kwargs
request = self.initialize_request(request, *args, **kwargs) # 实例化封装后的request对象
self.request = request
self.headers = self.default_response_headers # deprecate?

try:
self.initial(request, *args, **kwargs)

# Get the appropriate handler method
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), # 反射机制,获取request.method.lower()的内存地址,如果在的话
self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed

response = handler(request, *args, **kwargs) # 执行对应的handler方法,返回结果为HttpRespon对象,赋值给

except Exception as exc:
response = self.handle_exception(exc)

self.response = self.finalize_response(request, response, *args, **kwargs)
return self.response

其中比较重要的是handler处的反射机制,获取并执行类视图对应的HTTP方法!

Restful API Framework 框架英文文档https://www.django-rest-framework.org/api-guide/views/

获取外键所在表内的属性

1
2
3
4
5
6
7
8
class Information_serializer(serializers.ModelSerializer):
# 通过source获取user中的username属性
user = serializers.CharField(source='user.username', read_only=True)
email = serializers.CharField(source='user.email', read_only=True)

class Meta:
model = Information
fields = ('user', 'motto', 'hobby', 'head_image', 'email')

注:通过source属性可以获取到关联表中的具体字段,一般来说,一对一,一对多,多对多,如果直接序列化,外键会被序列化为关联表的主键ID,通常不是我们想要的,因此我们可以使用source重新给关联表的属性赋值。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!