Django项目(二)
- 2019 年 10 月 6 日
- 筆記
1、首先是我们的模板页面,我们写好一个html页面,我们的页面是这样的:
HTML页面

2、视图views.py中代码的编写
注册模块属于用户,所以我们在xm_user下的views.py中编写代码,以下的代码都在xm_user的应用下
2.1、以前我们都是在views.py中都是一个方法一个方法的。代码一多,可能就乱了,本次引出一个新的概念,视图类。
顾名思义就是将一个请求规划成一个类。用到视图类,首先需要导入模块:
from django.views.generic import View
我们这里写注册,就编写一个RegisterView类:
class RegisterView(View):
xxxxx
我们的类继承于View,里面有很多方法,目前介绍两个get和post,也就是说我们在这个类中定义一个get方法,当请求过来的时候我们就显示页面。也就会
执行我们get方法里的代码,还有一个post,当时post请求,就执行post里的代码,我们可以利用这两个方法,一个显示,一个注册,
也就是当用户访问注册页面的时候就是get请求,当提交注册的时候就是post,我们写上这样一段代码:
from django.shortcuts import render,redirect
from django.core.urlresolvers import reverse
from xm_user.models import User
import re
class RegisterView(View):
#请求为get,就返回注册页面,post就注册用户。
# get请求显示注册页面,get函数名固定
def get(self,request):
return render(request, "register.html")
# post 请求, 方法名固定
def post(self, request):
'''接收数据'''
username = request.POST.get("username")
pwd = request.POST.get("password")
email = request.POST.get("email")
# all函数,有一个为空就会返回false
if not all([username, pwd, email]):
return render(request, 'register.html', {'errmsg': '有数据为空'})
# 验证邮箱
if not re.match(r'^[a-z0-9][w.-]*@[a-z0-9-]+(.[a-z]{2,5}){1,2}$', email):
return render(request, 'register.html', {'errmsg': '邮箱格式不正确!'})
# 判断用户名是否存在
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
user = None
if user:
return render(request, 'register.html', {'errmsg': '用户以存在!'})
# 添加用户
# 以前的做法
# user = User()
# user.username = xxx
# user.password = xxx
# user.save()
# 我们因为用的是Django自带的认证模块,所以不用这么复杂了
# 只需要调用create_user方法就好了
user = User.objects.create_user(username, email, pwd)
# 由于我们是发送到邮箱,让用户注册,由于用自带的会默认激活,所以我们自己定义成0
user.is_active = 0
# 保存
user.save()
# 发送邮件
# xxxxx
# 反向解析
return redirect(reverse("xm_goods:index"))
以上,get中的方法很简单,返回注册的页面,post方法中,例如:request.POST.get("username"),就是接收模板页发送过来的账号,username就是我们html页面input标签的name值(前端基础希望自己补充),其中的all方法,all就是用来判断是否有空值,如果有空值,我们就返回存在空值,接下来是验证邮箱格式,这里用的正则表达式,不多说,接下来是判断用户名是否存在,存在返回以存在,由于objects.get当他为查询的值的时候会报错,所以我们try一下,接下来我们添加账号,这里是用的Django自带的认证模块,我们models中也是用的Django自带的,这里我们只需要执行create_user方法就好了。
同时我们的urls.py中要对url进行映射url(r'^register$',RegisterView.as_view(),name='register'),此时,注册成功就会跳到商城的主页。
RegisterView就是我们的类名,这里直接调用as_view()方法就好了,name是我们反向解析的时候需要用到的。同时这里需要导入:
from xm_user.views import RegisterView
2.2、发送邮箱注册
这里我使用的是qq邮箱发送邮件,你也可以去使用其他的邮箱,进行发送邮件。
在这之前,我们需要去登陆qq邮箱做一些配置,在网页中打开qq邮箱,找到设置,点击账号,往下翻,会看到:

