DRF入门-前期准备

166 阅读7分钟

为什么需要学习Django REST framework,直接使用Django开发不就好了,所以在开始学习之前需要了解两个知识点

  • 前后端分离
  • RESTful规范

前后端分离和不分离区别

分离:

  • 用户访问URL
  • 执行视图函数,视图进行业务处理
  • 视图render,读取HTML模块+数据渲染,将渲染完成的HTML/CSS/JS返回并呈现在用户浏览器上。

早期的全干工程师就这么干,什么是全干工程师标准的说法就是全栈工程师,就是前端自己写,后端自己写,服务器自己管,项目从开始到结束上线整套流程都是自己写。什么都干,我一般就是叫全干,什么都干工程师。

不分离

  • 一般基于 Vue.js、React.js、Angular.js 框架来编写前端页面(本质上是HTML、CSS、JS)。
  • 页面上如果需要呈现数据,则需要则需要通过 ajax 的形式向后端发送请求(URL)并获取数据。
  • 后端接收到请求后,执行视图函数并进行业务处理
  • 后端的视图执行完毕后,给前端返回JSON格式数据。
  • 前端接收到JSON格式数据后呈现在浏览器上即可。

分工合作模式

  • 前端,写HTML、CSS、JS(数据都是通过调用后端API获得)
  • 后端,写API接口
  • 前后端约定好接口的规则。

为什么要使用前后端分离?

目前企业一般都会采用前后端分离的形式来进行项目开发,这种模式:

  • 前后端职责清晰,前端开发者只Vue.js、React.js、Angular.js等框架编写页面;后端开发者只用Python编写后端代码;(两者通过json格式请求数据的传输)。
  • 开发高效,前后端做自己擅长的领域且使用Vue.js等前端框架比用传统的HTML、CSS、JS、jQuery等开发速度快很多。
  • 有利于项目的扩展(开发APP、微信小程序等)。

RESTful规范

现在咱们大家知道前端后端分离的项目是需要:前端、后端 双方来进行合作开发,既然合作进行开发就必须要提前约定一些规范,以防止双方”打架“。

RESTful是主流的一套API规范,企业进行前后端分离开发一般都会遵循它,他定义了很多规范的条款。

HTTPS协议

建议使用https协议替代http协议,让接口数据更加安全。

这一条其实与开发无关,在最后的项目部署时只要使用https部署即可。

域名

对于后端API接口中要体现API标识,例如:

版本

对于后端API接口中要体现版本,例如:

- http://api.example.com/v1/

- http://api.example.com/?version=v1

- http://v1.example.com/

- http://api.example.com/
  请求头:Accept: application/json; version=v1

路径

restful API这种风格中认为网络上的一切都称是资源,围绕着资源可以进行 增删改查等操作。

这些资源,在URL中要使用名词表示(可复数),围绕着资源进行的操作就用Method不同进行区分。

https://api.example.com/v1/person
https://api.example.com/v1/zoos
https://api.example.com/v1/animals
https://api.example.com/v1/employees

请求方法

根据请求方法不同进行不同的操作。

GET		在服务器取出资源(一项或多项)
POST	在服务器新建一个资源
PUT		在服务器更新资源(客户端提供改变后的完整资源)
PATCH	在服务器更新资源(客户端提供改变的属性)
DELETE	在服务器删除资源

搜索条件

在URL中通过参数的形式来传递搜索条件。

https://api.example.com/v1/users?limit=10		指定返回记录的数量
https://api.example.com/v1/users?offset=10		指定返回记录的开始位置
https://api.example.com/v1/users?page=2&per_page=100	指定第几页,以及每页的记录数
https://api.example.com/v1/users?sortby=name&order=asc	指定返回结果按照哪个属性排序,以及排序顺序
https://api.example.com/v1/users?animal_type_id=1	指定筛选条件

返回数据

针对不同操作,服务器向用户返回的结果结构应该不同。

