zoukankan      html  css  js  c++  java
  • django中的restful规范

    基于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组件的子路由:api/url.py
    from django.conf.urls import url
    
    from . import views
    urlpatterns = [
        url(r'^books/', views.Book.as_view()),
        url(r'^books/(?P<pk>.*)/$', views.Book.as_view()),
    ]
    
    模型层:model.py
    from django.db import models
    
    class Book(models.Model):
        title = models.CharField(max_length=64)
        price = models.DecimalField(max_digits=5, decimal_places=2)
    
        class Meta:
            db_table = 'book'
            verbose_name = '书籍'
            verbose_name_plural = verbose_name
    
        def __str__(self):
            return '《%s》' % self.title
    
    后台层:admin.py
    from django.contrib import admin
    
    from . import models
    
    admin.site.register(models.Book)
    
    数据库迁移
    python manage.py makemigrations
    python manage.py migrrate
    
    python manage.py createsuperuser  # 创建管理员
    
    视图层:views.py
    from django.http import JsonResponse
    
    from django.views import View
    from . import models
    
    
    # 六大基础接口:获取一个 获取所有 增加一个 删除一个 整体更新一个 局部更新一个
    class Book(View):
        def get(self, request, *args, **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()
                if book_dic:
                    return JsonResponse({
                        'status': 0,
                        'msg': 'ok',
                        'results': book_dic
                    }, 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方式数据兼容最好
        def post(self, request, *args, **kwargs):
            # 前台通过urlencoding方式提交数据
            try:
                book_obj = models.Book.objects.create(**request.POST.dict())
                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})
    

    DRF简介

    DRF从本质上来讲, 它就是一个Django的App, 有了这样一个App, 我们就可以更好的设计出符合RESTful规范的web应用. 虽然实际上, 即便没有DRF, 我们也能够自行设计出符合RESTful规范的web应用, 就如上面的例子所示.

    DRF安装

    pip3 install djangorestframework
    

    DRF框架规矩的封装风格

    from rest_framework.views import APIView					   # 基础的View视图
    from rest_framework.response import Response  	     			# 基础的响应 
    from rest_framework.request import Request		     			# 请求组件
    from rest_framework.serializers import Serializer			 	# 序列化模块
    from rest_framework.settings import APISettings      			# 默认配置文件
    from rest_framework.filters import SearchFilter       			# 过滤组件
    from rest_framework.pagination import PageNumberPagination       # 分页器组件
    from rest_framework.authentication import TokenAuthentication    # 认证组件
    from rest_framework.permissions import IsAuthenticated   		#  权限组件
    from rest_framework.throttling import SimpleRateThrottle         # 频率组件
    
    class Test(APIView):
        def get(self, request, *args, **kwargs):
            return Response('drf get ok')
    

    DRF请求生命周期

    """
    1) 请求走的是APIView的as_view函数
    
    2) 在APIView的as_view调用父类(django原生)的as_view,还禁用了 csrf 认证
    
    3) 在父类的as_view中dispatch方法请求走的又是APIView的dispatch
    
    4) 完成任务方法交给视图类的请求函数处理,得到请求的响应结果,返回给前台
    """
    
  • 相关阅读:
    编译原理-第二章 一个简单的语法指导编译器-2.4 语法制导翻译
    编译原理-第二章 一个简单的语法指导编译器-2.3 语法定义
    编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析
    LeetCode 1347. Minimum Number of Steps to Make Two Strings Anagram
    LeetCode 1348. Tweet Counts Per Frequency
    1349. Maximum Students Taking Exam(DP,状态压缩)
    LeetCode 1345. Jump Game IV(BFS)
    LeetCode 212. Word Search II
    LeetCode 188. Best Time to Buy and Sell Stock IV (动态规划)
    LeetCode 187. Repeated DNA Sequences(位运算,hash)
  • 原文地址:https://www.cnblogs.com/yscl/p/11930523.html
Copyright © 2011-2022 走看看