现在开始准备学习Python web的知识,并开发一个简化版慕课网,往运维开发的方向学习
进行登录功能的实现
Django里面有几个经常用到的方法
from django.contrib.auth import authenticate,login,logout
其中login函数的参数是request与user,login()源码解析
logout()函数只需要request参数就行,用来进行登录的退出
from django.urls import reverse
reverse方法第一个是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就行
成功显示如下