Django项目记录(一)用户登录与动态验证码的实现

现在开始准备学习Python web的知识,并开发一个简化版慕课网,往运维开发的方向学习

建议先看这个,理解一下原理
Django登录原理以及Session与Cookie详解

目录如下

在这里插入图片描述

进行登录功能的实现

Django里面有几个经常用到的方法
from django.contrib.auth import authenticate,login,logout
其中login函数的参数是request与user,login()源码解析
logout()函数只需要request参数就行,用来进行登录的退出
from django.urls import reversereverse方法第一个是urls.py里面的UrlName,是一个路由f反解析函数,可以通过名字找到对应的网址。
logout方法用于退出,传一个request参数进去就行。authenticate方法是Django内置的用于完成账号密码认证的
request.user.is_authenticated用于进行判断用户是否已经登录,当用户已经登录,就是True,Django2里面is_authenticated是一个属性,不是方法,不用加括号

from django.shortcuts import render
from django.views.generic import View
# 这个authenticate方法是Django内置的用于完成账号密码认证的,要记住
# login方法是用来登录我们的用户
from django.contrib.auth import authenticate, login, logout
# reverse方法使我们只需要通过urlName就可以找到对应的页面
from django.urls import reverse
from django.http import HttpResponseRedirect


# Create your views here.

# 记得所以的class都要继承View
# 写一个退出登录的View


class LogoutView(View):
    def get(self, request, *args, **kwargs):
        logout(request)
        if request.user.is_authenticated:
            return HttpResponseRedirect(reverse('logout'))
        else:
            return HttpResponseRedirect(reverse('login'))


class LoginView(View):
    # 重载get与post方法
    def get(self, request, *args, **kwargs):
        # 判断用户是否已经登录,登录了就重定向到index页面
        # 注意这里属性是is_authenticated不要写错了,记得Django2中这是属性不是方法,所以不加括号
        if request.user.is_authenticated:
            return HttpResponseRedirect(reverse('index'))
        return render(request, 'login.html')

    def post(self, request, *args, **kwargs):
        user_name = request.POST.get("username", "")
        password = request.POST.get("password")
        user = authenticate(username=user_name, password=password)
        if user:
            # login函数用来登录用户记得加上request和user;两个参数
            login(request, user)
            return HttpResponseRedirect(reverse('index'))
        else:
            return render(request, "login.html", {"msg": "用户名或密码错误"})
图片验证码的使用

在使用动态验证码进行登录的时候,通常很多网页会有个图片验证码的东西,今天我也学习了一下这方面功能的实现

GitHub上面有一个开源项目captcha(验证码),我们可以直接把它配置进来,
django-simple-captcha配置方法
form.py文件的代码如下:

from django import forms
from captcha.fields import CaptchaField


class LoginForm(forms.Form):
    username = forms.CharField(required=True, min_length=2)
    password = forms.CharField(required=True, min_length=3)


class DynamicLoginForm(forms.Form):
    mobile = forms.CharField(required=True, max_length=11, min_length=11)
    captcha = CaptchaField()

  • 推荐使用pip安装,bug会比较少,
  • 安装完后,把captcha配置到INSTALL_APPS里面,然后直接进行migrate即可
  • 接下来配置url
from django.conf.urls import url,include
 url(r'^captcha/', include('captcha.urls')),
  • migrate完了之后按照它的步骤操作,我们创建一个forms.py文件
from django import forms
from captcha.fields import CaptchaField


class LoginForm(forms.Form):
    username = forms.CharField(required=True, min_length=2)
    password = forms.CharField(required=True, min_length=3)


class DynamicLoginForm(forms.Form):
    captcha = CaptchaField()
  • 接下来是编辑我们的view逻辑,先导入from . import forms,接着在view里面实例化一个DynamicLoginForm对象,然后使用render传值到前端
class LoginView(View):
    # 重载get与post方法
    def get(self, request, *args, **kwargs):
        # 判断用户是否已经登录,登录了就重定向到index页面
        # 注意这里属性是is_authenticated不要写错了,记得Django2中这是属性不是方法,所以不加括号
        if request.user.is_authenticated:
            return HttpResponseRedirect(reverse('index'))
        login_form = forms.DynamicLoginForm()
        return render(request, 'login.html', {
            "login_form": login_form
        })
  • 在前端表单里面加上{{ login_form.captcha }}即可,因为Django里面对form取某一列,或者说某个字段,其实它默认会给我们生成HTML页面,如果不想它生成页面,直接加个value就行

成功显示如下
在这里插入图片描述
有兴趣可看下一篇:使用Redi保存验证码

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值