from django.shortcuts import render,HttpResponse,redirect
from django.contrib import auth
from django.http import JsonResponse
from django import forms
from django.forms import widgets
from .models import *
def login(request):
if request.method=="POST":
user=request.POST.get("username")
pwd=request.POST.get("password")
input_valid_codes=request.POST.get("valid_code")
# 校验验证码
session_valid_codes=request.session.get("insert_valid")
print(session_valid_codes,'222')
'''
request.COOKIE['sessionId'] #取出随机字符串
in session表中
models.session.object.filter(sessionid=取出随机字符串).values
'''
login_response={"user":None,"error_msg":""} #定义一个第三方变量存储用于判断
if session_valid_codes.upper()==input_valid_codes.upper(): #用户在浏览器输入大小写混合、大写、小写 均转为大写进行判断。(忽略大小写)
user=auth.authenticate(username=user,password=pwd)#再判断输入的用户名、密码与数据库存储的是否相同
if user: #用户名密码如果为真
auth.login(request,user) #验证登录
login_response["user"]=user.username #用户名赋给login_response的 'user'
print(user.username)
else:
login_response["error_msg"] = "username or password error!" #否则赋值给错误
else:
login_response["error_msg"]="valid_code error!" #输入的验证码与输入的不一致则返回error提示
import json
return HttpResponse(json.dumps(login_response))
else:
return render(request,"login.html")
# Create your views here.
# 方式1:(仅仅实现了渲染本地静态图片当做验证码的功能)
# from cnblog项目实战 import settings
# import os
# path=os.path.join(settings.BASE_DIR,"static","img","linhaifeng.jpg")
# with open(path,"rb") as f:
# data=f.read()
#方式二要实现图片自动实现生成一张图片(缺点是保存到本地了)
# from PIL import Image
# img=Image.new(mode='RGB',size=(120,30),color=(0,110,168)) #生成一张图片长宽120,30,颜色是三基色(RGB)因子调色而成
# img.save( open('whq.png','wb') ) #以二进制方式读写保存这张图片
# with open('whq.png', 'rb') as f: #以二进制方式读图片
# data = f.read() #读出的结果保存赋值给data
# return HttpResponse(data)#交给浏览器渲染数据
# 方法三实现把图片保存到内存
# from io import BytesIO #该模块实现了把文件保存到内存中
# f=BytesIO()
# from PIL import Image
# img=Image.new(mode='RGB',size=(90,30),color=(0,19,168)) #生成一张图片长宽120,30,颜色是三基色(RGB)因子调色而成
# img.save( f,'png') #保存这个文件的句柄+png后缀
# data=f.getvalue()
# return HttpResponse(data)#交给浏览器渲染数据
import random
def get_randon_color():
return (random.randint(123,234),random.randint(123,234),random.randint(123,234))
def get_valid_img(request):
from PIL import Image, ImageDraw, ImageFont
from io import BytesIO
# 生成图片
image = Image.new("RGB", (280, 40), get_randon_color()) #280, 40图片大小
#
# #生成一枝画笔
draw = ImageDraw.Draw(image)
# font = ImageFont.truetype("static/font/kumo.ttf/", size=35)#指定字体,以及大小
#生成随机数
keep_valid_codes = ""
for i in range(5):
random_num = str(random.randint(0, 9))#生成0,9数字转换字符串
random_lower_alf = chr(random.randint(97, 122))#生成大写字母
random_upper_alf = chr(random.randint(65, 90))#生成小写字母
random_char = random.choices([random_num, random_lower_alf, random_upper_alf])[0]#任意选一个
print(random_char, "===")
draw.text((20 + i * 50, 0), random_char, fill=get_randon_color())
keep_valid_codes += random_char
f = BytesIO() #实例化一个内存IO对象
image.save(f, "png")#保存成png格式
data = f.getvalue() #取图片+随机数的图片
print(keep_valid_codes,keep_valid_codes.upper())
s=''.join(keep_valid_codes)
request.session['insert_valid']=s
'''
Django:做的事件
1:浏览器中
Set_cookie('sessionId','随机字符串')
2:Django的中Django_session 表中
sessionKey字段 sessiondata
'随机字符串' {insert_valid:keep_valid_codes}
'''
return HttpResponse(data) #返回带随机数的图片
def index(request):
return render(request,'index.html')