准备工作

1、配置settings.py内置文件

注意: AUTH_USER_MODEL配置参数要在第一次迁移数据库之前配置,否则可能django的认证系统工作不正常

2、创建应用

3、配置主路由

一、用户注册

1、创建用户注册model模型

1)设置模型抽象类

2)进入user应用设置model

这里使用的是django内部AbstractUser用户类

2、显示用户注册页面

方法一:使用FBV请求处理

FBV:(function base views) 就是在视图里使用函数处理请求。

1)定义路由

import . import views
url(r'^register$', views.register, name='register')

2)定义注册的视图函数

import re
from django.shortcuts import render, redirect
from .models import User
from django.core.urlresolvers import reverse def register(request):
'''显示注册页面'''
if request.method == 'GET':
return render(request, 'register.html')
else:
username = request.POST.get('user_name')
password = request.POST.get('pwd')
email = request.POST.get('email')
allow = request.POST.get('allow') # 进行数据校验
if not all([username, password, 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': '邮箱格式不正确'}) # 天天生鲜协议校验
if allow != 'on':
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.objects.create_user(username, email, password)
user.is_active = 0
user.save()
# 返回应答,跳转到首页
return redirect(reverse('goods:index'))

方法二:使用CBV请求处理(推荐)

CBV(class base views) 就是在视图里使用类处理请求。

1)定义路由

url(r'^register$', RegisterView.as_view(), name='register'),  # 注册

2)定义注册视图类

import re
from django.shortcuts import render, redirect
from .models import User
from django.core.urlresolvers import reverse
from django.views.generic import View
from django.conf import settings
from django.http import HttpResponse 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')
email = request.POST.get('email')
allow = request.POST.get('allow') # 进行数据校验
if not all([username, password, 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': '邮箱格式不正确'}) # 天天生鲜协议校验
if allow != 'on':
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.objects.create_user(username, email, password)
user.is_active = 0
user.save()
# 返回应答,跳转到首页
return redirect(reverse('goods:index'))

3)激活邮箱

1)下载加密签名数据包

2)设置路由,编写代码逻辑

class ActiveView(View):
"""用户激活"""
def get(self, request, token):
"""进行用户激活"""
# 进行解密 获取要激活的用户信息
serializer = Serializer(settings.SECRET_KEY, 3600)
try:
info = serializer.loads(token)
# 获取待激活用户的id
user_id = info['confirm'] # 根据id获取用户信息
user = User.objects.get(id=user_id)
user.is_active = 1
user.save() # 跳转到登录页面
return redirect(reverse('user:login'))
except SignatureExpired as e:
# 激活链接已过期
return HttpResponse('激活链接已过期')
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer, SignatureExpired
from django.core.mail import send_mail
# 发送激活邮件 包含激活链接:Http://127.0.0.1:8000/user/active/3
# 激活链接中需要包含用户的身份信息 并且要把身份信息进行加密
# 加密用户的身份信息 生成激活token
class Register(View):
  ...
  serializer = Serializer(settings.SECRET_KEY, 3600)
  info = {'confirm': user.id}
  token = serializer.dumps(info)
  token = token.decode('utf-8')

4)发送邮箱

流程:Django网站--->smtp服务器--->目的邮箱

配置settings.py

class Register(View):
  ...
  # 发邮箱
  subject = '天天生鲜欢迎信息'
  message = '邮件正文'
  sender = settings.EMAIL_FROM
  receiver = [email]
  html_message = f'<h1>{username},欢迎您成为天天生鲜注册会员</h1>请点击下面链接激活您的账户' \
   f'<a href="http://127.0.0.1:8000/user/active/{token}">http://127.0.0.1:8000/user/active/{token}</a>'
  send_mail(subject, message, sender, receiver, html_message=html_message)

  

 

  

Django之天天生鲜项目的更多相关文章

  1. python 天天生鲜项目

    python 天天生鲜项目 django版:https://github.com/Ivy-1996/fresh flask版:https://github.com/Ivy-1996/flask-fre ...

  2. django天天生鲜项目

    .后台admin管理天天生鲜商品信息 models里 from django.db import modelsfrom tinymce.models import HTMLField #需要pip安装 ...

  3. 网站开发学习Python实现-Django的models学习-生鲜项目(6.3.2)

    @ 目录 1.说明 2.模型类的设计 3.代码的具体实现 4.详情地址 关于作者 1.说明 models是django的很重要的部分,所以深入研究. 本文章的所研究项目为黑马教育python课程中的项 ...

  4. 天天生鲜 - App设计

    天天生鲜-思路数据库设计 天天生鲜-各个App 全文检索 天天生鲜-静态文件 一.项目目录 daily_fresh_demo - daily_fresh_demo - df_cart # 购物车功能 ...

  5. python-django-天天生鲜项目

    1 需求分析 github源码:https://www.github.com/wangyingchuang/dailyfresh 1.1  用户模块 1) 注册页 l  注册时校验用户名是否已被注册. ...

  6. DJANGO-天天生鲜项目从0到1-015-部署-uWSGI+Nginx

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  7. DJANGO-天天生鲜项目从0到1-014-订单-订单评论

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  8. DJANGO-天天生鲜项目从0到1-013-订单-支付宝支付

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  9. DJANGO-天天生鲜项目从0到1-012-订单-用户订单页面

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

随机推荐

  1. vscode c++ 编译生成后,调试时无法命中断点

    //test.cpp #include <stdio.h> ; void print_line(char *str) { if (str != NULL) printf("%s\ ...

  2. Golang 笔记 3 if、switch、for、select语句

    一.if语句 Go的流程控制主要包括条件分支.循环和并发.  if语句一般由if关键字.条件表达式和由花括号包裹的代码块组成.在Go中,代码块必须由花括号包裹.这里的条件表达式是结果类型为bool的表 ...

  3. JavaSE assert断言的学习

    在Java中,assert关键字是从JAVA SE 1.4 引入的,为了避免和老版本的Java代码中使用了assert关键字导致错误,Java在执行的时候默认是不启动断言检查的(这个时候,所有的断言语 ...

  4. profile和bashrc四种的区别

    Linux下profile和bashrc四种的区别 12160阅读 0评论 /etc/profile./etc/bashrc.~/.bash_profile.~/.bashrc很容易混淆,他们之间有什 ...

  5. mui APP与服务器之间的交互原理

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  6. Oracle课程档案,第十五天

    restore:恢复数据文件 recover:写日志 1.redo(roll forward)重做 (前进) 2.undo(roll back) 撤销 (回滚) cp -r:删除一个目录 archiv ...

  7. MyBatis映射配置文件详解

    <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-// ...

  8. mysql InnoDB锁等待的查看及分析

    说明:前面已经了解了InnoDB关于在出现锁等待的时候,会根据参数innodb_lock_wait_timeout的配置,判断是否需要进行timeout的操作,本文档介绍在出现锁等待时候的查看及分析处 ...

  9. sonarqube安装的坑

    1.按照官网安装 结果启动不了,看了log日志以后,发现是es报错,不能以root权限启动

  10. Installing Ruby 2.2 on Centos7

    准备做redis-cluster,需要ruby2.2环境 开整环境:Centos7.2最小安装yum源:阿里的base和epel源 ********************************** ...