新建一个restapi项目,然后配置好数据库,添加一个index路由用来测试项目。

restful API接口

传输数据使用json,以为着返回数据也为json,并且开头尽量以api开头,或者以api为域名。

新建api应用

python manage.py startapp api
新建api应用

在api应用内新建urls.py:

from django.conf.urls import url
from api import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
]

views:

from django.http import JsonResponse
from django.shortcuts import render


def index(request):
    # json数据使用字典
    data = {
        'status': 200,
        'msg': 'ok',
    }
    return JsonResponse(data=data)

注册urls.py:

from django.conf.urls import url, include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^app/', include('App.urls', namespace='app')),
    url(r'^api/', include('api.urls', namespace='api')),
]

api中models.py中建立模型(迁移应用模型,需要在settiongs中注册):

from django.db import models


class Book(models.Model):
    b_name = models.CharField(max_length=32)
    b_price = models.FloatField(default=1)

api中的urls添加book路由:

from django.conf.urls import url
from api import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'books/', views.book, name='books'),
]

views中:
我们对书有如下操作:

  • 获取书的列表(get)
  • 创建一本书(post)

创建一本书,我们需要从用户的post请求中提取书的信息,然后创建模型存储,然后返回书的字典信息,但是这里django和flask将模型转化成字典信息比较麻烦,需要在models.py中定义方法去返回
models.py:

from django.db import models


class Book(models.Model):
    b_name = models.CharField(max_length=32)
    b_price = models.FloatField(default=1)
    
    def to_dict(self):
        return {'id': self.id, 'b_name': self.b_name, 'b_price': self.b_price}

views:

from django.http import JsonResponse
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt

from api.models import Book


def index(request):
    # json数据使用字典
    data = {
        'status': 200,
        'msg': 'ok',
    }
    return JsonResponse(data=data)

@csrf_exempt
def book(request):
    if request.method == 'GET':
        pass
    elif request.method == 'POST':  # 创建一本书
        # 从前端获取POST请求中的书名,价钱
        b_name = request.POST.get('b_name')
        b_price = request.POST.get('b_price')

        # 获取完信息之后,新建Book对象进行存储
        book = Book()
        book.b_name = b_name
        book.b_price = b_price
        book.save()

        # 然后返回json数据,这里比较麻烦的是将模型变成字典数据
        data = {
            'status': 201,
            'mag': 'add success',
            'data': book.to_dict()
        }
        return JsonResponse(data=data)

接下来我们使用测试rest请求的工具——TEST RESTful Web Server:

我们也可以用浏览器中的插件postman的来测试:

类似的工具还有httpie

接下来我们测试get请求:

获取所有的书

views:

    if request.method == 'GET':
        books_list = Book.objects.all() # 这个只是一个查询集,不符合json的格式

        books_list_json = []    # 将查询集转化成列表
        for book in books_list:
            books_list_json.append(book.to_dict())

        data = {
            'status': 200,
            'msg': 'ok',
            'data': books_list_json
        }
        return JsonResponse(data=data)

查询单个的书

url:

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^books/&', views.books, name='books'),
    url(r'^books/(?P<bookid>\d+)/', views.book, name='book'),
]

views:

@csrf_exempt
def book(request, bookid):
    if request.method == 'GET':
        book_obj = Book.objects.get(pk=bookid)

        data = {
            'msg': 'ok',
            'status': 200,
            'data': book_obj.to_dict()
        }
        
        return JsonResponse(data=data)

测试:

删除一本书

views:

@csrf_exempt
def book(request, bookid):
    if request.method == 'GET':
        book_obj = Book.objects.get(pk=bookid)

        data = {
            'msg': 'ok',
            'status': 200,
            'data': book_obj.to_dict()
        }
        return JsonResponse(data=data)
    elif request.method == 'DELETE':
        book_obj = Book.objects.get(pk=bookid)
        book_obj.delete()

        data = {
            'msg': 'delete success',
            'status': 204,
            'data': {}
        }
        return JsonResponse(data=data)
最后修改:2024 年 03 月 13 日
如果觉得我的文章对你有用,请随意赞赏