1. 程式人生 > >【Django】Django-REST-Framework

【Django】Django-REST-Framework

success image restfu n) efi png 16px one isa

【創建簡單的API】

1. cmd.exe

>django-admin startproject django_rest
>cd django_rest
\django_rest>python3 manage.py startapp api

2. setting.py 加應用

# Application definition
INSTALLED_APPS = [
‘django.contrib.admin‘,
‘django.contrib.auth‘,
‘django.contrib.contenttypes‘,
‘django.contrib.sessions‘,
‘django.contrib.messages‘,
‘django.contrib.staticfiles‘,
‘rest_framework‘,
‘api‘,
]

# 在文件末尾添加
REST_FRAMEWORK = {
‘DEFAULT_PERMISSION_CLASSES‘: (‘rest_framework.permissions.IsAdminUser‘,),
‘PAGE_SIZE‘: 10
}

3. 數據庫遷移

① models.py 拷貝

② guest工程__init__.py 拷貝

③ setting.py 的數據庫配置

python3 manage.py makemigrations api

python3 manage.py migrate

4. 創建超級管理員賬號

cmd.exe

\django_rest>python3 manage.py createsuperuser
Username (leave blank to use ‘fnngj‘): admin_rest
Email address: [email protected]
Password:admin123456
Password (again):admin123456
Superuser created successfully

5. 序列化

創建數據序列化, 創建.../api/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, 你可以使用主鍵或者其他關系, 但使用
HyperlinkedModelSerializer 是一個好的 RESTful 設計


6. 創建視圖 .../api/views.py

7. URLs
打開.../django_rest/urls.py 文件, 添加路徑的路由

8. 啟動服務
...\django_rest>python3 manage.py runserver
Performing system checks...
System check identified no issues (0 silenced).
November 21, 2016 - 21:50:18
Django version 1.10.3, using settings ‘django_rest.settings‘
Starting development server at http://127.0.0.1:8000/
Quit the server with CTRL-BREAK.
通過瀏覽器打開: http://127.0.0.1:8000/

技術分享圖片

【添加接口】

1. 點擊頁面右上角“Log in” 登錄系統, 賬號為剛剛創建的超級管理員帳號登錄

技術分享圖片


點擊: http://127.0.0.1:8000/groups/ 鏈接, 添加用戶組。 圖 13.4。 添加“test” 組和“developer” 組。
點擊: http://127.0.0.1:8000/users/鏈接, 添加用戶。 圖 13.5。 添加用戶“tom” 和“jack” 。
技術分享圖片

技術分享圖片



2. 練習寫測試接口
test.py

import unittest
import requests

class UserTest(unittest.TestCase):
‘‘‘用戶查詢測試‘‘‘

def setUp(self):
self.base_url = ‘http://127.0.0.1:8000/users‘

def test_user1(self):
‘‘‘test user 1‘‘‘
r = requests.get(self.base_url + ‘/1/‘,auth=(‘admin_rest‘,‘admin123456‘))
result = r.json()
self.assertEqual(result[‘username‘],‘admin‘)
self.assertEqual(result[‘email‘],‘[email protected]‘)

def test_user2(self):
‘‘‘test user 2‘‘‘
r = requests.get(self.base_url + ‘/2/‘,auth=(‘admin_rest‘,‘admin123456‘))
result = r.json()
self.assertEqual(result[‘username‘],‘admin_rest‘)
self.assertEqual(result[‘email‘],‘[email protected]‘)

def test_user3(self):
r = requests.get(self.base_url + ‘/3/‘,auth=(‘admin_rest‘,‘admin123456‘))
result = r.json()
self.assertEqual(result[‘username‘],‘jack‘)
self.assertEqual(result[‘email‘],‘[email protected]‘)

class GroupsTest(unittest.TestCase):
‘‘‘用戶組查詢測試‘‘‘
def setUp(self):
self.base_url = ‘http://127.0.0.1:8000/groups‘

def test_groups1(self):
r = requests.get(self.base_url + ‘/1/‘,auth=(‘admin_rest‘,‘admin123456‘))
result = r.json()
self.assertEqual(result[‘name‘],‘test‘)

def test_groups2(self):
r = requests.get(self.base_url + ‘/2/‘,auth=(‘admin_rest‘,‘admin123456‘))
result = r.json()
self.assertEqual(result[‘name‘],‘developer‘)



if __name__ == ‘__main__‘:
unittest.main()


