Published in:2024-10-24 |

drf-day1

1. 前置知识

前后端分离

  1. 后端为前端返回对应的数据,不再处理数据的渲染,不再控制前端样式的改变
  2. 无论前端是app还是web网站,对于后端来说没有区别
  3. 前后端分离模式下,不再有render|redirect, 对外一律提供API数据(json|xml)
  4. 前后端两个独立的项目全部通过ajax请求进行交互

1603763435043

接口API

API是一些预先定义的函数,或指软件系统不同组成部分衔接的约定  用来提供应用程序与开发人员基于某软件或硬件得以访问一组数据的能力,而又无需访问源码,或理解内部工作机制的细节。

  1. 接口在web开发中指的是由url地址、请求参数、响应数据所构成
  2. 接口是web开发中前后端工程师进行数据交互的媒介

RESTFul架构

在长期的前后端分离的开发模式下,为了提高开发效率,大家都默认遵从了一种REST规范,它提供了一套良好的定义接口的格式

1
2
1. RESTFul架构是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则与约束条件。不是必须遵从的,但有了它以后可以更好的开发出简洁、逻辑清晰的接口
2. 只要遵从了REST规范设计的软件就是RESTFul架构

REST规范

核心目的: 设计出更优雅的url

  • API与用户通信的协议尽量使用HTTPS
  • 每一个url用来标识一个唯一的资源
1
2
传统url: https://127.0.0.1:8000/user/get_user/?id=3   获取用户id为3的用户信息
rest url: https://127.0.0.:8000/user/get_user/1/ 代表用户id为1的用户
  • 请求方法
1
2
3
4
5
1. GET:  从服务器获取资源   查询
2. POST: 在服务器新增资源 添加
3. DELETE: 从服务器删除资源 删除
4. PUT: 更新服务器资源 修改
5. PATCH: 更新部分资源 局部修改
  • 状态码
1
2
3
# 每一个http请求都会返回对应的信息, 而RESTFul要求在返回数据时提供本次请求的状态码
# 返回的数据格式有一定的要求
# 包含请求信息
  • 接口API的本质
1
2
3
4
5
# RESTFul是为了设计一个良好的接口,而大家都遵从默认的规范会节省大量的事件
1. 后端接收一个包含参数的url
2. 解析参数,并对请求做相应的处理
3. 将处理后的结果序列化成json
4. 按照一定的格式返回前端

2. 工具使用

postman使用

1603768356861

csrf装饰器

1
2
3
4
5
6
7
8
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt, csrf_protect

@csrf_protect # 为某个函数视图单独添加csrf认证
@csrf_exempt # 为某个函数视图免除csrf认证

@method_decorator(csrf_exempt, name="dispatch") # 为类视图免除csrf认证
@method_decorator(csrf_protect, name="dispatch") # 为类视图添加csrf认证

Django的admin站点

1
2
3
4
5
# python manage.py createsuperuser
# 输入用户名
# 输入邮箱 邮箱格式必须正确
# 输入两次密码 必须一致
浏览器输入url访问后台站点

3. Django开发API接口

接口开发

  • url
1
2
3
4
5
6
7
urlpatterns = [
path("users/", views.user),

# 类视图的url定义
path("user_view/", views.UserView.as_view()),
path("user_view/<str:id>/", views.UserView.as_view()),
]
  • views
  1. 可以根据前端发送的不同的http请求来匹配到Django类视图中定义的不同的函数
  2. url路由中的参数可以使用kwargs.get(“参数名”)的形式接受
  3. 接口在返回数据的时候需要指定数据的格式以及状态码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
@method_decorator(csrf_exempt, name="dispatch")  # 为类视图免除csrf认证
class UserView(View):

def get(self, request, *args, **kwargs):
"""
提供查询单个用户以及 多个用户的接口
:param request: 请求对象
:param args:
:param kwargs:
:return: 返回查询结果
"""
user_id = kwargs.get("id")

if user_id:

user_val = User.objects.filter(pk=user_id).values("username", "password", "gender").first()
print(user)
if user:
# 如果查询出用户的信息, 则返回到前端
return JsonResponse({
"status": 200,
"message": "查询单个用户成功",
"results": user_val
})
else:
# 用户id不存在 则代表查询所有用户信息
user_objects_all = User.objects.all().values("username", "password", "gender")
if user_objects_all:
return JsonResponse({
"status": 200,
"message:": "查询所有用户成功",
"results": list(user_objects_all)
})

return JsonResponse({
"status": 400,
"message": "查询用户失败",
})

def post(self, request, *args, **kwargs):
"""
新增单个用户
"""

username = request.POST.get("username")
pwd = request.POST.get("password")

try:
user_obj = User.objects.create(username=username, password=pwd)
return JsonResponse({
"status": 200,
"message": "新增单个用户成功",
"results": {"username": user_obj.username, "gender": user_obj.gender}
})

except:
return JsonResponse({
"status": 400,
"message": "新增失败",
})

Django类视图源码

1603780819949

4. DRF初识

DRF全称DjangoRestFrameWork, 是一个灵活强大工具包,主要用来构建RESTFUl风格的web API, 它是django生态中默认的前后端分离的开发标准

官网: https://www.django-rest-framework.org/

GitHhub地址: https://github.com/encode/django-rest-framework/tree/master

DRF 的搭建

1
2
3
4
5
6
7
8
9
10
11
# DRF 需要以下版本的支持
Python(3.5、3.6、3.7、3.8、3.9)
Django(2.0、2.2、3.0、3.1)
# 安装DRF
pip install djangorestframework==3.10.0

# 配置DRF
INSTALLED_APPS = [
...
'rest_framework',
]

1603783294510

DRF的第一个案例

1

DRF请求的声明周期

  1. DRF同样是在url中的as_view作为入口, 执行的是APIView中的as_view
  2. APIView类中的as_view方法中调用了父类(django)的as_view方法, APIView返回了一个禁用了csrf的视图
  3. 在父类的as_view方法中调用了self.dispatch()方法进行了请求的分发。由于子类自己实现了dispatch方法,所以此时调用的是子类自己的dispatch()方法
  4. DRF的dispatch方法进行了额外的功能的实现
  5. 完成处理后再将情笔趣交给类视图进行逻辑,得到响应的结果后返回到前台.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# DRF的核心方法
def dispatch(self, request, *args, **kwargs):
"""
`.dispatch()` is pretty much the same as Django's regular dispatch,
but with extra hooks for startup, finalize, and exception handling.
"""
# 将参数赋值给实例化对象 StudentAPIView
self.args = args
self.kwargs = kwargs
# DRF的请求模块 处理drf请求相关
request = self.initialize_request(request, *args, **kwargs)
self.request = request
self.headers = self.default_response_headers # deprecate?

try:
# 三大认证模块
self.initial(request, *args, **kwargs)

# Get the appropriate handler method
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(),
self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed

response = handler(request, *args, **kwargs)

except Exception as exc:
#异常的捕获 一旦发生异常将在此处理
response = self.handle_exception(exc)

# 响应模块
self.response = self.finalize_response(request, response, *args, **kwargs)
return self.response

作业

1
2
3
4
5
1. 掌握django类视图开发接口
查询单个 查询所有 新增单个
删除单个 (选做)
2. 掌握django类视图的请求流程
3. 掌握DRF视图的请求流程
Prev:
Next: