写在前面
本篇笔记主要解决用户注册,验证码的实现,邮箱验证码的发送这3个问题。
本篇笔记对应于第十三篇代码,对应于github的位置是https://github.com/licheetools/eduline。
用户注册的实现
首先把我们的前端注册页面拷贝到我们的templates文件夹里面:然后,书写我们的注册视图函数,打开users/views.py,在里面添加如下代码:
# 用于实现用户注册的函数
class RegisterView(View):
# get方法直接返回页面
def get(self, request):
return render(request, "register.html", {})
接着配置路径,在eduline/urls.py文件里面,添加如下代码:
from users.views import RegisterView
path('register/', RegisterView.as_view(), name="register")
继续在index.html文件配置页面的跳转信息:
顺便把我们的登录链接也给修改一下。
静态文件中static目录的引用配置
现在我们需要对静态文件中static目录的引用进行配置,分2个步骤:
1、对HTML页面内含有"/static/media/image/2016/12/default_big_14.png"
这种格式的img,js,css ,images都需要在<html>标签内加上{% load staticfiles %}这个代码;
2、将所有链接中的"/static/css/style.css"绝对路径格式修改为相对路径格式:
"{% static 'css/style.css' %}",记住保留static文件的下一级文件(路径我们之前在settings.py文件配置过STATIC_URL = '/static/'
),其他的类似,这里不细说了。
大家需要将目前接触到的****,****,****这三个文件里的所有绝对路径格式修改为相对路径格式,尽管比较多而且枯燥,但是希望大家坚持克服一下。
最后运行一下我们的项目,看样式是不是都正确加载出来了!
验证码的实现
有时候为了辨别是不是机器人或者其他登录,网站都采用输入验证码的方式来进行识别,这是一个非常行之有效的方法。
1、下载安装captcha:
C:\Users\YC>F:
F:\>cd Envs
F:\Envs>workon eduline
(eduline) F:\Envs>cd eduline
(eduline) F:\Envs\eduline>pip install django-simple-captcha==0.5.9 -i https://pypi.tuna.tsinghua.edu.cn/simple
django-simple-captcha==0.5.9或者以上版本!
或者本地安装下载链接地址:django-simple-captcha
2、打开settings.py文件,把 captcha 增加到 INSTALLED_APPS 里面去:
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'users',
'courses',
'organization',
'operation',
'xadmin',
'crispy_forms',
'captcha'
]
3、配置Path,打开eduline/urls.py文件,在里面添加:
from django.urls import include
# 验证码url
path("captcha/", include('captcha.urls'))
4、数据库生产和迁移操作:
makemigrations
migrate
打开Navicat,查看我们生成的数据表:
5、将验证码在前端页面展示
打开users/forms.py文件,在里面添加如下代码:
from captcha.fields import CaptchaField # 引入验证码field
# 用户登录表单时验证码的验证,注意字段与前端页面保持一致
class RegisterForm(forms.Form):
email = forms.CharField(required=True) # 用户名不能为空
password = forms.CharField(required=True, min_length=5) # 密码不能为空,而且最小5位数
captcha = CaptchaField()
6、删除一行代码:
7、实例化注册视图函数
打开users/views.py文件,在里面修改并输入以下代码:
from users.forms import RegisterForm
# 用于实现用户注册的函数
class RegisterView(View):
# get方法直接返回页面
def get(self, request):
register_form = RegisterForm()
return render(request, "register.html", {"register_form": register_form})
8、修改前端页面代码
之前:
<div class="form-group marb8 captcha1 ">
<label>验 证 码</label>
</div>
现在:
<div class="form-group marb8 captcha1 ">
<label>验 证 码</label>
{{ register_form.captcha }}
</div>
还有url的跳转问题,注意外面有双引号,里面就只能用单引号了:
尽管我们前面把前端显示的输入框那行代码给删除了,现在只有label,但是前端页面依旧可以查看到输入框,那是因为Registerform会为我们自动生成输入框和验证码,怎么样是不是很神奇!而且这其中隐藏的字符串的框会被带到后台,由Django为我们进行验证,用于验证该验证码是否保存过,已经存在就换一个,不存在就可以使用!顺便在</form>标签之前加上{% csrf_token %}。
9、RegisterView的完善
打开users/views.py文件,在里面修改并输入以下代码:
# 用于实现用户注册的函数
class RegisterView(View):
# get方法直接返回页面
def get(self, request):
register_form = RegisterForm()
return render(request, "register.html", {"register_form": register_form})
def post(self, request):
# 类的实例化需要一个字典dict参数,而前面我们就知道request.POST是一个QueryDict,所以可以直接传入POST中的信息
register_form = RegisterForm(request.POST)
if register_form.is_valid():
pass
验证码的刷新是前端页面完成的,就是下面一段代码:
//刷新验证码的代码,是JQuery控制的,前端代码已经有了,这里了解一下即可。
function refresh_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);
});
return false;
}
10、运行一下我们的项目,发现验证码可以刷新,没有问题!
11、但是如果我们输入错误的验证码,页面没有提示错误信息,所以我们还是需要配置我们的forms.py文件,添加修改一行代码:
captcha = CaptchaField(error_messages={"invalid": "验证码错误"})
现在验证码的错误信息就会显示出来了!
至此,验证码就先到这里,后面会继续完善这个功能。
邮箱验证码的发送与接收
新浪邮箱发送验证码
我们这里不使用Python自己的邮件发送功能,而是直接利用第三方的服务器来发送:
1、打开eduline/settings.py文件,在其中添加如下代码:
# 发送邮箱验证的配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.sina.cn'
EMAIL_PORT = 25
EMAIL_HOST_USER = 'licheetools@sina.cn' #EMAIL_HOST_USER和EMAIL_FROM必须一样,否则会出错,而且必须是sina邮箱
EMAIL_HOST_PASSWORD = ""
EMAIL_USE_TLS = False
EMAIL_FROM = 'licheetools@sina.cn'
2、在users应用里面新建一个名为utils的package包,再在这个utils里面新建email_send.py文件,里面输入以下代码:
from random import Random
from users.models import EmailVerifyRecord
from django.core.mail import send_mail # 导入Django自带的邮件模块
from eduline.settings import EMAIL_FROM # 导入setting中发送邮件的配置
def random_str(randomlength=8):
str = ''
chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
length = len(chars) - 1
random = Random()
for i in range(randomlength):
str += chars[random.randint(0, length)]
return str
# 发送注册邮件
def send_register_email(email, send_type="register"):
email_record = EmailVerifyRecord() # 实例化一个EmailVerifyRecord对象
code = random_str(16)
email_record.code = code
email_record.email = email
email_record.send_type = send_type
email_record.save()
# 定义邮件内容:
email_title = ""
email_body = ""
if send_type == "register":
email_title = "慕海学习网注册激活链接"
email_body = "请点击下面的链接激活你的账号: http://127.0.0.1:8000/active/{0}".format(code)
# 使用Django内置的函数来完成邮件的发送,包括四个参数:主题,邮件内容,从哪里发,接收者list
send_status = send_mail(email_title, email_body, EMAIL_FROM, [email])
# 如果发送成功
if send_status:
pass
顺便完善一下你的注册函数,修改为如下:
from users.forms import LoginForm, RegisterForm
from django.contrib.auth.hashers import make_password
from users.utils.email_send import send_register_eamil
# 用于实现用户注册的函数
class RegisterView(View):
# get方法直接返回页面
def get(self, request):
register_form = RegisterForm()
return render(request, "register.html", {'register_form': register_form})
def post(self, request):
# 类的实例化需要一个字典dict参数,而前面我们就知道request.POST是一个QueryDict,所以可以直接传入POST中的信息
register_form = RegisterForm(request.POST)
if register_form.is_valid():
# username,password为前端页面name的返回值,取到用户名和密码我们就开始进行登录验证;取不到时为空。
user_name = request.POST.get("email", "")
pass_word = request.POST.get("password", "")
# 实例化一个user_profile对象,存入前端页面获取的值
user_profile = UserProfile()
user_profile.username = user_name
user_profile.email = user_name
# 对password进行加密并保存
user_profile.password = make_password(pass_word)
user_profile.save()
send_register_eamil(user_name, 'register')
pass
3、登录你的新浪邮箱,点击右上角的设置,然后选择左边的客户端setp,开启服务即可:
4、在图示代码处打上断点,开启测试模式:
5、运行项目,开启Debug模式,在这之前先看一下我们的用户信息表:
我们注册继续使用刚才的邮箱:licheetools@sina.cn
现在开始调试代码:
打开数据库里的用户信息表,发现刚才的注册用户已经存进来了:
继续按单步调试按钮,页面跳转到发送邮件的py文件了:
现在我们去新浪邮箱里看看:
邮件发送成功了!!!
QQ邮箱验证码的发送
需要修改上面的2步,其他的不用变化。打开eduline/settings.py文件,在其中修改为如下代码:
# 发送邮箱验证的配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.qq.com'
EMAIL_PORT = 25
EMAIL_HOST_USER = '2131247535@qq.com'
EMAIL_HOST_PASSWORD = '' #这里填写授权码
EMAIL_USE_TLS= False
EMAIL_FROM = '2131247535@qq.com'
在users应用里面新建一个名为utils的package包,再在这个utils里面新建email_send.py文件,里面输入以下代码:
from random import Random
from users.models import EmailVerifyRecord
from django.core.mail import send_mail # 导入Django自带的邮件模块
from eduline.settings import EMAIL_FROM # 导入setting中发送邮件的配置
def random_str(randomlength=8):
str = ''
chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789'
length = len(chars) - 1
random = Random()
for i in range(randomlength):
str += chars[random.randint(0, length)]
return str
# 发送注册邮件
def send_register_email(email, send_type="register"):
email_record = EmailVerifyRecord() # 实例化一个EmailVerifyRecord对象
code = random_str(16)
email_record.code = code
email_record.email = email
email_record.send_type = send_type
email_record.save()
# 定义邮件内容:
email_title = ""
email_body = ""
if send_type == "register":
email_title = "慕海学习网注册激活链接"
email_body = "请点击下面的链接激活你的账号: http://127.0.0.1:8000/active/{0}".format(code)
# 使用Django内置的函数来完成邮件的发送,包括四个参数:主题,邮件内容,从哪里发,接收者list
send_status = send_mail(email_title, email_body, EMAIL_FROM, [email])
# 如果发送成功
if send_status:
pass
然后登录你的QQ邮箱,点击设置---> 账户,找到如下:
开启QQ的smtp服务,接着点击生成授权码,按照提示发送短信:
接着打开users/views.py文件,完善def post(self, request):
函数,就是这个样子:
顺便完善一下你的注册函数,修改为如下:
from users.forms import LoginForm, RegisterForm
from django.contrib.auth.hashers import make_password
from users.utils.email_send import send_register_eamil
# 用于实现用户注册的函数
class RegisterView(View):
# get方法直接返回页面
def get(self, request):
register_form = RegisterForm()
return render(request, "register.html", {'register_form': register_form})
def post(self, request):
# 类的实例化需要一个字典dict参数,而前面我们就知道request.POST是一个QueryDict,所以可以直接传入POST中的信息
register_form = RegisterForm(request.POST)
if register_form.is_valid():
# username,password为前端页面name的返回值,取到用户名和密码我们就开始进行登录验证;取不到时为空。
user_name = request.POST.get("email", "")
pass_word = request.POST.get("password", "")
# 实例化一个user_profile对象,存入前端页面获取的值
user_profile = UserProfile()
user_profile.username = user_name
user_profile.email = user_name
# 对password进行加密并保存
user_profile.password = make_password(pass_word)
user_profile.save()
send_register_eamil(user_name, 'register')
pass
然后就是继续刚才的调试了,断点代码的位置一模一样,这里就不细说了,按照要求是不会出问题的。
接下来我们继续完善我们的错误信息提示,可以照葫芦画瓢对着前面在login页面的设置,把它们搬到register页面中来。
错误信息的完善
这是我们前面在login页面的配置:尝试一下在register页面也做类似的配置:
然后我们还要完善一下用户的信息回填操作,无论是否有错都要这么做,我们采用这行代码来完成要求:
value="{% ifnotequal None register_form.email.value %}{{ register_form.email.value }}{% endifnotequal %}"
我们是以邮箱来说明的,{{ register_form.email.value }}是返回邮箱的值,{% ifnotequal None register_form.email.value %}是说如果email的值不为空,则等于返回的值,为空就显示None。如果你不能理解其实就是这个意思:
value="{% if None != register_form.email.value %}{{ register_form.email.value }}{% endifnotequal %}"
你可以参考这篇文章用于加深你的理解:Django比较相等或者不相等的模板语法ifequal / ifnotequal
还有这篇django学习——模板中判断相等与否的两种用法ifequal与if
我们试着对密码做同样的操作:
value="{% if None != register_form.password.value %}{{ register_form.password.value }}{% endif %}"
运行一下我们的项目:
看到没,提示信息已经出现了!
至此,本篇关于用户注册,验证码的实现,邮箱验证码的发送这3个问题的介绍就到此结束了,下一篇我们将实现用户的激活,用户密码找回等功能的实现,感谢你的赏阅。
本篇笔记对应于第十三篇代码,对应于github的位置是https://github.com/licheetools/eduline。
网友评论