zoukankan      html  css  js  c++  java
  • drf基础知识01

    drf框架

    """
    接口:
    接口规范:
    drf生命周期:
    序列化组件:
    三大认证组件:
    过滤、筛选、排序、分页组件:
    请求、响应、解析、异常模块:
    jwt:
    """
    
    """
    http协议
    	应用层协议
    	请求与响应规范:首行 - 头 - 体
    	特点:无状态、无连接、请求永远是客户端到服务器端、ssl
    	
    wsgi协议
    	原生django启动项目 - 启动了server socket - wsgiref - uWSGI(项目上线)
    	规定数据的解析方式:
    		get数据、post数据(数据数据) => request => 回调的视图函数
    		返回响应对象 - HTTPResponse类对象 - 数据、响应状态码
    """
    

    接口

    """
    url链接:http://api.oldboy.com/login/
    请求方式:get | post | put ...
    请求参数:username | password
    响应结果:result | data
    """
    
    """
    url链接如何书写、请求到底采用什么方式、规定哪些参数是必传或是选填、到底响应什么数据 => 接口规范
    """
    

    restful接口规范

    """
    1)一般都采用安全协议(接口都是操作数据的):https
    
    2)体现接口的关键字:api
    	https://api.oldboy.com
    	https://www.oldboy.com/api
    
    3)接口操作的数据称之为资源:采用资源名称的复数
    	https://api.oldboy.com/books/
    	https://api.oldboy.com/users/
    
    4)接口链接中不出现操作资源的动词,通过请求方式来决定操作资源的动作
    	https://api.oldboy.com/books/
    	get:获取所有 | post:增加一个 
    	https://api.oldboy.com/books/(?P<pk>)/
    	get:获取一个 | put:整体修改一个(patch:局部修改一个) | delet:删除一个
    
    5)资源数据有多版本时,接口可以做版本控制
    	https://api.oldboy.com/books/v1/
    	https://api.oldboy.com/v2/books/
    	
    6)资源响应的限制条件:筛选、排序、限制...
    	https://api.oldboy.com/books/?publish=1&ordering=-price&limit=3
    	
    7)响应状态码
    	网络状态码:2xx | 3xx | 4xx | 5xx
    	数据状态码(约定的):0 | 1 | 2
    	{
    		'status': 1,
    	}
    	-- SUCCESS(0, "查询成功")
    	-- NODATA(1, "非正确,无数据,显示基本信息")
    	-- FEAILED(2, "查询失败")
    
    8)响应结果的信息描述:
    	{
    		'status': 1,
    		'msg': 'login failed'
    	}
    
    9)响应的结果:get所有:所有资源 | get一个:一个资源 | post、put、patch:新增、修改的资源 | delete:不做任何返回
    	{
    		'status': 0,
    		'msg': 'ok',
    		'results': [登录的用户对象序列化结果]
    	}
    	
    10)响应结果中有二次资源(用户头像:图片链接,用户详情:详情接口)
    	要表明请求二次资源的接口
    
    注:通过 接口文档 告诉前台传递的必要和选填参数
    """
    

    百度测试接口

    安装postman
    https://www.getpostman.com/downloads/
    
    测试接口
    method: GET
    url: https://api.map.baidu.com/place/v2/search
    params:
    	ak: 6E823f587c95f0148c19993539b99295
    	region: 上海
    	query: 肯德基
    	output: json
    

    原生Django实现接口

    创建Django项目并设置默认app名为api,完成路由分发
    # 主路由
    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应用下的子路由
    from django.conf.urls import url
    from . import views
    urlpatterns = [
        # as_view() 本质拿到 view函数地址,
        # view内部通过dispatch分发请求给具体的(get|post|delete)方法处理请求
        # 处理完后的响应结果会一层层返回
        url(r'^books/$', views.BookView.as_view()),
        url(r'^books/(?P<pk>.*)/$', views.BookView.as_view()),
    ]
    
    模型层:models.py
    from django.db import models
    class Book(models.Model):
        name = models.CharField(max_length=64)
        price = models.DecimalField(max_digits=5, decimal_places=2)
        class Meta:
            db_table = 'old_boy_book'
            verbose_name = '书籍'
            verbose_name_plural = verbose_name
        def __str__(self):
            return self.name
    
    数据库迁移
    >: python manage.py makemigrations
    >: python manage.py migrate
    
    后台管理:admin.py
    from django.contrib import admin
    from . import models
    admin.site.register(models.Book)
    admin.site.register(models.User)
    
    # 创建超级用户
    # >: python manage.py createsuperuser
    
    视图层:views.py
    from django.views import View
    from django.http import JsonResponse
    from . import models
    class BookView(View):
        def get(self, request, *args, **kwargs):
            pk = kwargs.get('pk')
            if pk:  # 通过是否有主键决定获取单个或是全部资源
                book_dic_list = models.Book.objects.filter(pk=pk).values('name', 'price')
                if not book_dic_list:
                    return JsonResponse({
                        'status': 2,
                        'msg': 'pk值有误',
                        'results': {}
                    })
                return JsonResponse({
                    'status': 0,
                    'msg': 'ok',
                    'results': book_dic_list[0]
                })
    
            book_dic_list = models.Book.objects.all().values('name', 'price')
            if not book_dic_list:
                return JsonResponse({
                    'status': 2,
                    'msg': '无数据',
                    'results': {}
                })
            return JsonResponse({
                'status': 0,
                'msg': 'ok',
                'results': list(book_dic_list)
            })
    

    视图层回顾

    视图:models.py
    class User(models.Model):
        SEX_CHOICES = [
            (0, '男'),
            (1, '女'),
            (2, '哇塞')
        ]
        username = models.CharField(max_length=64)
        password = models.CharField(max_length=64)
        sex = models.IntegerField(choices=SEX_CHOICES, default=0)
        # 需要配置media工作目录与路由
        icon = models.ImageField(upload_to='icon', default='/icon/default.png')
        class Meta:
            db_table = 'old_boy_user'
            verbose_name = '用户'
            verbose_name_plural = verbose_name
    
        def __str__(self):
            return self.username
    
    media工作目录:settings.py
    # MEDIA_URL = '/media/'
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    
    路由:主urls.py
    from django.conf.urls import url, include
    from django.contrib import admin
    
    from django.views.static import serve
    from django.conf import settings
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^api/', include('api.urls')),
        url(r'^media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT})
    ]
    

    drf框架

    安装
    >: pip3 install djangorestframework
    
    配置:settings.py
    # 注册drf app
    NSTALLED_APPS = [
        # ...
        'rest_framework',
    ]
    
    特点:
    # 具体功能在具体模块下
    from rest_framework.request import Request
    from rest_framework.response import Response
    from rest_framework.exceptions import APIException
    from rest_framework.filters import OrderingFilter
    from rest_framework.views import APIView
    from rest_framework.pagination import PageNumberPagination
    from rest_framework.settings import APISettings
    
    # 自定义drf配置 - 在自己的settings.py
    REST_FRAMEWORK = {
        # 自定义修改drf的配置们
    }
    

    原生Django CBV 源码分析:View

    """
    1)as_view()是入口,得到view函数地址
    2)请求来了调用view函数,内部调用dispatch函数完成请求分发
    3)dispatch函数将请求方式映射成视图类的同名方法,完成请求的处理,得到相应
    4)再将相应的结果一层层返回
    """
    

    drf CBV 源码分析:APIView

    """
    1)as_view()是入口,得到view函数地址,在范围view函数地址时局部禁用csrf认证
    2)请求来了调用view函数,内部调用(APIView类的)dispatch函数完成请求分发
    3)dispatch函数 二次封装request、完成三大认证后,再将请求方式映射成视图类的同名方法,完成请求的处理,得到相应,再对相应做渲染处理
    4)再将相应的结果一层层返回
    """
    

    响应渲染模块:json和浏览器接口页面

    # 入口:APIView类的dispatch函数
    self.response = self.finalize_response(request, response, *args, **kwargs)
    ->
    neg = self.perform_content_negotiation(request, force=True)
    ->
    renderers = self.get_renderers()
    ->
    self.renderer_classes
    ->
    APISetting:DEFAULT_RENDERER_CLASSES
    
    局部配置
    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    from rest_framework.renderers import JSONRenderer
    from rest_framework.renderers import BrowsableAPIRenderer
    class UserAPIView(APIView):
        # 局部配置:只有该视图类起作用
        renderer_classes = [JSONRenderer]  # 只提供JSON数据渲染
        pass
    
    全局配置
    # drf配置
    REST_FRAMEWORK = {
        # 响应的渲染模块
        'DEFAULT_RENDERER_CLASSES': [
            'rest_framework.renderers.JSONRenderer',
            'rest_framework.renderers.BrowsableAPIRenderer',
        ],
    }
    

    请求数据解析模块:json、form-data、urlencoding

    # 入口:APIView类的dispatch函数
    request = self.initialize_request(request, *args, **kwargs)
    ->
    parsers=self.get_parsers()
    ->
    self.parser_classes
    ->
    APISetting:DEFAULT_PARSER_CLASSES
    
    局部配置
    from rest_framework.views import APIView
    from rest_framework.response import Response
    
    from rest_framework.parsers import JSONParser
    from rest_framework.parsers import FormParser
    from rest_framework.parsers import MultiPartParser
    class UserAPIView(APIView):
        # 局部配置:只有该视图类起作用
        parser_classes = [JSONParser]  # 只提供JSON解析
        pass
    
    全局配置
    # drf配置
    REST_FRAMEWORK = {
        # 响应的渲染模块
        'DEFAULT_RENDERER_CLASSES': [
            'rest_framework.renderers.JSONRenderer',
            'rest_framework.renderers.BrowsableAPIRenderer',
        ],
        # 请求数据解析模块
        'DEFAULT_PARSER_CLASSES': [
            'rest_framework.parsers.JSONParser',  # 'application/json'
            'rest_framework.parsers.FormParser',  # 'application/x-www-form-urlencoded'
            'rest_framework.parsers.MultiPartParser'  # multipart/form-data
        ],
    }
    
    请求数据解析位置
    # 请求的数据包:均解析到 request.data 中
    # 请求的?文件参数:均解析到 request.query_params 中
    

    响应模块

    # 响应可以设置响应数据、响应网络状态码、响应头、响应数据类型等
    data = {
        'status': 0,
        'msg': 'get ok',
        'results': [],
        'token': '123.12321.231'
    }
    return Response(
        data=data,
        status=status.HTTP_200_OK,
        headers={'Token': '123as.masd21.asd213sd'},
        content_type='application/json'  # 默认就是application/json
    )
    
  • 相关阅读:
    hdu 2586 How far away ?
    zoj 3195 Design the city
    hust 1022 K-diff subsequence
    poj 2253 Frogger
    poj 1470 Closest Common Ancestors
    poj 2553 The Bottom of a Graph
    poj 1236 Network of Schools
    poj 3694 Network
    uva 10131 Is Bigger Smarter ? (简单dp 最长上升子序列变形 路径输出)
    2014年百度之星程序设计大赛
  • 原文地址:https://www.cnblogs.com/plf-Jack/p/11448541.html
Copyright © 2011-2022 走看看