3. models.py 復制 guest項目的
4. 數據遷移,參考上方對應的
5. 添加發布會數據序列化, 打開.../api/serializers.py 文件, 添加
……
from api.models import Event, Guest
……
class EventSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Event
fields = (‘url‘,‘name‘,‘address‘,‘start_time‘,‘limit‘,‘status‘)
class GuestSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Guest
fields = (‘url‘,‘realname‘,‘phone‘,‘email‘,‘sign‘,‘event‘)
6. 打開.../api/views.py 視圖文件, 定義發布會視圖類。

from api.serializers import EventSerializer,GuestSerializer
from api.models import Event,Guest

# ViewSets define the view behavior.
class EventViewSet(viewsets.ModelViewSet):
‘‘‘
API endpoint that allows events to be viewd or edited.
‘‘‘
queryset = Event.objects.all()
serialize_class = EventSerializer


class GuestViewSet(viewsets.ModelViewSet):
‘‘‘
API endpoint that allows guests to be viewed or edited
‘‘‘
queryset = Guest.objects.all()
serializer_class = GuestSerializer


7. 打開.../django_rest/urls.py 文件, 添加 URL 配置

……
#Routers provide an easy way of automatically determining the URL conf.
……
router.register(r‘event‘, views.EventViewSet)
router.register(r‘guest‘, views.GuestViewSet)
……

啟動項目, 使用瀏覽器打開: http://127.0.0.1:8000/


技術分享圖片




【代碼】
環境開戶接口
api/serializers.py

from django.contrib.auth.models import User,Group
from rest_framework import serializers
from api.models import Event,Guest

class UserSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = User
fields = (‘url‘,‘username‘,‘email‘,‘groups‘)

class GroupSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Group
fields = (‘url‘,‘name‘)

class GuestSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Event
fields = (‘url‘,‘name‘,‘address‘,‘start_time‘,‘limit‘,‘status‘)


class EventSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Guest
fields = (‘url‘,‘realname‘,‘phone‘,‘email‘,‘sign‘,‘event‘)





url.py
from django.conf.urls import url,include
from django.contrib import admin
from rest_framework import routers
from api import views

#Routers provide an easy way of automatically determining the URL conf.
router = routers.DefaultRouter()
router.register(r‘users‘,views.UserViewSet)
router.register(r‘groups‘,views.GroupViewSet)

router.register(r‘event‘,views.EventViewSet)
router.register(r‘guest‘,views.GuestViewSet)


# Wire up our API using automatic URL routing.
# Additionally,we include login URLs for the browsable API.
urlpatterns = [
url(r‘^admin/‘, admin.site.urls),
url(r‘^‘,include(router.urls)),
url(r‘^api-auth/‘,include(‘rest_framework.urls‘,namespace=‘rest_framework‘)),


]
#【備註】因為我們使用的是 viewset, 所以我們可以使用 routers 類自動生成 URL conf



tests.py


import unittest
import requests

class UserTest(unittest.TestCase):
‘‘‘用戶查詢測試‘‘‘

def setUp(self):
self.base_url = ‘http://127.0.0.1:8000/users‘

def test_user1(self):
‘‘‘test user 1‘‘‘
r = requests.get(self.base_url + ‘/1/‘,auth=(‘admin_rest‘,‘admin123456‘))
result = r.json()
self.assertEqual(result[‘username‘],‘admin‘)
self.assertEqual(result[‘email‘],‘[email protected]‘)

def test_user2(self):
‘‘‘test user 2‘‘‘
r = requests.get(self.base_url + ‘/2/‘,auth=(‘admin_rest‘,‘admin123456‘))
result = r.json()
self.assertEqual(result[‘username‘],‘admin_rest‘)
self.assertEqual(result[‘email‘],‘[email protected]‘)

def test_user3(self):
r = requests.get(self.base_url + ‘/3/‘,auth=(‘admin_rest‘,‘admin123456‘))
result = r.json()
self.assertEqual(result[‘username‘],‘jack‘)
self.assertEqual(result[‘email‘],‘[email protected]‘)

class GroupsTest(unittest.TestCase):
‘‘‘用戶組查詢測試‘‘‘
def setUp(self):
self.base_url = ‘http://127.0.0.1:8000/groups‘

def test_groups1(self):
r = requests.get(self.base_url + ‘/1/‘,auth=(‘admin_rest‘,‘admin123456‘))
result = r.json()
self.assertEqual(result[‘name‘],‘test‘)

def test_groups2(self):
r = requests.get(self.base_url + ‘/2/‘,auth=(‘admin_rest‘,‘admin123456‘))
result = r.json()
self.assertEqual(result[‘name‘],‘developer‘)



if __name__ == ‘__main__‘:
unittest.main()


















































 

【Django】Django-REST-Framework