Task12 Restful
关于Rest, 我应该在其他的文章中涉及到那么一点点。(如果你们在我的文章中没看到过说明是在我还没发出去的半成品) 简单说以下为什么要用Restful. Restful实际上是早就出现了,但是无论在哪中设计理念上都有着非常重要的含义。就最近的我们的微服务框架来说,在服务与服务之间的相互调用的过程中,Rest规范是将我们服务之间调用的一种格式。没有Rest服务的调用就会变得非常麻烦,而且没统一标准的请求与响应,不同服务间的适配就会麻烦的上天。所以我们要学习Rest(以上是我的理解)好的,接下来优势喜喜喜喜闻乐见的Django Restful 官网的放置:https://www.django-rest-framework.org/。 (中文请自行github follower) Django Restful framework 也就是我们所说的drf, 广泛的用于开发中
那么什么是Restful? **REST:表述性状态传递,即 (Representational State Transfer ) **是2000年就提出来的一种软件架构风格。它是一种针对网络应用的设计和开发方式,可以降低开发的复杂强行,提高系统的可伸缩性。Restful API的设计规范: http://wangwei.info/about-rest-api/
Restful API的四大基本原则:
- 为每个资源设计URI
- 通过XML / JSON 进行数据传输
- 无状态连接, 服务端不应保存过多的续航下文状态
- 使用HTTP 的方法涵盖 GET POST PUT DELETE
DRF 能够做到什么:
- 可以写一个Web API, 即不受语言, 地域等限制
- 可以对接口进行授权认证,使用OAuth1a /OAuth2 协议 (关于协议我后面会更新,大概。文档放着,有空拜读https://datatracker.ietf.org/doc/html/rfc6749 这是RFC是一定要看的)
说了这么多概念,咱就Django里使用RESTful编程,Rest定义路由 --》请求 --》数据库获取数据 --》 模型序列化 --》 响应数据
入门还是要按照官方文档走的,第一步必然是pip. DRF设计web API的时候官网给了几个可视化的包咱就不装了。
pip install djangorestframework
任何一个插件的使用都需要在setting中注册,并进行一定的配置:
# settings.py
INSTALLED_APPS = [
...
'rest_framework'
]
# 配置RESTful:
REST_FRAMEWORK= {
# 默认访问权限,更多模式直接去源码里面反翻就好了
'DEFAULT_PERMISSION_CLASSES':'rest_framework.permissions.IsAuthenticatedOrReadOnly',
}
基本配置就完成了,接下来我们以之前的游戏模型创建一个简单的REST实例
# serializer.py(自己新建的,随便什么名字) 序列化
from rest_framework import serializers
from .models import GameMaker
# 定义一个模型序列化类,继承serializers.Serializer.这里可以继承的方法多的是,还是那句话,翻源码。
# 我结合了快速入门和普通教程魔改了一下
class GameMakerSerializer(serializers.HyperlinkedModelSerializer):
def create(self, validated_data):
return GameMaker.objects.save(**validated_data)
# 元数据,使用的模型与返回时展示的字段的定义。更多源码都有
class Meta:
model = GameMaker
fields = ['gamer_name','gamer_num']
#urls.py Rest路由(不完全)
urlpatterns = [
path('gamemaker/<str:name>/', get_GameMaker),
]
# views.py的响应
def get_GameMaker(request:HttpRequest,name):
if GameMaker.objects.get(gamer_name=name):
game_maker = GameMaker.objects.get(gamer_name=name)
else:
return HttpResponse('404')
# 序列化
serializer_game_maker = GameMakerSerializer(game_maker)
return JsonResponse(serializer_game_maker.data)
我们去访问的时候就能轻松的搞定
当然,Restful框架不仅仅只提供序列化这个强大的功能。我们上面说过,REST是基于URI的,换句话来说,不能定义路由的框架咱么敢大放阙词REST。 所以Restful框架中尉我们提供了路由的扩展:router
# 以下是官方示例中快速入门的一段代码
# Routers provide an easy way of automatically determining the URL conf.
router = routers.DefaultRouter()
# UserViewSet是viewsets.ModelViewSet的子类,需要定义queryset 和 serialize_class 属性
router.register(r'users', UserViewSet)
urlpatterns = [
path('', include(router.urls)),
# 授权的API,查看已有的接口
path('api-auth/', include('rest_framework.urls', namespace='rest_framework'))
]
# 关于register函数,他是在BaseRouter的方法(继承来的):
def register(self, prefix, viewset, basename=None):
if basename is None:
basename = self.get_default_basename(viewset)
self.registry.append((prefix, viewset, basename))
# invalidate the urls cache
if hasattr(self, '_urls'):
del self._urls
OK, Django的学习告一段落!!