使用django開發restful接口



前言

django學了也挺久的了,但對於django開發自己總是感覺不如人意,可能是基礎的架構沒有建設好,作為半路轉行的人員來說,夯實基礎尤為重要。趁着這個周末,利用django進行了一波開發學習。初衷是為了讓自己更好的入門理解django開發。

本文是一個簡單的用戶管理系統。

開發環境配置

  • python版本——3.7.7
  • IDE——pycharm2019.3.3
  • django——2.2.17
  • postman

django中的開發接口有兩種模式FBV和CBV,分別是基於函數視圖基於類視圖,詳細的可以看看菜鳥教程的Django 視圖 - FBV 與 CBV,由於本文的用戶管理是一個restful風格的api,所以我選擇的是類視圖的開發風格。

進入開發

首先我們使用django-admin命令創建一個新項目:

django-admin startproject userapi

然后進入項目

cd userapi

然后創建項目虛擬環境並在虛擬環境中安裝django

image-20201108181926082

接着我們創建一個用戶管理系統app

python manage.py startapp usermanage

然后我們就使用pycharm打開我們在命令行創建的這個項目吧。

目前pycharm創建的django項目使用的django版本是3.X版本,但是我們還是先使用2.2LTS版本吧

image-20201108182338971

可以看到項目的結構和目錄如pycharm的截圖所示。

django設置

首先我們需要在django設置中改動幾處位置。

  • 首先我們創建的app需要在django設置文件中進行注冊

    image-20201108182635425

  • 然后在更改語言和地區

    image-20201108182819406

然后我們啟動一下,看一下我們的django是否正常。

在命令行輸入

python manage.py runserver 8000

image-20201108183007076

可以看到我們已經啟動成功了,不過提示我們需要運行什么命令,下面在解決,我們先打開網頁看看有沒有問題。

image-20201108183121512

數據庫配置

接下來我們要做的第一件事情就是我們要打開usermanageapp的models文件,創建數據庫模型。數據庫配置就是用django默認的。

usermanage/models.py

from django.db import models


# Create your models here.
class Users(models.Model):
    SEX_ITEMS = (
        (2, '未知'),
        (1, '男'),
        (0, '女'),
    )
    name = models.CharField(max_length=128, verbose_name='姓名')
    sex = models.IntegerField(choices=SEX_ITEMS, default=2, verbose_name='性別')
    idcard = models.CharField(max_length=18, verbose_name='身份證號碼', unique=True)
    email = models.EmailField(verbose_name='郵箱地址')
    address = models.CharField(max_length=256, verbose_name='家庭住址')
    company = models.CharField(max_length=256, verbose_name='所屬公司')
    created_time = models.DateTimeField(auto_now_add=True, verbose_name='創建時間')

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = verbose_name_plural = '用戶管理'

數據庫創建好了,現在我們就要解決剛才的啟動django時的提示了。

我們在命令行輸入兩條命令:

image-20201108183725782

image-20201108183805242

可以看到命令輸入后,django把自帶的表和我們設置的表都創建成功了。我們在pycharm里面看看。

image-20201108183927699

可以看到創建成功了。

配置路由

數據庫模型建設完成了,按理說我們應該進入視圖的開發了,但是先別着急,我們先定義一下url的規則。

我們打開django的urls.py文件,進行配置。

userapi/urls.py

from django.contrib import admin
from django.urls import path
from usermanage import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('user/', views.UsersView.as_view()),
    path('user/<int:pk>/', views.UsersView.as_view())
]

我們先從usermanage用戶管理app中導入視圖模塊,然后配置user/路由作為本次的訪問路徑。

路由配置完成了。那我們先來編寫一個訪問視圖吧。

視圖開發

GET

在開發之前我們應該先分析一下需求,我們要實現什么樣的效果

  • 首先http://127.0.0.1:8000/user/get方法應該可以訪問全部的用戶
  • 然后http://127.0.0.1:8000/user/1/get方法應該可以訪問單個用戶
  • http://127.0.0.1:8000/user/?name=XX/get方法應該可以過濾出符合條件的用戶

好了明確了需求我們就進入開發吧。代碼如下:

import json
from django.http import JsonResponse
from django.views.generic import View
from django.forms.models import model_to_dict

from .models import Users


