Skip to content

Commit 5b9f297

Browse files
committed
N fix
1 parent cc1b078 commit 5b9f297

File tree

3 files changed

+35
-31
lines changed

3 files changed

+35
-31
lines changed

md/40-序列化器与视图函数.md

+17-17
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
## ModelSerializer
22

3-
上一章我们写了一个简单的序列化类
3+
上一章我们借助 DRF 库,写了一个简单的序列化器
44

55
```python
66
class ArticleListSerializer(serializers.Serializer):
@@ -11,9 +11,9 @@ class ArticleListSerializer(serializers.Serializer):
1111
updated = serializers.DateTimeField()
1212
```
1313

14-
这个序列化器类长得跟 `Form` 或者 `Model` 也太像了,甚至感觉代码都重复了。如果能再简化一下就更好了。
14+
这个序列化器长得跟 `Form` 或者 `Model` 也太像了,甚至感觉代码都重复了。如果能再简化一下就更好了。DRF 也考虑到了这一点,提供了现成的解决方案,也就是 `ModelSerializer`
1515

16-
DRF 已经替你考虑好了,也就是 `ModelSerializer` 了。将序列化类修改为下面这样
16+
将序列化器修改为下面这样
1717

1818
```python
1919
# article/serializers.py
@@ -32,7 +32,7 @@ class ArticleListSerializer(serializers.ModelSerializer):
3232
]
3333
```
3434

35-
`ModelSerializer` 也是一个常规的序列化器(与上一章的 `Serializer` 类似),不同的是它额外做了些工作:
35+
`ModelSerializer` 的功能与上一章的 `Serializer` 基本一致,不同的是它额外做了些工作:
3636

3737
- 自动推断需要序列化的字段及类型
3838
- 提供对字段数据的验证器的默认实现
@@ -62,11 +62,11 @@ class ArticleListSerializer(serializers.ModelSerializer):
6262
]
6363
```
6464

65-
很简洁的达到了预期的功能
65+
可以看到 Json 数据仅包含 `fields` 中规定的字段了
6666

6767
## APIView
6868

69-
除了对序列化器的支持以外,`REST framework` 库还提供了对视图的扩展,以便视图更好的为接口服务。
69+
除了对序列化器的支持以外,DRF 还提供了对视图的扩展,以便视图更好的为接口服务。
7070

7171
将文章的视图修改为如下:
7272

@@ -93,32 +93,32 @@ def article_list(request):
9393
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
9494
```
9595

96-
主要的变化
96+
主要的变化如下
9797

98-
- `@api_view` 装饰器将视图允许接收 `GET``POST` 请求,以及提供如 `405 Method Not Allowed` 等默认实现,以便在不同的请求下进行正确的响应。
98+
- `@api_view` 装饰器允许视图接收 `GET``POST` 请求,以及提供如 `405 Method Not Allowed` 等默认实现,以便在不同的请求下进行正确的响应。
9999
- 返回了 `Response` ,该对象由 Django 原生响应体扩展而来,它可以根据**内容协商**来确定返回给客户端的正确内容类型。如果数据验证有误,还可以返回适当的状态码以表示当前的情况。
100100

101-
不需要再做别的工作了。让我们刷新文章列表页面
101+
让我们刷新文章列表接口
102102

