Django项目:极致果蔬(一)
作为一个Python的Web项目,其整体的开发流程大致如下:
在这个项目中,我们划分为4个模块,分别是用户模块、商品模块、购物车模块和订单模块。
对于整体项目的架构可分为3块,分别是前端开发、后台开发和其他技术,这里的前端开发就不进行说明了,直接用之前已设计好的。
在进行数据库设计前,先来对电商项目中的两个概念 SPU 和 SKU 进行了解。
SPU 和 SKU 的区别
这里用个简单的例子来说明:你想要一台华为P40 Pro,店员会问:你想要什么配置的P40 Pro?8GB+128GB亮黑色?8GB+256GB零度白?此时,每一台华为P40 Pro重量都是320g,都支持双卡双待以及产地都是中国大陆,那么这几个属性就是 SPU 属性;而容量、颜色,这些会影响价格和库存量等属性就是 SKU 属性。
接下来对用户注册部分用到的几个知识点进行总结。
用户注册的基本流程如下:
1.Django用户认证系统—create_user
User对象是认证系统的核心,这里我们学习User对象中create_user这一常用的方法。
在进行用户登录验证的时候,如果自己写代码就要先查询数据库,看用户输入的用户名是否存在与数据库中,如果存在与数据库中,然后还要验证用户输入的密码,这样一来要编写大量的代码。为了高效、快速的创建用户最直接的方式就是使用内置的create_user方法,它也会对密码进行默认加密的处理,使用的时候必须要传递username、email、password这三个参数,其他参数为可选参数。
2.类视图
当编写一个函数视图用于注册时,可能会遇到这个视图对应的路径提供多种不同的HTTP请求方法的支持,就需要在一个函数中编写不同的业务逻辑,代码的可读性与复用性都不佳。因此我们可以使用类视图将视图对应的不同请求方式以类中的不同方法来区别定义。
类视图的好处:
(1)代码可读性好;
(2)类视图相对于函数视图有更高的复用性,如果其他地方需要用到某个类视图的某个特定逻辑,直接继承该类视图即可。
类视图的使用:
定义类视图需要继承Django提供的父类View,可使用from Django.view.generic import View 或者 from Django.views.generic.base import View导入;配置路由时,使用类视图的as_view()方法来添加。
from django.conf.urls import url
from .views import RegisterView,login,EmailActiveViewurlpatterns = [url(r'^register$', RegisterView.as_view(),name="register"),
]
3.URL反转
在访问某一网址的时候,其路径可能被改动过,这时我们可以通过reverse()来接收url中的name作为第一个参数,只要对应的url的name不变,不用改代码中的网址也可以获取对应的网址。这样也可避免某些url地址被修改后,还需要去那些用到url的地方逐一修改。
在写项目的过程中,不可避免会传入参数进去,我们在使用reverse进行反转时也需要传递参数,这个时候我们就可以使用reverse()中的kwargs参数传入一个字典形式的变量,kwargs也支持传入多个参数。
url = reverse('reverse:userInfo',kwargs={'user_id':10})
4.异步发送邮件 — 激活用户
在用户注册的时候,用户的is_active=0表示未激活,因此我们需要对该值进行激活。
首先我们要考虑到,当发送邮件点击“激活”,对应的激活网址应该为http://127.0.0.1:8000/user/email_active/[用户id],为了保证用户的安全性,这里我们使用signing来对“[用户id]”进行加密处理;
singing的常用函数:
dumps(obj) # 返回序列化的对象,表示加密成功,参数obj为字典类型的对象
loads(string,max_age=None) # 这是dumps()的反转,参数max_age会自动检测时间长短,若超时,则抛出SignatureExpired异常
接着来编写一个激活用户的类视图,并限定用户两天的时间超过则不予激活或使用其它方式重新激活;
from django.core.signing import SignatureExpired
from django.http import HttpResponse
from django.core import signing# 激活用户类视图
class EmailActiveView(View):def get(self,request,userSign):try:user = signing.loads(userSign,max_age=2*24*3600)except SignatureExpired as e:return HttpResponse("该激活链接已过期!请联系管理员:2435655357@qq.com!")userRes = UserBean.objects.filter(id=user.get('userid'))if not userRes:return HttpResponse("该用户不存在!返回首页!<a href='/'>首页</a>")userRes[0].is_active = TrueuserRes[0].save()return HttpResponseRedirect(reverse('login'))
编写完类视图后,到user/urls.py文件下配置url;
from .views import EmailActiveViewurlpatterns = [url(r'^email_active/(?P<userSign>.*)$', EmailActiveView.as_view(),name="email_active"),
]
若要发送邮件到QQ中进行激活,需要到settings.py文件中配置邮件信息;
# 发送邮件的配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.qq.com'
EMAIL_PORT = 25
EMAIL_HOST_USER = 'xxxxx@qq.com' # 你的 QQ 账号
EMAIL_HOST_PASSWORD = 'sfjndkvndkes' # 刚刚复制的授权码(不是你的 QQ 密码!)
EMAIL_USE_TLS = True # 这里必须是 True,否则发送不成功
EMAIL_FROM = '极致果蔬用户激活<xxxxx@qq.com>' # 收件人看到的发件人
发送邮件是比较耗时的程序,这里用celery来异步处理,在主目录下创建celery_task/tasks.py文件,导入邮件的模块;
import django
import os
from celery import Celery
from django.core.mail import send_mailapp = Celery('celery_task.tasks',broker='redis://127.0.0.1:6379/4')
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "fruitshop.settings")
django.setup()@app.task
def send_Email(subject,message,from_email,recipient_list,**kwargs):# 发送激活邮件send_mail(subject,message,from_email,recipient_list,**kwargs
此时,到RegisterView类视图中的post()方法内进行发送激活邮件;
class RegisterView(View):def get(self,request):return render(request, 'register.html')def post(self,request):# 获取用户输入值# 用户名username = request.POST.get("user_name")# 密码password = request.POST.get("pwd")# 确认密码repassword = request.POST.get("cpwd")# 邮箱email = request.POST.get("email")# 是否确认协议allow = request.POST.get("allow")# 校验数据if not all([username, password, repassword, email]):return render(request, 'register.html', {'errormessage': '数据填写不完整!'})# 校验邮箱if not re.match(r"^[a-z0-9][\w.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$", email):return render(request, "register.html", {"errormessage": "邮箱格式有误!"})# 密码核对if password != repassword:return render(request, "register.html", {"errormessage": "两次输入的密码不一致!"})# 是否同意协议if allow != "on":return render(request, "register.html", {"errormessage": "请勾选极致果蔬用户协议!"})# 验证用户是否存在 - 查询数据库 -UserBeantry:user = UserBean.objects.get(username=username)except UserBean.DoesNotExist:user = Noneif user:return render(request, "register.html", {"errormessage": "用户名已存在"})# 添加用户userObj = UserBean.objects.create_user(username, email, password, is_active=False)userSign = signing.dumps({'userid':userObj.id})# 发送激活邮件-celerysend_Email.delay("极致果蔬用户激活邮件","",settings.EMAIL_FROM,[email],html_message=f'欢迎您:{username},请点击下方链接,激活账号!<br><a href="http://127.0.0.1:8000/user/email_active/{userSign}">激活</a>')# 返回登录页面return HttpResponseRedirect(reverse('login'))
最后,进入注册页面,注册完成后可发送邮件到邮箱中,登录QQ邮箱后,点击“激活”链接可跳转到登录页面。
5.提升用户体验感
在上述的操作中,我们激活用户后会直接跳转到登录页面,这里可以添加一个倒计时的提醒再跳转,提高用户的体验感。
首先在templates上创建一个倒计时跳转的pageJump.html页面;
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>极致果蔬</title>
</head>
<body>{{ msg|safe }} <script type="text/javascript">var url = "{{ location }}"var secondsSpan = document.getElementById('seconds')var seconds = parseInt(secondsSpan.innerText)var countDown = setInterval(function (){if (seconds > 1){seconds--;secondsSpan.innerText = seconds;}else{location.href = urlclearInterval(countDown)}},1000)</script>
</body>
</html>
再在user/views上激活用户后返回一个渲染后的登录页面;
return render(request, 'pageJump.html',{'msg': f'注册成功!,请到邮箱中进行激活,还有<span id="seconds">5</span>秒跳转到激活页面,'f'点击<a href="{reverse("login")}">跳转</a>','location': f'{reverse("login")}'})
效果如下:
Django项目:极致果蔬(一)相关推荐
- ubuntu18.04 -- 创建第一个Django项目
step1: 安装虚拟环境: sudo pip3 install virtualenv # 安装虚拟环境sudo pip3 install virtualenvwrapper # 安装虚拟环境扩展包# ...
- 使用pytest对django项目单元测试
2019独角兽企业重金招聘Python工程师标准>>> 背景 使用django开发了个人博客,欲单元测试,后遍寻网络,然相关资料甚少,遂成此文,望对汝有所助 环境 pytest py ...
- Django项目配合sentry实现浅析
Django项目日志配合sentry概述 本文环境python3.5.2,Django版本1.10.2 Django项目中日志配合sentry的实现 sentry是一个错误跟踪网站,可以收集获取运行中 ...
- Django项目日志概述
Django项目日志概述 本文环境python3.5.2,Django版本1.10.2 Django项目中日志的实现 Django项目中使用的日志,使用了Python标准库中的logging模块进行实 ...
- Django项目test中的mock概述
Django项目test中的mock概述 本文环境python3.5.2 test中的mock实现 接口示例代码如下: ...# 路由配置('^api/business_application/?$' ...
- 创建Django项目和模型(创建工程、子应用、设置pycharm环境、使用Django进行数据库开发的步骤)
1.创建Django项目 文档:Writing your first Django app, part 1 | Django documentation | Django 步骤 创建Django项目 ...
- 如何合并多个Django项目?
目录 背景信息 合并步骤 查看效果 背景信息 多人合作开发Django项目(或者不同时期开发的多个Django项目),各自开发完成后需要合并到一起,统一启停(使用相同的端口访问).下面介绍合并两个项目 ...
- Ubuntu 下面部署Django 项目
django 是 python 开源的 web 框架 ,django 本身运行后也是一个轻量级的服务器,可以满足本地的测试,生产环境中的 大量访问, 一般和nginx 和 apache 结合.下面以 ...
- 使用Gunicorn Ngnx Supervisor部署Django项目
Django作为最受欢迎基于Python的Web框架之一,为用户提供了一个轻量级的测试Server,但这个Server最好不要用于生产环境.那么如果我们需要在生产环境上面部署Django项目,那么我们 ...
最新文章
- 【每日一算法】什么是二分图?
- android 父控件的背景_android控件拖动,移动、解决父布局重绘时控件回到原点
- python编程入门经典实例-Python入门经典实例
- 三十八、网络通信Socket模块实现文件传输
- 对数据科学家来说最重要的算法和统计模型
- 凝思系统改时间_国产操作系统往事:四十年激变,终再起风云
- 虚拟服务器 端口管理,Apache服务配置虚拟主机(基于域名、端口、IP地址)与简单访问权限管理...
- (论坛答疑点滴)如何按照HashTable动态设定类的属性和字段?
- Web后端学习笔记 Flask (5) 数据库
- JSP include directive 和JSP include的区别
- 【bzoj4355】Play with sequence 线段树区间最值操作
- jQuery选择器的的优点
- 09年关门歇业的15大网站 雅虎旗下4网站上榜
- LeetCode链表简单题
- UVa 10870 - Recurrences 矩阵快速幂
- 电路(第五版)邱关源 第一章总结
- 领导邀请一起跳槽?搞清楚这5件事再决定
- Git在windows和linux安装教程
- AppLocker绕过之路
- iOS 【奇巧淫技】获取webView内容高度