" name="sm-site-verification"/>
侧边栏壁纸
博主头像
PySuper博主等级

千里之行,始于足下

  • 累计撰写 203 篇文章
  • 累计创建 14 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

Restful API接口规范 | 基于Restful的原生django接口

PySuper
2020-03-02 / 0 评论 / 0 点赞 / 5 阅读 / 7980 字
温馨提示:
所有牛逼的人都有一段苦逼的岁月。 但是你只要像SB一样去坚持,终将牛逼!!! ✊✊✊

Restful API接口规范

接口

  • 接口:联系两个物质的媒介,完成信息交互
  • web程序中:联系前台页面与后台数据库的媒介
  • web接口组成:
    • url:长得像返回数据的url链接
    • 请求参数:前台按照指定的key提供数据给后台
    • 响应数据:后台与数据库交互后将数据反馈给前台

规范

url

响应部分

  • 状态码:返回数据要标准状态码,通过在数据中 {“status”: 200}
    • SUCCESS(“0”, “查询成功”)
    • NODATA(“1xx”, “非正确,无数据,显示基本信息”)
    • FEAILED(“2xx”, “查询失败”)
  • 错误信息:请求失败需要标注错误信息 {“message”: “请求参数不合法”}
  • 操作结果:请求操作成功的返回结果 {“results”: []}
    • get:返回资源列表 | 返回单一资源
    • post:返回单一新增资源
    • put:返回更新的资源
    • patch:返回更新的资源
    • delete:返回空文档
  • 子资源返回资源接口:返回的资源如果有子资源,返回子资源的链接地址,如查找书,书的封面图片就可以url表示

Django Restful接口

url.py

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

urlpatterns = [
    url(r'^admin/', admin.site.urls),

    # 路由分发
    url(r'^api/',include('api.urls')),
]

api./url.py

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

urlpatterns = [
    # get查所有,post添加数据
    url(r'^books/$', views.Book.as_view()),

    # 查一个,删一个,更新(整体,局部)一个
    url(r'^books/(?P<pk>.*)/', views.Book.as_view())
]

model.py

from django.db import models


# Create your models here.
class Book(models.Model):
    title = models.CharField(max_length=64)
    price = models.DecimalField(max_digits=5, decimal_places=2)


class Meta:
    # 表名
    db_table = 'red_book'
    verbose_name = '书籍'
    verbose_name_plural = verbose_name


def __str__(self):
    return self.title

admin.py

from . import models
from django.contrib import admin

admin.site.register(models.Book)

SQL migrate

python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser

views.py

from . import models
from django.views import View
from django.http import JsonResponse


class Book(View):
    """
    view源码中判断wsgiref处理好的request中的请求方式,是GET,还是POST等;
    并自动掉对应的函数方法(通过调度(dispatch)分发请求)
    """
    def get(self, request, *args, **kwargs):
        # GRT请求时,url后拼接的数据放到了request.GET中
        print(request.GET)
        print(kwargs)  # 有名分组的数据被放到kwargs中
        pk = kwargs.get('pk')
        if not pk:  # 群查
            book_obj_list = models.Book.objects.all()
            # 数据信息列表
            book_list = []
            for obj in book_obj_list:
                dic = {}
                dic['title'] = obj.title
                dic['price'] = obj.price
                book_list.append(dic)
            # 响应数据(遵循接口规范:响应状态码, 提示信息, 操作结果)
            return JsonResponse({
                'status': 0,  # 响应状态码
                'msg': 'ok',  # 提示信息
                'results': book_list  # 操作结果
            }, json_dumps_params={'ensure_ascii': False})
        else:  # 单查
            book_dic = models.Book.objects.filter(pk=pk).values('title', 'price').first()
            print(book_dic, type(book_dic))
            if book_dic:
                return JsonResponse({
                    'status': 0,
                    'msg': 'ok',
                    'results': book_dic
                }, json_dumps_params={'ensure_ascii': False})
            return JsonResponse({
                'status': 0,
                'msg': '无结果',
            }, json_dumps_params={'ensure_ascii': False})


def post(self, request, *args, **kwargs):
    print(request.POST)
    print(request.POST.dict())
    print(request.body)
    print(request.FILES)
    # POST请求时的Content-Type有三种:urlencoded,json,formdata
    # urlencoded:将request.body中的二进制数据处理放到对应的request.GET或request.POST中
    # json:数据以二进制形式存放在request.body中不进行处理

    try:
        book_obj = models.Book.objects.create(**request.POST.dict())
        print(book_obj, type(book_obj))
        if book_obj:
            return JsonResponse({
                'status': 0,
                'msg': 'ok',
                'results': {'title': book_obj.title, 'price': book_obj.price}
            }, json_dumps_params={'ensure_ascii': False})
    except:
        return JsonResponse({
            'status': 1,
            'msg': '参数有误',
        }, json_dumps_params={'ensure_ascii': False})
    return JsonResponse({
        'status': 2,
        'msg': '新增失败',
    }, json_dumps_params={'ensure_ascii': False})

postman可以完成不同方式的请求:get | post | put …

postman发送数据包有三种方式:form-data | urlencoding | json

原生django对urlencoding方式数据兼容最好


参考链接:https://www.cnblogs.com/waller/p/11686613.html

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区