基础教程中基本上都是基于函数来做的,其实更推荐基于类来做。基于类可以带来不少好处
django1.9.8urls中的配置:
users下新建forms文件。
实例化LoginView时已经对于我们的字段进行了验证。
打上断点:
debug后f6运行到
此时可以看到errors(ErrorDict)中的错误
将form传回前端:
前端中取值:
给这个class加上errorput会显示红色外框。
注意:写在class里面
我们本节来讲session和cookie
cookie是浏览器支持的一种本地存储方式。以dict,键值对方式存储。
{"sessionkey":"123"}浏览器会自动对于它进行解析。
用户向服务器发起的两次请求之间是没有状态的。也就是服务器并不知道这是同一个用户发的。
做到记住用户:
浏览器a在向服务器发起请求,服务器会自动给浏览器a回复一个id,浏览器a把id放到cookie当中,在下一次请求时带上这个cookie里的id值向浏览器请求,服务器就知道你是哪个浏览器发过来的了。
服务器a发回来的id会放到服务器a的域之下。不能跨域访问cookie。
使用浏览器随便打开一个网页,然后f12打开。
比如我使用的Chrome浏览器
会找到存储在浏览器本地的cookie值
点击clearall清空所有的cookief5刷新页面,会发现又把这些cookie值进来。
用户在第一次请求后,浏览器回复的id既可以是用户的userid。也可以一段任意的字符串,我们把它叫做sessionid
根据用户名和密码,服务器会采用自己的规则生成sessionid。这个sessionid保存在本地cookie。浏览器请求服务器会携带。
可以看到我们刚刚生成的sessionid。
此时通过f12查看浏览器在本地存储的sessionid。可以看到如下图和我们数据库中的一致。
session_key发到浏览器叫做sessionid
通过sessionid用户访问任何一个页面都会携带,服务器就会认识。
Setting.py中,
这个app会拦截我们每次的request请求,在request中找到sessionid,然后去数据表中进行查询。然后通过sessionkey去找到sessiondata。此时直接为我们取出了user。
在服务器返回浏览器的response中也会直接加上sessionid
users/views.py
#注册功能的viewclassRegisterView(View):#get方法直接返回页面defget(self,request):returnrender(request,"register.html",{})配置对应的urlDjango1.9.8url配置如下:
fromusers.viewsimportRegisterView#注册urlurl("^register/",RegisterView.as_view(),name="register"),Django2.0.1url配置如下
fromusers.viewsimportRegisterView#注册urlpath("register/",RegisterView.as_view(),name="register")修改index页面中注册urlmark此时访问首页发现可以成功跳转到注册页面
他会自动根据setting中配置,为我们加上前缀
如果我们把目录在setting中改到mystatic。url中会自动添加指定的前缀
可以看到可以访问成功。
枯燥但是要有耐心。
这时候访问三个页面,查看样式是否完好。
workonmxonline3pipinstalldjango-simple-captchaworkonmxonline2pipinstalldjango-simple-captcha==0.4.6django1.9.8如下:
fromdjango.conf.urlsimporturl,includeurlpatterns+=[url(r'^captcha/',include('captcha.urls')),]django2.0.1如下;
#验证码urlpath("captcha/",include('captcha.urls'))makemigrationsmigratemark进入数据库查看生成的表
users/forms.py:
#引入验证码fieldfromcaptcha.fieldsimportCaptchaField#验证码form&注册表单formclassRegisterForm(forms.Form):#此处email与前端name需保持一致。email=forms.EmailField(required=True)#密码不能小于5位password=forms.CharField(required=True,min_length=5)#应用验证码captcha=CaptchaField()users/views.py
#form表单验证&验证码from.formsimportLoginForm,RegisterForm#注册功能的viewclassRegisterView(View):#get方法直接返回页面defget(self,request):#添加验证码register_form=RegisterForm()returnrender(request,"register.html",{'register_form':register_form})前端获取验证码值markmark找到上图验证码部分。修改为下图
Forms中的field会生成不同的框。
我们只有label但是前端可以查看到input框等,也就是Registerform会为我们生成输入框+验证码。
隐藏的字符串的框会被带到后台,由Django为我们进行验证。验证该验证码是否保存过。
可以看得我们数据库中将这个hashkey进行了保存。这个key与验证码内容对应。
后台会把验证码值和hashkey进行联合查询。
users/views.py的RegisterView中添加post方法:
defpost(self,request):#实例化formregister_form=RegisterForm(request.POST)ifregister_form.is_valid():passmarkmark修改form表单提交方式与提交到哪个url
前端的form提交加上对应的crsftoken
刷新验证码是前端帮我们完成的:
//刷新验证码functionrefresh_captcha(event){$.get("/captcha/refresh/"+Math.random(),function(result){$('#'+event.data.form_id+'.captcha').attr("src",result.image_url);$('#id_captcha_0').attr("value",result.key);});returnfalse;}获取前端页面值并封装成一个user_profile对象,保存到数据库。fromdjango.contrib.auth.hashersimportmake_passwordifregister_form.is_valid():user_name=request.POST.get("email","")pass_word=request.POST.get("password","")#实例化一个user_profile对象,将前台值存入user_profile=UserProfile()user_profile.username=user_nameuser_profile.email=user_name#加密password进行保存user_profile.password=make_password(pass_word)user_profile.save()pass发送邮件实现setting中配置;
#发送邮件的setting设置EMAIL_HOST="smtp.qq.com"EMAIL_PORT=25EMAIL_HOST_USER="mxonline.mtianyan.cn"EMAIL_HOST_PASSWORD=""EMAIL_USE_TLS=TrueEMAIL_FROM="mxonline.mtianyan.cn"新建package后新建文件。
apps:utils/email_send.py:
defpost中加上发送邮件
users/views.py:
#发送邮件fromutils.email_sendimportsend_register_eamil#发送注册激活邮件send_register_eamil(user_name,"register")点击注册提交,因为我们没有return。一直在转圈圈。
但是数据库中已经添加了字段。
如果注册成功返回login页面:不成功,返回register页面并报错。
找猫画虎:将login中的错误提示搬运到register中来。
如果传回的有值则,显示传回来值。
密码也做同样操作
post方法中
#默认激活状态为falseuser_profile.is_active=False书写处理激活的view。
django1.9.8:
#激活用户urlurl(r'^active/(P
#激活用户urlre_path('active/(P