基于Django的线上果蔬商城(三):登录与注册

注册

修改前端发来的注册页面(register)

{% load staticfiles %}

{% static 'xxxxxxxx' %}

<form method="post" action="xxxxxxx">
{% csrf_token %}
</form>

处理注册的类(RegisterView)

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()

        # 发送激活邮件,包含激活链接: http://127.0.0.1:8000/user/active/3
        # 激活链接中需要包含用户的身份信息, 并且要把身份信息进行加密

        # 加密用户的身份信息,生成激活token
        serializer = Serializer(settings.SECRET_KEY, 3600)
        info = {'confirm':user.id}
        token = serializer.dumps(info) # bytes
        token = token.decode()

        # 发邮件
        send_register_active_email.delay(email, username, token)

        # 返回应答, 跳转到首页
        return redirect(reverse('goods:index'))

利用163免费SMTP服务器发送激活邮件

settings

# 发送邮件配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
# smpt服务地址
EMAIL_HOST = 'smtp.163.com'
# 25替换为465端口
EMAIL_PORT = 465
#打开ssl协议
EMAIL_USE_SSL = True
# 发送邮件的邮箱
EMAIL_HOST_USER = 'xxxxxxx'
# 在邮箱中设置的客户端授权密码
EMAIL_HOST_PASSWORD = 'xxxxxxxx'
# 收件人看到的发件人
EMAIL_FROM = '每日生鲜<xxxxxxxx>'

from django.core.mail import send_mail

def send_register_active_email(to_email, username, token):
    """发送激活邮件"""
    # 组织邮件信息
    subject = '每日生鲜欢迎信息'
    message = ''
    sender = settings.EMAIL_FROM
    receiver = [to_email]
    html_message = '<h1>%s, 欢迎您成为每日生鲜注册会员</h1>请点击下面链接激活您的账户<br/><a href="http://127.0.0.1:8000/user/active/%s">http://127.0.0.1:8000/user/active/%s</a>' % (username, token, token)

    send_mail(subject, message, sender, receiver, html_message=html_message)
    time.sleep(5)

celery处理者从0配置

配置虚拟环境:
pip install virtualenv

virtualenv的扩展包virtualenvwrapper:pip install virtualenvwrapper

创建一个文件夹,用于存放所有的虚拟环境:
     命令:mkdir -p /home/python/virtualenvs (目录自定义)

设置环境变量,把下面两行添加到~/.bashrc里。
   命令:vim ~/.bashrc
     添加:export WORKON_HOME=/home/python/virtualenvs (绝对路径)
     添加:source /usr/bin/virtualenvwrapper.sh
     命令::wq!或者:x----保存设置
     命令:source ~/.bashrc ----使修改生效

创建虚拟环境的命令:mkvirtualenv -p pythonexepath venvname
-p ----参数(使用–python也可以);
pythonexepath ----指定Python版本的文件路径
venvname ----虚拟环境名称

启动/切换虚拟环境命令:workon [venvname]

删除虚拟环境命令:rmvirtualenv [venvname]

退出虚拟环境命令:deactivate

查看虚拟环境安装的包:pip freeze

配置Redis数据库

  1. 首先从Redis官网下载Redis安装:wget http://download.redis.io/releases/redis-5.0.5.tar.gz
  2. 解压Redis:tar -zxvf redis-5.0.5.tar.gz
  3. 进入解压好的目录并编译Redis
    cd redis-5.0.5
    make
  4. 编译完成后进入src目录进行安装:cd src
    如果默认使用默认安装路径(/usr/local/bin)则直接使用如下命令
    sudo make install
    如果安装到指定的目录则添加一个参数PREFIX
    sudo make install PREFIX=/usr/local/redis
  5. 安装完成后进入/usr/local/redis目录可以看到有一个bin目录
    在这里插入图片描述

文件介绍:

  • redis-benchmark Redis性能测试工具
  • redis-check-aof 修复有问题的AOF文件
  • redis-check-rdb 修复有问题的dump.rdb文件
  • redis-cli Redis客户端
  • redis-sentinel Redis哨兵,做集群用
  • redis-server Redis服务端

配置修改
从之前的Redis解压目录拷贝Redis配置文件到指定目录

sudo mkdir /usr/local/redis/etc
sudo cp redis.conf /usr/local/redis/etc/

打开redis.conf修改以下几个地方

