更新了部分文档

pull/166/head
jackfrued 2019-05-25 20:32:10 +08:00
parent ce4f2cd0c1
commit 43aa496f32
6 changed files with 22 additions and 4 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@ -231,7 +231,7 @@ urlpatterns = [
启动服务器运行项目,进入首页查看学科信息。
![](/Users/Hao/Desktop/Python-100-Days/Day41-55/res/show-subjects.png)
![](./res/show-subjects.png)
点击学科查看老师信息。
@ -301,4 +301,4 @@ def praise_or_criticize(request):
### 小结
到此为止,这个投票项目的核心功能已然完成,在下一个章节中我们要求用户必须登录才能投票,没有账号的用户可以通过注册功能注册一个账号。
到此为止,这个投票项目的核心功能已然完成,在下面的章节中我们会要求用户必须登录才能投票,没有账号的用户可以通过注册功能注册一个账号。

View File

@ -99,7 +99,7 @@ class RegisterForm(forms.ModelForm):
exclude = ('no', 'regdate')
```
上面我们定义了一个与User模型绑定的表单继承自ModelForm我们排除了用户编号no和注册日期regdate这两个属性并添加了一个repassword属性用来接收从用户表单传给服务器的确认密码。我们在定义User模型时已经对用户名的最大长度进行了限制上面我们又对确认密码的最小和最大长度进行了限制但是这些都不足以完成我们对用户输入的验证。上面以`clean_`打头的方法就是我们自定义的验证规则。很明显,`clean_username`是对用户名的检查,而`clean_password`是对密码的检查。由于数据库二维表中不应该保存密码的原文所以对密码做了一个简单的MD5摘要处理实际开发中这样处理还不太够,因为有被实施反向查表法(利用彩虹表反向查询)破解用户密码的风险。生成MD5摘要的代码如下所示。
上面我们定义了一个与User模型绑定的表单继承自ModelForm我们排除了用户编号no和注册日期regdate这两个属性并添加了一个repassword属性用来接收从用户表单传给服务器的确认密码。我们在定义User模型时已经对用户名的最大长度进行了限制上面我们又对确认密码的最小和最大长度进行了限制但是这些都不足以完成我们对用户输入的验证。上面以`clean_`打头的方法就是我们自定义的验证规则。很明显,`clean_username`是对用户名的检查,而`clean_password`是对密码的检查。由于数据库二维表中不应该保存密码的原文所以对密码做了一个简单的MD5摘要处理实际开发中这样处理还不太够,因为有被实施反向查表法(利用彩虹表反向查询)破解用户密码的风险。为字符串生成MD5摘要的代码如下所示。
```Python
def to_md5_hex(message):
@ -383,6 +383,8 @@ def random_color(start=0, end=255, opacity=255):
return red, green, blue, opacity
```
> 说明上面的代码在生成验证码图片时用到了三种字体文件使用上面的代码时需要添加字体文件到应用目录下的fonts目录中。
下面的视图函数用来生成验证码并通过HttpResponse对象输出到用户浏览器中。
```Python

View File

@ -1,4 +1,20 @@
## Cookie和Session
### 实现用户跟踪
如今,一个网站如果不通过某种方式记住你是谁以及你之前在网站的活动情况,失去的就是网站的可用性和便利性,继而很有可能导致网站用户的流式,所以记住一个用户(更专业的说法叫**用户跟踪**对绝大多数Web应用来说都是必需的功能。
在服务器端我们想记住一个用户最简单的办法就是创建一个对象通过这个对象就可以把用户相关的信息都保存起来这个对象就是我们常说的session用户会话对象。那么问题来了HTTP本身是一个无连接每次请求和响应的过程中服务器一旦完成对客户端请求的响应之后就断开连接、无状态客户端再次发起对服务器的请求时服务器无法得知这个客户端之前的任何信息的协议即便服务器通过session对象保留了用户数据还得通过某种方式来确定当前的请求与之前保存过的哪一个session是有关联的。相信很多人都能想到我们可以给每个session对象分配一个全局唯一的标识符来识别session对象我们姑且称之为sessionid每次客户端发起请求时只要携带上这个sessionid就有办法找到与之对应的session对象从而实现在两次请求之间记住该用户的信息也就是我们之前说的用户跟踪。
要让客户端记住并在每次请求时带上sessionid又有以下几种做法
1. URL重写。所谓URL重写就是在URL中携带sessionid例如`http://www.example.com/index.html?sessionid=123456`服务器通过获取sessionid参数的值来取到与之对应的session对象。
2. 隐藏域(隐式表单域)。在提交表单的时候,可以通过在表单中设置隐藏域向服务器发送额外的数据。例如:`<input type="hidden" name="sessionid" value="123456">`。
3. Cookie。Cookie是保存在浏览器临时文件中的数据每次请求时请求头中会携带本站点的Cookie到服务器那么只要将sessionid写入cookie下次请求时服务器就能够获得这个sessionid。
需要说明的是在HTML5时代要想在浏览器中保存数据除了使用Cookie之外还可以使用新的本地存储API包括localStorage、sessionStorage、IndexedDB等如下图所示。
![](./res/cookie_xstorage_indexeddb.png)
### Django框架对Session的支持

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

View File

@ -94,4 +94,4 @@
- 《Scrum敏捷软件开发》*Software Development using Scrum*
- 《高效团队开发 - 工具与方法》
当然学习编程最重要的通过项目实战来提升自己的综合能力Github上有大量的优质开源项目其中不乏优质的Python项目。有一个名为[“awesome-python-applications”](https://github.com/mahmoud/awesome-python-applications)的项目对这些优质的资源进行了归类并提供了传送门,大家可以了解下。除此之外,还要为大家推荐一个名为[“Python-100-Days”](https://github.com/jackfrued/Python-100-Days)的项目上面有大量优质的Python学习资料包括文档、代码和相关资源如果自学能力不是那么强,可以通过网络上免费或者付费的视频课程来学习对应的知识;如果自律性没有那么强,那就只能建议花钱参加培训班了,因为花钱在有人监督的环境下学习对很多人来说确实是一个捷径,但是要记得:“师傅领进门,修行靠各人”。选择自己热爱的东西并全力以赴,不要盲目的跟风学习,这一点算是过来人的忠告吧。记得我自己刚开始进入软件开发这个行业时,有人跟我说过这么一句话,现在也分享出来与诸君共勉:“浮躁的人有两种:只观望而不学习的人,只学习而不坚持的人;浮躁的人都不是高手。”
当然学习编程最重要的通过项目实战来提升自己的综合能力Github上有大量的优质开源项目其中不乏优质的Python项目。有一个名为[“awesome-python-applications”](https://github.com/mahmoud/awesome-python-applications)的项目对这些优质的资源进行了归类并提供了传送门,大家可以了解下。如果自学能力不是那么强,可以通过网络上免费或者付费的视频课程来学习对应的知识;如果自律性没有那么强,那就只能建议花钱参加培训班了,因为花钱在有人监督的环境下学习对很多人来说确实是一个捷径,但是要记得:“师傅领进门,修行靠各人”。选择自己热爱的东西并全力以赴,不要盲目的跟风学习,这一点算是过来人的忠告吧。记得我自己刚开始进入软件开发这个行业时,有人跟我说过这么一句话,现在也分享出来与诸君共勉:“浮躁的人有两种:只观望而不学习的人,只学习而不坚持的人;浮躁的人都不是高手。”