基於Django框架開發Restful api

在上篇文章中,我們講解了restful api的主要概念,讓大家有初步的瞭解。這一篇中,我們將通過python的Django框架,來學習開發restful 架構的接口。
 
一. 開發環境
開發語言:Python 3.6
IDE :Pycharm
框架:Django 2.2.12
測試工具:Postman

二.開發準備
django開發restful api有兩種方式,一種基於視圖函數,另一種爲類視圖的方式。在使用上更加推薦類視圖的方式,這樣可以使代碼層次更加簡潔明瞭。
 
首先,我們先在pycharm創建一個django的項目,命名爲myapi。
基於Django框架開發Restful api
運行下面命令,生成新的app,名稱爲sys_manage,用於測試restful api的功能。運行完成後,可看到新生成的app。
python manage.py startapp sys_manage
 

基於Django框架開發Restful api
在setting文件的INSTALLED_APPS中,增加該app名稱
基於Django框架開發Restful api
 
修改sys_manage/models.py文件,增加UserInfo模型,該表用於存儲測試的對象信息
基於Django框架開發Restful api
運行下面名稱,生成對應的數據庫表結構 

python manage.py makemigrations sys_manage
python manage.py migrate sys_manage

基於Django框架開發Restful api
 
到此,我們的準備工作完成,可以開始進行restful api的開發。
 
三. restful api開發
 
上篇有講到,restful 的每個url代表一個資源,這裏由於我們是本地操作,所以web域名用django默認的http://127.0.0.1:8000,完整的url爲http://127.0.0.1:8000/api/users ,用來表示用戶資源,通過對該url執行http請求(GET、POST、PUT和DELETE),驗證我們的restful 功能。
 
首先,我們在sys_manage/views文件中,創建對應的類視圖,名稱爲User

from django.views.generic import View
from sys_manage.models import UserInfo
from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse

class User(View):
    pass

在msapi/urls.py文件中,增加對該類視圖的路由

from django.contrib import admin
from django.urls import path
from sys_manage import views
urlpatterns = [
    path('api/users/',views.User.as_view()),
    path('api/users/<int:id>',views.User.as_view()), 
]

 
GET請求
接下來,我們先來寫一個對應get請求方法,在get請求包含獲取所有用戶信息與獲取指定用戶信息兩種,分別對應的url如下
htttp://127.0.0.1:8000/api/users # 獲取所有用戶信息
http://127.0.0.1:8000/api/users/id # 獲取指定ID的用戶信息
我們會在函數中判斷是否傳了id值以及查詢條件,來返回對應的數據,代碼如下:

class User(View):

    def get(self, request,id=0):
        search_dict={}
        #獲取GET傳值參數
        name=request.GET.get('name')
        age=request.GET.get('age')
        department=request.GET.get('dep')
        #如果存在參數,則添加到搜索條件
        if id:
            search_dict['id']=id
        if name:
            search_dict['name']=name
        if age:
            search_dict['age']=age
        if department:
            search_dict['department']=department
        #根據搜索條件查詢結果
        users=UserInfo.objects.filter(**search_dict).all()
        userinfo=[]
        for u in users:
            udata={
                'id':u.id,
                'name':u.name,
                'age':u.age,
                'departemnt':u.department
            }
            userinfo.append(udata)
        #返回用戶信息列表
        return JsonResponse({'code':0,'message':'Success!','data':userinfo})

由於數據庫目前沒有數據,我們可以先在數據庫插入幾條數據,然後啓動項目,通過postman測試get方法
基於Django框架開發Restful api
也可以根據id號,獲取單個用戶信息,如下:
基於Django框架開發Restful api
或者,通過參數條件查詢
基於Django框架開發Restful api
 
POST請求
下面,我們再寫一個處理POST請求的代碼,用於生成用戶對象,代碼如下:

    def post(self, request):
        data=json.loads(request.body)
        name=data.get('name')
        age=data.get('age')
        departemnt=data.get('dep')
        udata={
            'name':name,
            'age':age,
            'department':departemnt
        }
        user=UserInfo(**udata)
        user.save()
        return JsonResponse({'code':0,'message':'Success!'})

在POST請求中,會遇到跨域的問題,可以加一個dispatch函數,否則測試時會有403禁止訪問的報錯。

    @csrf_exempt
    def dispatch(self,*args, **kwargs):
        return super(User,self).dispatch(*args,**kwargs) 

我們測試下POST請求,新建一個用戶對象,名字爲Jim,請求返回成功信息。
基於Django框架開發Restful api
再通過GET方法,看一下新用戶是否已創建。在標紅處可以看到,用戶已經創建完成。
基於Django框架開發Restful api
 
除了GET和POST外,還有PUT和DELETE方法,代表更新信息與刪除,代碼如下 。
大家可以根據代碼,自己測試一下。

    def put(self, request,id):
        update_dict={}
        name=request.GET.get('name')
        age=request.GET.get('age')
        department=request.GET.get('dep')
        if name:
            update_dict['name']=name
        if age:
            update_dict['age']=age
        if department:
            update_dict['department']=department

        UserInfo.objects.filter(id=id).update(**update_dict)
        return JsonResponse({'code':0,'message':'Success!'})

    def delete(self, request,id):
        UserInfo.objects.filter(id=id).delete()
        return JsonResponse({'code':0,'message':'Success!'})
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章