sudo vi /usr/local/redis/etc/redis.conf
# 注释掉bind 127.0.0.1,bind用于限制访问Redis的机器ip,直接关掉,方便后续做集群或其他客户端进行连接
# bind 127.0.0.1

# 修改daemonize no为yes,让Redis可以后台启动
deamonize yes

# 配置日志文件目录logfile ""
logfile "/usr/local/redis/log/redis_log.log"

# 为Redis添加服务密码# requirepass foobared,这里我们将密码设置为123456
requirepass 123456

# 修改rdb文件存储路径,rdb文件是Redis默认的数据持久化到磁盘的文件,默认配置为dir ./,则存储在相对目录
# 即每次运行redis-server的目录,这里我们修改为绝对路径,以便于后续的管理
dir /usr/local/redis/rdb/

#:wq 保存并退出

上述配置修改完成后,由于我的用户不是root,没法直接操作/usr/local/redis下的目录,因此无法写入日志文件和将数据持久化到磁盘,所以在启动服务之前,需要先修改相应的文件权限

# 创建log目录
sudo mkdir /usr/local/redis/log
# 创建log文件
sudo touch /usr/local/redis/log/redis_log.log
# 给log文件添加所有用户的写权限
sudo chmod a+w /usr/local/redis/log/redis_log.log
# 创建存放rdb文件的目录
sudo mkdir /usr/local/redis/rdb
# rdb文件的目录添加读写权限
sudo chmod a+w /usr/local/redis/rdb/

运行Redis
使用之前修改的redis.conf运行Redis

/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf

运行完成后我们可以查看Redis的日志是否运行正常

tail -100f /usr/local/redis/log/redis_log.log

如果看到以下信息说明Redis已经成功运行
在这里插入图片描述

中间人

# 创建一个Celery类的实例对象
app = Celery('celery_tasks.tasks', broker='redis://:xxxxx密码xxxx@xxxxxhostxxxxx/第几个数据库')

# 定义任务函数
@app.task
def send_register_active_email(to_email, username, token):

任务处理者

需要在服务器的虚拟环境中安装如下包:
在这里插入图片描述

# 在任务处理者一端加这几句,初始化Django项目
import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "Winston_freshmarket.settings")
django.setup()

将Django项目导入到服务器上,进入项目根目录:
在这里插入图片描述
运行命令:

celery -A celery_tasks.tasks worker -l info

在这里插入图片描述
处理者就绪

单元测试

在这里插入图片描述
查看服务器的celery info信息:succeeded
在这里插入图片描述
查看邮箱信息:
在这里插入图片描述
再次回顾celery的整体流程:
##

登录

使用Redis存储激活用户的session

settings配置

# Django的缓存配置
CACHES = {
    "default": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://:xxxxxx@xxxxxxxxx/8",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }
}

# 配置session存储
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

查看远程服务器:

/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 -a "xxxxxxxx"
# 参数说明
# -h Redis服务端ip
# -p Redis服务端端口,默认是6379
# -a Redis服务端密码,之前步骤中设置的123456

在这里插入图片描述
完整代码

class LoginView(View):
    """登录"""
    def get(self, request):
        '''显示登录页面'''
        # 判断是否记住了用户名
        if 'username' in request.COOKIES:
            username = request.COOKIES.get('username')
            checked = 'checked'
        else:
            username = ''
            checked = ''

        # 使用模板
        return render(request, 'login.html', {'username':username, 'checked':checked})

    def post(self, request):
        """登录校验"""
        # 接收数据
        username = request.POST.get('username')
        password = request.POST.get('pwd')

        # 校验数据
        if not all([username, password]):
            return render(request, 'login.html', {'errmsg':'数据不完整'})

        # 业务处理:登录校验
        user = authenticate(username=username, password=password)
        if user is not None:
            # 用户名密码正确
            if user.is_active:
                # 用户已激活
                # 记录用户的登录状态
                login(request, user)

                # 跳转到首页
                response = redirect(reverse('goods:index')) # HttpResponseRedirect

                # 判断是否需要记住用户名
                remember = request.POST.get('remember')

                if remember == 'on':
                    # 记住用户名
                    response.set_cookie('username', username, max_age=7*24*3600)
                else:
                    response.delete_cookie('username')

                # 返回response
                return response
            else:
                # 用户未激活
                return render(request, 'login.html', {'errmsg':'账户未激活'})
        else:
            # 用户名或密码错误
            return render(request, 'login.html', {'errmsg':'用户名或密码错误'})
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值