URL方法描述返回数据
/users/GET列表返回资源对象的列表 [ {id:1,name:"隆海"}, {id:1,name:"晚生"} ]
/users/POST添加返回新生成的资源对象 {id:1,name:"隆海"}
/users/(\d+)/GET获取单条数据返回单个资源对象 {id:1,name:"隆海"}
/users/(\d+)/DELETE删除数据返回一个空文档 null
/users/(\d+)/PUT更新数据返回完整的资源对象 {id:1,name:"隆海"}
/users/(\d+)/PATCH局部更新返回完整的资源对象 {id:1,name:"隆海"}

一般在实际的开发过程中会对上述返回数据进行补充和完善,例如:每次请求都返回一个字典,其中包含:

  • code,表示返回码,用于表示请求执行请求,例如:0表示请求成功,1003表示参数非法,40009数据量太大等。
  • data,表示数据
  • error,错误信息

状态码

后端API在对请求进行响应时,除了返回数据意外还可以返回状态码,来表示请求状况。

常用状态码

200 OK - [GET]:服务器成功返回用户请求的数据
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作。
401 Unauthorized - [*]:表示用户未认证(令牌、用户名、密码错误)。
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作。
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

更多看这里:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html

状态码可以表示一部分的服务端的处理请求,但特别细致的信息无法全都都包括,所以一般在开发中会配合code返回码来进行。 例如:developers.weixin.qq.com/doc/offiacc…

错误处理

错误处理,状态码是4xx时,应返回错误信息,error当做key。

{
    error: "Invalid API key"
}

Django REST framework

django-rest-framework是django实现前后端分离项目的一个重要的框架,简称DRF。可以帮助您快速开发基于restfull规范的API后台接口。

官方地址:www.django-rest-framework.org/#installati…

项目初始化

打开PyCharm新建一个python项目,使用PyCharm直接新建Django项目,使用的是最新的Django版本,很多库可能还没能适配,建议指定安装自己熟悉的Django版本,使用此方法:

image.png 安装Django3.2

pip install django==3.2 -i https://pypi.douban.com/simple/ 

安装DRF

 pip install djangorestframework -i https://pypi.douban.com/simple/

新建项目drf

 django-admin startproject tg_drf .  

新建APP名为api

 django-admin startapp api      

注册APPsettings.py

INSTALLED_APPS = [
    # 'django.contrib.admin',
    # 'django.contrib.auth',
    # 'django.contrib.contenttypes',
    # 'django.contrib.sessions',
    # 'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'api.apps.ApiConfig',
]

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    # 'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    # 'django.contrib.auth.middleware.AuthenticationMiddleware',
    # 'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]


TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                # 'django.contrib.auth.context_processors.auth',
                # 'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]

REST_FRAMEWORK = {
    'UNAUTHENTICATED_USER': None
}

配置PyCharm快速启动

image.png

image.png

image.png

image.png

image.png

配置完成

image.png

测试项目

设置URL

from django.urls import path
from api import views

urlpatterns = [
    path('home/', views.HomeView.as_view(),name='home'),
]

视图Views

from rest_framework.views import APIView
from rest_framework.response import Response


class HomeView(APIView):

    def get(self, request, *args, **kwargs):
        return Response({'status': 0, 'msg': 'get请求成功'})

    def post(self, request, *args, **kwargs):
        return Response({'status': 0, 'msg': 'post请求成功'})

    def put(self, request, *args, **kwargs):
        return Response({'status': 0, 'msg': 'put请求成功'})

    def delete(self, request, *args, **kwargs):
        return Response({'status': 0, 'msg': 'delete请求成功'})

POSTMAN测试

image.png

image.png

image.png

image.png

因今天调试了好几个项目,端口占用了报错,但更换端口号为8003 错误如下:

image.png postman测试也有这个问题,换了端口号即可

image.png

下期预告

DRF的权限认证