前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django项目(二)

Django项目(二)

作者头像
不断折腾
发布2019-09-23 10:58:19
7180
发布2019-09-23 10:58:19
举报
文章被收录于专栏:折腾折腾再折腾
前言:上一篇文章我们搭建了一个仿小米商城的框架,本节我们来完成注册功能。

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项目二获取上一篇文章和这篇文章的源代码。

另:这个页面真的是不好看,到现在还没搞清楚怎么把代码调成可以滑动的,如果有知道的欢迎后台回复我,虽然我自己的编辑页面是一行,但是到了手机上就不是一行了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 python入门到放弃 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
短信
腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档