class UsersView(View):
    
    def get(self, request, pk=0):
        if pk:
            try:
                user = Users.objects.get(pk=pk)
                user = model_to_dict(user)
                return JsonResponse({'code': 200, 'message': 'success', 'data': user}, status=200)
            except Users.DoesNotExist:
                return JsonResponse({'code': 404, 'message': '用戶不存在'}, status=200)
        data = json.loads(request.body) if request.body else {}
        users = list(Users.objects.filter(**data).all().values())
        return JsonResponse({'code': 200, 'message': 'success', 'data': users}, status=200)

通過pk參數區分是單個用戶還是多個用戶。

然后通過request的請求來過濾對應的數據。

然后我們測試一下。啟動我們的django,和上面的啟動方法一樣。

使用postman測試接口

image-20201108185919940

請求的方法和地址沒問題,響應是200,但是沒有數據。因為我們還沒有創建數據。

我們先來創建一個數據吧,在那創建呢,那肯定是django的管理后台了。

我們先來創建一個超級用戶吧。

image-20201108190558793

創建成功后我們先設置一下django的管理后台的東西。

usermanage/admin.py

from django.contrib import admin
from .models import Users


# Register your models here.

@admin.register(Users)
class UsersAdmin(admin.ModelAdmin):
    list_display = ('name', 'sex', 'idcard', 'address', 'company', 'created_time')

然后我們打開管理后台在里面創建一個數據吧。

image-20201108190922032

創建成功后我們再來訪問剛才那個接口:

image-20201108190950219

可以看到有數據了,就是我們剛才創建的那條。然后我們驗證一下我們的需求。

image-20201108202605025

到這里呢 get方法的內容就開發完了,接下來我們要開發post請求了。

POST

分析一下post請求,我們post請求是添加一條數據。根據restful的規范添加數據的同時我們必須要返回該請求的信息。

那么一起來看看吧

import json

from django.forms.models import model_to_dict
from django.views.generic import View
from django.http import JsonResponse
from django.db.utils import IntegrityError
from .models import Users

class UsersView(View):
    
    ...
    
    def post(self, request):
        data = json.loads(request.body)
        try:
            user = Users.objects.create(**data)
            user = model_to_dict(user)
	    return JsonResponse({'code': 201, 'message': 'created', 'data': user}, status=201)
        except IntegrityError:
            return JsonResponse({'code': 400, 'message': '身份證號碼已存在!'}, status=200)

好了,代碼我們寫完了,我們在postman中測試一下。

image-20201108203504351

什么情況,報錯了,我們在瀏覽器里面看看。

那么這個是csrf驗證失敗,什么是csrf呢?看看度娘怎么說吧跨站請求偽造(英語:Cross-site request forgery)

知道了是什么那么怎么處理呢,django內置了一個方法,我們只需要添加上就行了。更改代碼

from django.views.decorators.csrf import csrf_exempt


# Create your views here.
class UsersView(View):
    @csrf_exempt
    def dispatch(self, request, *args, **kwargs):
        return super(UsersView, self).dispatch(request, *args, **kwargs)

	...
    
    def post(self, request):
        data = json.loads(request.body)
        try:
            user = Users.objects.create(**data)
        except IntegrityError:
            return JsonResponse({'code': 400, 'message': '身份證號碼已存在!'}, status=200)
        user = model_to_dict(user)
        return JsonResponse({'code': 201, 'message': 'created', 'data': user}, status=201)

使用csrf_exempt裝飾器給dispatch就可以了。我們再來測試一下。

image-20201108203122145

可以看到我們在postman中發送請求之后,該條信息被成功的創建了。並且返回了201的狀態碼。

PUT

更新一條數據。這個應該不用細說了,直接看代碼吧。

    def put(self, request, pk=0):
        data = json.loads(request.body)
        user = Users.objects.get(pk=pk)
        for key, value in data.items():
            setattr(user, key, value)
        user.save()
        user = model_to_dict(user)
        return JsonResponse({'code': 200, 'message': 'updated', 'data': user}, status=200)

用postman測試一下。

image-20201108205918958

可以看到更新成功了。

DELETE

刪除一條數據,刪除數據和更新數據一樣,都需要指定具體的數據,避免胡刪除。

    def delete(self, request, pk=0):
        user = Users.objects.get(pk=pk)
        user.delete()
        return JsonResponse({'code': 204, 'message': 'deleted'}, status=204)

使用postman測試一下。

image-20201108210255488

可以看到成功刪除了。因為我剛才把兩個都刪除了。我們重新請求一下全部的數據。

image-20201108210450312

本篇的代碼片段就到此結束了。

后記

django里面的東西太多,基礎差,學起來很費勁,這篇就做個臨時的記錄把。以后回顧的時候有東西參考。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM