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

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

进行登录功能的实现

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配置方法

  • 推荐使用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就行

成功显示如下
在这里插入图片描述

发布了62 篇原创文章 · 获赞 38 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/happygjcd/article/details/104014860