Django Rest Framework介绍、API暴露方法

561 阅读3分钟

Django REST framework

www.django-rest-framework.org/

解决的问题: 为应用提供Restful API

Django REST framework是一个强大的Web API开发框架,建立在Django框架之上,

  • 可以帮助Django REST framework是一个强大的Web API开发框架,建立在Django框架之上,
  • 可以帮助开发者快速地构建符合RESTful风格的API。

使用Django REST framework的基本步骤:

  1. 安装Django REST framework:可以使用pip来安装djangorestframework库。
  2. 在Django的settings.py文件中添加rest_framework配置。
  3. 创建序列化器(Serializer):序列化器用于定义如何将模型实例转换为Python数据类型,以及如何将Python数据类型转换回模型实例。
  4. 创建视图:视图是处理API请求并返回响应的地方。
  5. 定义URL模式:URL模式用于将URL路由到相应的视图。
  6. 运行服务器:启动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内置权限,只读权限,匿名用户

架构设计

image.png

工作流

image.png

4 行代码定义一个 model 的AP

image.png

案例

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/

image.png

http://172.31.7.188:8000/api/users/

image.png

直接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格式的数据。它定义了两个字段:nameage,分别对应于Person模型的这两个属性。通过使用serializers.ModelSerializer基类,我们可以轻松地为模型创建序列化器。