前面的几篇关于REST framework的内容,从刚开始的序列化到框架的几个重要的模块,再到基于类的视图,再到认证和权限,后面还有给我们的API添加链接,以及最后关于ViewSet和Router的内容。这算是一个比较系统的,比较完善的学习过程。如果只是简单使用REST framework,不想花费很多精力的化,可以直接通过本文内容快速入门Django REST framework。
下面我们创建一个简单的API允许管理员用户去编辑系统的用户和组。
项目设置
创建一个Django项目,命名为quick_start, 然后新建一个app,命名为myapp:
# 创建项目文件夹 mkdir quickstartcd quick_start # 创建一个虚拟环境 python3 -m venv env source env/bin/activate # 在虚拟环境中安装django, djangorestframework pip install django pip install djangorestframework # 新建一个项目,并在项目下新建一个app django-admin startproject quickstart . cd quickstart django-admin startapp myapp cd ..
当创建完成后,我们的文件夹结构如下:
$ pwd<some path>/quickstart $ find .../manage.py ./quickstart ./quickstart/__init__.py ./quickstart/myapp ./quickstart/myapp/__init__.py ./quickstart/myapp/admin.py ./quickstart/myapp/apps.py ./quickstart/myapp/migrations ./quickstart/myapp/migrations/__init__.py ./quickstart/myapp/models.py ./quickstart/myapp/tests.py ./quickstart/myapp/views.py ./quickstart/settings.py ./quickstart/urls.py ./quickstart/wsgi.py
然后,同步一下数据库:
python manage.py makemigrations python manage.py migrate
我们现在先创建一个超级用户,后面会需要用到:
python manage.py createsuperuser --email zhangsan@123.com --username zhangsan
下面,我们就可以进入到我们的app目录下进行编码了。
序列化器
首先,我们需要定义几个序列化器,我们直接在myapp目录下新建一个文件quick_start/myapps/serializers.py,我们用序列化器来进行数据库中的数据进行展示和操作。
from django.contrib.auth.models import User, Group from rest_framework import serializers class UserSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = User fields = ('url', 'username', 'email', 'groups') class GroupSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Group fields = ('url', 'name')
在上面的代码中,我们使用了HyperlinkedModelSerializer。当然有可以使用主键(primary key)或者其它的关系。不过使用超链接更符合REST的设计。
视图
现在,我们可以写一下视图函数了。打开quick_start/myapp/views.py文件,编辑:
from django.contrib.auth.models import User, Group from rest_framework import viewsets from .serializers import UserSerializer, GroupSerializer class UserViewSet(viewsets.ModelViewSet): """ 允许查看或者编辑user对象的API """ queryset = User.objects.all() serializer_class = UserSerializer class GroupSerializer(viewsets.ModelViewSet): """ 允许查看或者编辑group对象的API """ queryset = Group.objects.all() serializer_class = GroupSerializer
我们这边并不是针对User和Group写多个视图veiws,而是使用了ViewSet类,这个类整合了我们常见的多种操作行为,比如我们在view视图中常写的get, post, put,delete等操作。
如果有需要的话,我们也可以把它们分别写成单独的视图。不过还是最好使用ViewSet,ViewSet能让我们的代码更加简洁。
URLs
然后,我们可以设置我们的API的URL了。在quick_start/urls.py文件中:
from django.urls import path, include from rest_framework.routers import DefaultRouter from myapp import views router = DefaultRouter()router.register('users', views.UserViewSet) router.register('groups', views.GroupViewSet) urlpatterns = [ path('', include(router.urls)), path('api-auth/', include('rest_framework', namespace='rest_framework')) ]
分页
如果返回的结果很多的话,为了有良好的显示效果,我们最好对我们的API进行分页显示。分页显示的功能也很容易实现,只需要在我们项目下的quick_start/setttings.py文件中添加如下内容:
REST_FRAMEWORK = { 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination', 'PAGE_SIZE': 10}
其中上面的这个名字为REDT_FRAMEWORK的字典是用于存储我们的REST framework的所有全局配置项。
Settings.py设置
我们还需要在我们的quick_start/setttings.py文件中的INSTALLED_APPS字典中添加rest_framework。
INSTALLED_APPS = [ ... 'rest_framework',]
现在,我们所有的工作就已经完成了。
测试API
现在我们可以来测试一下我们写的API了。
首先运行一下我们的服务器:
python manage.py runserver
我们可以直接在命令行中通过一些工具来访问我们的API,比如curl或者httpie
如下是通过httpie:
>>> http -a zhangsan:123456 GET http://127.0.0.1:8000/users/ HTTP/1.1 200 OK Allow: GET, POST, HEAD, OPTIONS Content-Length: 247 Content-Type: application/json Date: Wed, 17 Jul 2019 04:39:40 GMT Server: WSGIServer/0.2 CPython/3.6.0 Vary: Accept, Cookie X-Frame-Options: SAMEORIGIN { "count": 2, "next": null, "previous": null, "results": [ { "email": "zhangsan@123.com", "groups": [], "url": "http://127.0.0.1:8000/users/1/", "username": "zhangsan" }, { "email": "lisi@123.com", "groups": [], "url": "http://127.0.0.1:8000/users/2/", "username": "lisi" } ] }
我们还可以直接通过浏览器访问我们的URL,http://127.0.0.1/users/。
访问如下图:
在使用浏览器访问时候,我们还需要注意页面右上角的Login选项。
此时由于我们还没有设置查看和修改的权限,在未授权的情况下就可以编辑或者新增内容,这样是不安全的。
如果需要设置权限,可以查看下面这篇文章:
本文中的源码可以在Github上查看。点我查看本文源码
转载请注明:禅思 » Django Rest Framework学习总结:快速入门?