103103
![](http://blog.dusaiphoto.com/drf-1.png)
104104

105-
出现了可视化的接口界面!不是说好只返回数据吗,这是在搞毛?
105+
出现了可视化的接口界面!不是说好接口只返回数据吗,这是在搞毛?
106106

107107
这就是视图中 `Response` 提供的**内容协商**能力了。也就是说,Django 后端根据客户端请求响应的内容类型不同,自动选择适合的表现形式;浏览器请求资源时,就返回可视化的 HTML 资源表示,其他形式请求时,又可以返回 Json 纯数据的形式。这给开发带来极大的方便。
108108

109109
有同学就问了,那我怎么验证它是不是真的会返回 Json 数据呢?让我们发一个网络请求试试看。
110110

111-
在命令行中发送请求就要推荐 [httpie](https://github.com/jakubroztocil/httpie#installation) 这个库了,基于 Python 并且小巧美观。
111+
在命令行中发送请求,笔者推荐 [httpie](https://github.com/jakubroztocil/httpie#installation) 这个库,基于 Python 并且小巧美观。
112112

113113
重新打开一个命令行,安装方式就是万能的 `pip`
114114

115-
> 安装 httpie 可以在全局,因为 web 项目都可以用得上
115+
> httpie 可以安装在全局
116116
117-
```python
117+
```bash
118118
pip install httpie
119119
```
120120

121-
安装成功后,立马试试在命令行提交一个请求
121+
安装成功后,试试在命令行提交一个请求
122122

123123
```python
124124
C:\...> http http://127.0.0.1:8000/api/article/
@@ -153,7 +153,7 @@ Content-Type: application/json
153153
```python
154154
C:\...> http POST http://127.0.0.1:8000/api/article/ title=PostByJson body=HelloWorld!
155155

156-
156+
# 以下为返回内容
157157
HTTP/1.1 201 Created
158158
...
159159
{
@@ -163,13 +163,13 @@ HTTP/1.1 201 Created
163163
}
164164
```
165165

166-
浏览文章列表、新建文章功能就完成了
166+
浏览文章列表、新建文章接口就完成了
167167

168168
## 注意事项
169169

170170
教程为了简洁,后续发送 web 请求会采用 httpie 为主、可视化页面为辅的方式进行开发测试。
171171

172-
但是使用 httpie 需要一定的学习成本(并且在 Windows 命令行下有符号兼容的坑),**因此本教程的读者更推荐使用 [Postman](https://www.postman.com/downloads/)**,可视化界面,会点鼠标就会用,比较方便
172+
但是使用 httpie 需要一定的学习成本(并且在 Windows 命令行下有符号兼容的坑),**因此本教程的读者更推荐使用 [Postman](https://www.postman.com/downloads/)**,可视化界面,会点鼠标就会用,很方便
173173

174174
> 使用 Postman 时要注意,在 Json 中单双引号含义是不同的,不要混用。
175175

md/50-基于类的视图.md

+9-9
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
传统 Django 中就有基于类的视图的存在,DRF 中自然也有。优点也都差不多,即实现功能的模块化继承、封装,减少重复代码。
2-
3-
前面章节中我们已经有了文章列表的实现了,接下来就用**文章详情**的基于类视图的接口来练练手。
1+
传统 Django 中就有**基于类的视图**的存在,DRF 中自然也有。优点也都差不多,即实现功能的模块化继承、封装,减少重复代码。接下来就用**文章详情**接口来练练手。
42

53
首先在视图中新增下面的代码:
64

@@ -51,9 +49,9 @@ class ArticleDetail(APIView):
5149
...
5250
```
5351

54-
代码不复杂,就是提供了对文章详情的**获取****修改****删除**的 3 个方法,以及 1 个用于获取具体文章 model 的辅助方法。
52+
代码不复杂,就是提供了对文章详情的**获取****修改****删除**的 3 个方法,以及 1 个用于获取具体文章 model 的辅助方法。和之前说的一样,DRF 类视图与传统 Django 的区别,就是多了一个将对象序列化(或反序列化)的步骤。`.delete()` 方法因为不用返回实际数据,执行完删除动作就OK了。
5553

56-
因为文章详情接口需要返回完整的字段数据(与阉割版的文章列表接口不同),所以要重新给它定义一个序列化器:
54+
由于详情接口需要返回完整的字段数据(与阉割版的文章列表接口不同),所以要重新给它定义一个序列化器:
5755

5856
```python
5957
# article/serializers.py
@@ -81,7 +79,9 @@ urlpatterns = [
8179
]
8280
```
8381

84-
这就可以了。在命令行里用 httpie 发送一个请求试试:
82+
这就可以了。
83+
84+
发送一个请求试试:
8585

8686
```python
8787
# 再次提醒:新手读者建议用 Postman 来发送 web 请求
@@ -103,7 +103,7 @@ Content-Type: application/json
103103
}
104104
```
105105

106-
再试试修改文章内容:
106+
再试试修改文章接口:(注意请求方式变成了 `PUT`
107107

108108
```python
109109
> http PUT http://127.0.0.1:8000/api/article/1/ title=something... body=changed...
@@ -133,7 +133,7 @@ Allow: GET, PUT, DELETE, HEAD, OPTIONS
133133

134134
## 通用视图
135135

136-
对数据库的增删改查是几乎每个项目的通用操作,因此可以通过 REST 框架提供的 Mixin 类中轻松复用
136+
对数据的增删改查是几乎每个项目的通用操作,因此可以通过 DRF 提供的 Mixin 类直接集成对应的功能
137137

138138
修改一下 `ArticleDetail` 视图:
139139

@@ -173,7 +173,7 @@ class ArticleDetail(generics.RetrieveUpdateDestroyAPIView):
173173
serializer_class = ArticleDetailSerializer
174174
```
175175

176-
发送请求试试,功能和最开始写的 `APIView` 是完全相同的
176+
发送请求试试,功能和最开头那个继承 `APIView` 的视图是完全相同的
177177

178178
列表接口也可以做同样的修改:
179179

md/60-限制用户权限.md

+9-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
权限是 web 设计中的重要组成部分。没有权限控制,任何人都可以对任何资源进行危险的操作,那就太恐怖了。本章来看看 REST 框架是如何进行权限管理的。
1+
权限是 web 设计中的重要组成部分。没有权限控制,任何人都可以对任何资源进行更改操作,那就太恐怖了。
2+
3+
本章来看看 DRF 中如何进行权限管理。
24

35
## 文章与用户
46

5-
由于要给文章模型添加用户外键,所以首先删除现有的所有文章数据
7+
依靠用户身份来限制权限是比较通用的做法,这就需要给文章模型添加用户外键,确定每篇文章的作者了。保险起见,首先删除现有的所有文章数据
68

7-
修改文章的 model,让每篇文章都对应一个确定的用户
9+
修改文章的 model,让每篇文章都对应一个作者
810

911
```python
1012
# article/models.py
@@ -45,7 +47,7 @@ HTTP/1.1 200 OK
4547

4648
## 权限控制
4749

48-
REST 框架内置了如 `IsAuthenticated``IsAdminUser``AllowAny` 等权限控制类。
50+
DRF 内置了如 `IsAuthenticated``IsAdminUser``AllowAny` 等权限控制类。
4951

5052
由于是个人博客,因此只准许管理员发布文章。修改文章列表视图如下:
5153

@@ -61,6 +63,8 @@ class ArticleList(generics.ListCreateAPIView):
6163
permission_classes = [IsAdminUser]
6264
```
6365

66+
`permission_classes` 可以接收一个列表,因此权限控制类可以设置多个,请求必须满足所有控制条件才允许被放行。
67+
6468
测试一下:
6569

6670
```python
@@ -103,7 +107,7 @@ class IsAdminUserOrReadOnly(permissions.BasePermission):
103107
return request.user.is_superuser
104108
```
105109

106-
自定义的权限类继承了 `BasePermission` 这个基础的父类,并实现了父类中的钩子方法 `def has_permission`方法里简单判断了一下请求的种类是否安全(即对数据不更改的请求类型),如果安全则直接通过,不安全则只允许超级用户通过
110+
自定义的权限类继承了 `BasePermission` 这个基础的父类,并实现了父类中的钩子方法 `def has_permission`方法里简单判断了请求的种类是否安全(即不更改数据的请求),如果安全则直接通过,不安全则只允许管理员用户通过
107111

108112
再次修改视图:
109113

0 commit comments

Comments
 (0)