Django REST framework
解决的问题: 为应用提供Restful API
Django REST framework是一个强大的Web API开发框架,建立在Django框架之上,
- 可以帮助Django REST framework是一个强大的Web API开发框架,建立在Django框架之上,
- 可以帮助开发者快速地构建符合RESTful风格的API。
使用Django REST framework的基本步骤:
- 安装Django REST framework:可以使用pip来安装djangorestframework库。
- 在Django的settings.py文件中添加rest_framework配置。
- 创建序列化器(Serializer):序列化器用于定义如何将模型实例转换为Python数据类型,以及如何将Python数据类型转换回模型实例。
- 创建视图:视图是处理API请求并返回响应的地方。
- 定义URL模式:URL模式用于将URL路由到相应的视图。
- 运行服务器:启动Django开发服务器,然后通过浏览器或其他工具访问API。
序列化器(Serializer)
在Django REST framework中需要定一个Serializer 然后交给视图层处理。
序列化器(Serializer)的作用是
- 将模型实例(Model instance)转换为Python数据类型(如字典)以便将其转换为JSON格式的响应。
- 同时,它还可以将接收到的JSON数据转换回模型实例,以便进行保存操作。
DRF 架构之美
- 简单易用,既可以使用自动的 CRUD API,也可以自定义实现API
- 提供可浏览的 HTML API; 一套实现同时提供 HTML/JSON/XML 展现
- 灵活的用户认证,支持 Token/OAuth/OAuth2/JWT 等认证方式
- 提供处理过程
- 提供流量控制
- 结果过滤筛选
- 分页
- API 版本控制能力
- 灵活的权限控制:登陆用户,管理员,Django内置权限,只读权限,匿名用户
架构设计
工作流
4 行代码定义一个 model 的AP
案例
python3 -m pip install djangorestframework
python3 -m pip install markdown
python3 -m pip install django-filter
setting配置修改
INSTALLED_APPS = [
...
'rest_framework',
]
url配置修改
urlpatterns = [
...
path('api-auth/', include('rest_framework.urls'))
]
setting配置修改
REST_FRAMEWORK = {
# Use Django's standard `django.contrib.auth` permissions,
# or allow read-only access for unauthenticated users.
'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
]
}
定义序列化的方法 将数据返回 wangdalei_dj/wangdalei/urls.py
from rest_framework import routers, serializers, viewsets
from django.contrib.auth.models import User
from jobs.models import Job
# Serializers define the API representation.
class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = ['url', 'username', 'email', 'is_staff']
# ViewSets define the view behavior.
class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
class JobSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Job
fields = '__all__'
class JobViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows groups to be viewed or edited.
"""
queryset = Job.objects.all()
serializer_class = JobSerializer
# Routers provide an easy way of automatically determining the URL conf.
router = routers.DefaultRouter()
router.register(r'users', UserViewSet)
router.register(r'jobs', JobViewSet)
urlpatterns = [
path('admin/', admin.site.urls),
path("", include("jobs.urls")),
# django rest api & api auth (login/logout)
path('api/', include(router.urls)),
path('api-auth/', include('rest_framework.urls')),
]
http://172.31.7.188:8000/api/users/
直接curl
{"url":"http://172.31.7.188:8000/api/users/2/","username":"wxl","email":"wxl@126.com","is_staff":true}[root@bogon ~]#
[root@bogon ~]# curl http://172.31.7.188:8000/api/users/1/
{"url":"http://172.31.7.188:8000/api/users/1/","username":"admin","email":"","is_staff":true}[root@bogon ~]#
[root@bogon ~]# curl http://172.31.7.188:8000/api/users/3/
{"url":"http://172.31.7.188:8000/api/users/3/","username":"wangdalei","email":"","is_staff":true}[root@bogon ~]#
Django REST framework使用案例
pip install django
pip install djangorestframework
# 创建一个新的Django项目和应用
django-admin startproject myproject
cd myproject
python manage.py startapp myapp
在myapp目录下的models.py文件中定义一个模型
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
def __str__(self):
return self.name
在myapp目录下创建一个名为serializers.py的文件,并定义一个序列化器:
from rest_framework import serializers
from .models import Person
class PersonSerializer(serializers.ModelSerializer):
class Meta:
model = Person
fields = ['name', 'age']
在myapp目录下创建一个名为views.py的文件,并定义一个视图:
from rest_framework import generics
from .models import Person
from .serializers import PersonSerializer
class PersonListCreateView(generics.ListCreateAPIView):
queryset = Person.objects.all()
serializer_class = PersonSerializer
在myapp目录下创建一个名为urls.py的文件,并定义URL模式
from django.urls import path
from .views import PersonListCreateView
urlpatterns = [
path('persons/', PersonListCreateView.as_view(), name='person_list_create'),
]
在这个示例代码中,PersonSerializer是一个序列化器,用于将Person模型实例转换为JSON格式的数据。它定义了两个字段:name和age,分别对应于Person模型的这两个属性。通过使用serializers.ModelSerializer基类,我们可以轻松地为模型创建序列化器。