我们点击开启,会需要你发送一条短信,接着他会弹出一串字母,复制下来保存下,回到我们的项目中,
在项目的seetings.py中添加这几条配置:
# 配置邮箱
EMAIL_USE_TLS = True
# 发送邮件配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
# smpt服务地址,不同邮箱,这里不同
EMAIL_HOST = 'smtp.qq.com'
# 端口号
EMAIL_PORT = 25
# 账号
EMAIL_HOST_USER = '你的邮箱账号'
# 密码
EMAIL_HOST_PASSWORD = '刚刚让你保存的那一串字母'
# 收件人看到的发件人,
EMAIL_FROM = 'python入门到放弃<这里必须写你的邮箱账号>'
然后回到我们的xm_user下的views.py中,在上面我们在返回主页之前,我们写了一个注册,发送邮箱,我们的下面的代码写在那个位置:
# 发送邮件,激活账户
# 发送的还是本网站的页面 http://127.0.0.1:8000/xm_user/active/id
# 这里的id为防止能直接看出来,我们需要加密处理
# 这里加密我们需要用到itsdangerous模块,我们先安装pip install itsdangerous
# 导入模块from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
# 这里的python入门到放弃这个参数你可以随便写,就是一个密钥,加密的时候是连带一起加密的,3600是链接失效的时间3600秒。你可以自己定义
serializer = Serializer('python入门到放弃',3600)
# 将id用一个字典存起来,这里你存的是字典,也可以是元组,列表,你怎么村的数据,你解密就怎么拿数据
info = {'id':user.id}
# 加密用dumps函数,加密后是bytes类型
token = serializer.dumps(info) # bytes类型
# 解码,将bytes解码成uft8类型
token = token.decode('utf8')
# 发送邮件, 主题
subject = 'python入门到放弃'
# 这里发送的内容不支持写html页面,所以我们直接不写,用html_message 这个参数
message = ''
# 这里导入了settings,导入发送的邮箱
sender = settings.EMAIL_FROM
# 发送到的邮箱
receiver = [email]
# 支持html代码的参数
html_message = '<h1>尊敬的%s,你好,欢迎注册小米商城会员。</h1>请点击下面链接激活<a href="Http://127.0.0.1:8000/xm_user/active/%s">Http://127.0.0.1:8000/xm_user/active/%s</a>'%(username,token,token)
send_mail(subject,message,sender,receiver,html_message=html_message)
上面说的很清楚,所以我这里就不多解释了,id在项目中是不能暴露出来的,所以需要加密。
我们激活需要一个地址: http://127.0.0.1:8000/xm_user/active/id,我们去创建他的类:
from itsdangerous import SignatureExpired
from django.http import HttpRequest
class ActiveView(View):
def get(self,request,token):
'''进行解密'''
serializer = Serializer('python入门到放弃', 3600)
try:
# 解密函数用loads
info = serializer.loads(token)
user_id = info['id']
user = User.objects.get(id=user_id)
# 把状态改为1 , 表示激活
user.is_active = 1
user.save()
# 反向解析,跳到登陆页面
return redirect(reverse("xm_user:login"))
except SignatureExpired as e:
return HttpRequest('连接已经过期!')
这里链接失效就会提示SignatureExpired错误,因此我们需要捕捉这个错误,这里我们要从url中取到我们加密的id,因此我们url映射写成这样:
url(r'^active/(.*)$',ActiveView.as_view(),name='active'),需要导入:from xm_user.views import ActiveView
上面说了,我们注册成功需要跳到登陆页面,所以我们在写一个视图类,来显示我们的登陆页面:
class LoginView(View):
def get(self,request):
return render(request,"login.html")
url映射:url(r'^login$',LoginView.as_view(),name='login'),需要导入:from xm_user.views import LoginView
完成,我们运行项目,测试一下,我们注册时填写自己的邮箱,他就会向我们的邮箱发送一个注册链接,我们点击注册链接,就会完成激活,并跳转登陆页面。今天和上篇的源代码,以及模板的html页面,我都会发给大家,目前只能加载注册页面的注册,主页和登陆页的图片和和样式还没有修改路径,所以显示不出来,下一节会教大家怎么修改。今天需要实现发送邮箱注册跳转登陆页面。
后台回复Django项目二获取上一篇文章和这篇文章的源代码。
另:这个页面真的是不好看,到现在还没搞清楚怎么把代码调成可以滑动的,如果有知道的欢迎后台回复我,虽然我自己的编辑页面是一行,但是到了手机上就不是一行了。