diff --git a/.DS_Store b/.DS_Store index ed05b0967..5644af0e3 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git "a/Day41-55/03.\351\235\231\346\200\201\350\265\204\346\272\220\345\222\214Ajax\350\257\267\346\261\202.md" "b/Day41-55/03.\351\235\231\346\200\201\350\265\204\346\272\220\345\222\214Ajax\350\257\267\346\261\202.md" index c8b9e029e..8ee7fb3bc 100644 --- "a/Day41-55/03.\351\235\231\346\200\201\350\265\204\346\272\220\345\222\214Ajax\350\257\267\346\261\202.md" +++ "b/Day41-55/03.\351\235\231\346\200\201\350\265\204\346\272\220\345\222\214Ajax\350\257\267\346\261\202.md" @@ -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): ### 小结 -到此为止,这个投票项目的核心功能已然完成,在下一个章节中我们要求用户必须登录才能投票,没有账号的用户可以通过注册功能注册一个账号。 \ No newline at end of file +到此为止,这个投票项目的核心功能已然完成,在下面的章节中我们会要求用户必须登录才能投票,没有账号的用户可以通过注册功能注册一个账号。 \ No newline at end of file diff --git "a/Day41-55/04.\350\241\250\345\215\225\347\232\204\345\272\224\347\224\250.md" "b/Day41-55/04.\350\241\250\345\215\225\347\232\204\345\272\224\347\224\250.md" index e2b6de1ed..8a2f9e059 100644 --- "a/Day41-55/04.\350\241\250\345\215\225\347\232\204\345\272\224\347\224\250.md" +++ "b/Day41-55/04.\350\241\250\345\215\225\347\232\204\345\272\224\347\224\250.md" @@ -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 diff --git "a/Day41-55/05.Cookie\345\222\214Session.md" "b/Day41-55/05.Cookie\345\222\214Session.md" index 2d190169c..e5fc38890 100644 --- "a/Day41-55/05.Cookie\345\222\214Session.md" +++ "b/Day41-55/05.Cookie\345\222\214Session.md" @@ -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. 隐藏域(隐式表单域)。在提交表单的时候,可以通过在表单中设置隐藏域向服务器发送额外的数据。例如:``。 +3. Cookie。Cookie是保存在浏览器临时文件中的数据,每次请求时,请求头中会携带本站点的Cookie到服务器,那么只要将sessionid写入cookie,下次请求时服务器就能够获得这个sessionid。 + +需要说明的是,在HTML5时代要想在浏览器中保存数据,除了使用Cookie之外,还可以使用新的本地存储API,包括localStorage、sessionStorage、IndexedDB等,如下图所示。 + +![](./res/cookie_xstorage_indexeddb.png) + +### Django框架对Session的支持 + diff --git a/Day41-55/res/cookie_xstorage_indexeddb.png b/Day41-55/res/cookie_xstorage_indexeddb.png new file mode 100644 index 000000000..a08c2577c Binary files /dev/null and b/Day41-55/res/cookie_xstorage_indexeddb.png differ diff --git "a/\347\237\245\344\271\216\351\227\256\351\242\230\345\233\236\347\255\224.md" "b/\347\237\245\344\271\216\351\227\256\351\242\230\345\233\236\347\255\224.md" index 68bc00d7b..2d96658bf 100644 --- "a/\347\237\245\344\271\216\351\227\256\351\242\230\345\233\236\347\255\224.md" +++ "b/\347\237\245\344\271\216\351\227\256\351\242\230\345\233\236\347\255\224.md" @@ -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学习资料(包括文档、代码和相关资源)。如果自学能力不是那么强,可以通过网络上免费或者付费的视频课程来学习对应的知识;如果自律性没有那么强,那就只能建议花钱参加培训班了,因为花钱在有人监督的环境下学习对很多人来说确实是一个捷径,但是要记得:“师傅领进门,修行靠各人”。选择自己热爱的东西并全力以赴,不要盲目的跟风学习,这一点算是过来人的忠告吧。记得我自己刚开始进入软件开发这个行业时,有人跟我说过这么一句话,现在也分享出来与诸君共勉:“浮躁的人有两种:只观望而不学习的人,只学习而不坚持的人;浮躁的人都不是高手。” \ No newline at end of file +当然学习编程,最重要的通过项目实战来提升自己的综合能力,Github上有大量的优质开源项目,其中不乏优质的Python项目。有一个名为[“awesome-python-applications”](https://github.com/mahmoud/awesome-python-applications)的项目对这些优质的资源进行了归类并提供了传送门,大家可以了解下。如果自学能力不是那么强,可以通过网络上免费或者付费的视频课程来学习对应的知识;如果自律性没有那么强,那就只能建议花钱参加培训班了,因为花钱在有人监督的环境下学习对很多人来说确实是一个捷径,但是要记得:“师傅领进门,修行靠各人”。选择自己热爱的东西并全力以赴,不要盲目的跟风学习,这一点算是过来人的忠告吧。记得我自己刚开始进入软件开发这个行业时,有人跟我说过这么一句话,现在也分享出来与诸君共勉:“浮躁的人有两种:只观望而不学习的人,只学习而不坚持的人;浮躁的人都不是高手。” \ No newline at end of file