Django Blog之注册认证
Blog之注册认证
一、setting设置
添加头像后存到指定位置,并能作为静态文件被访问。
#存到根目录下的media文件夹中
MEDIA_ROOT = os.path.join(BASE_DIR,"media")
#可以在浏览器中访问 MEDIA_URL = "/media/"
二、url设置
from django.conf.urls import url from django.contrib import admin from django.views.static import serve from blog import settings from app01 import views urlpatterns = [ url(r'^admin',admin.site.urls), url(r'^index/', views.index), #首页 url(r'^login/', views.login), #登录页面 url(r'^get_valid_img/', views.get_valid_img), #获取图片验证 url(r'^register/', views.register), #获取图片验证 url(r'^$', views.login), #无效路径返回登录页面 # media 配置 url(r'^media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}), ]
三、viws.py
# 登录注册功能 from django import forms from django.forms import widgets from .models import UserInfo from django.core.exceptions import NON_FIELD_ERRORS, ValidationError class RegisterForm(forms.Form): user = forms.CharField(max_length=8, label="用户名", widget=widgets.TextInput(attrs={"class":"form-control"}) ) pwd = forms.CharField(min_length=4,label="密码", widget=widgets.PasswordInput(attrs={"class":"form-control"}) ) repeat_pwd = forms.CharField(min_length=4,label="确认密码", widget =widgets.PasswordInput(attrs={"class":"form-control"}) ) email = forms.EmailField(label="邮箱", widget=widgets.EmailInput(attrs={"class":"form-control"}) ) def clean_user(self): val = self.cleaned_data.get("user") ret = UserInfo.objects.filter(username=val) if not ret: return val else: raise ValidationError("该用户已存在") def clean(self): if self.cleaned_data.get("pwd") == self.cleaned_data.get("repeat_pwd"): return self.cleaned_data else: raise ValidationError("两次密码不一致!") from django.http import JsonResponse def register(request): if request.method == "POST": res = {"user": None,"error_dict": None} #取出所有的POST请求数据 form = RegisterForm(request.POST) if form.is_valid(): print(form.cleaned_data) # {"user":"yuan","pwd":"12345","repeat_pwd":"12","email":"123"} print(request.FILES) user = form.cleaned_data.get("user") print("="*120) print("user", user) print("="*120) pwd = form.cleaned_data.get("pwd") email = form.cleaned_data.get("email") avatar = request.FILES.get("avatar") print("user", user) if avatar: user=UserInfo.objects.create_user(username=user,password=pwd,email=email,image=avatar) else: user = UserInfo.objects.create_user(username=user, password=pwd,email=email) res["user"] = user.username else: print(form.errors) # {"repeat_pwd":["....",],"email":["......",]} print(form.cleaned_data) res["error_dict"] = form.errors return JsonResponse(res) form = RegisterForm() return render(request, "register.html", locals())
from django.shortcuts import render, redirect, HttpResponse # Create your views here. from django.contrib import auth from django.http import JsonResponse def index(request): # 如果数据库找不到此用户,跳转到登录页面 if not request.user.username: return redirect("/login/") return render(request, "index.html") # def login(request): # if request.is_ajax():#method=="POST" # user = request.POST.get("user") # pwd = request.POST.get("pwd") # valid_code = request.POST.get("valid_code") # res = {"state":False,"msg":None} # # valid_str = request.session.get("valid_str") # # if valid_str.upper()==valid_str.upper(): # user=auth.authenticate(username=user,password=pwd) # if user: # res["state"]=True # auth.login(request,user) # else: # res["msg"] = "username or pwd error" # else: # res["msg"] = "验证码错误!" # return JsonResponse(res) # return render(request,"login.html") # # def get_valid_img(request): # import PIL # # from PIL import Image # from PIL import ImageDraw, ImageFont # import random # def get_random_color(): # return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) # # image = Image.new("RGB", (250, 40), get_random_color()) # # # 生成五个随机字符 # draw = ImageDraw.Draw(image) # font = ImageFont.truetype("static/fonts/kumo.ttf", size=32) # temp = [] # for i in range(5): # random_num = str(random.randint(0, 9)) # random_low_alpha = chr(random.randint(97, 122)) # random_upper_alpha = chr(random.randint(65, 90)) # random_char = random.choice([random_num, random_low_alpha, random_upper_alpha]) # draw.text((24 + i * 36, 0), random_char, get_random_color(), font=font) # # # 保存随机字符 # temp.append(random_char) # # # 噪点噪线 # # width=250 # # height=40 # # for i in range(100): # # x1=random.randint(0,width) # # x2=random.randint(0,width) # # y1=random.randint(0,height) # # y2=random.randint(0,height) # # draw.line((x1,y1,x2,y2),fill=get_random_color()) # # # # for i in range(400): # # draw.point([random.randint(0, width), random.randint(0, height)], fill=get_random_color()) # # x = random.randint(0, width) # # y = random.randint(0, height) # # draw.arc((x, y, x + 4, y + 4), 0, 90, fill=get_random_color()) # # # 在内存生成图片 # from io import BytesIO # f = BytesIO() # image.save(f, "png") # data = f.getvalue() # f.close() # # # ["a","2","2","s"] # valid_str = "".join(temp) # "a22s" # print("valid_str", valid_str) # # request.session["valid_str"] = valid_str # # return HttpResponse(data) def login(request): if request.is_ajax(): user = request.POST.get("user") pwd = request.POST.get("pwd") valid_code = request.POST.get("valid_code") res = {"state": False, "msg": None} valid_str = request.session.get("valid_str") #通过session取到用户输入的验证码信息 if valid_code.upper() == valid_str.upper(): user = auth.authenticate(username=user,password=pwd) #从数据库进行比对,没有用户则返回空 if user: res["state"] = True auth.login(request, user) #登录校验 else: res["msg"] = "用户名或密码错误" else: res["msg"] = "验证码错误" return JsonResponse(res) #对res进行序列化 return render(request, "login.html") # 图片验证码 def get_valid_img(request): import PIL from PIL import Image from PIL import ImageDraw, ImageFont import random def get_random_color(): return (random.randint(0,255),random.randint(0,255), random.randint(0,255)) image = Image.new("RGB", (255, 38), get_random_color()) # 生成五个随机字符串 draw = ImageDraw.Draw(image) font = ImageFont.truetype("static/fonts/kumo.ttf", size=32) temp = [] for i in range(5): random_num = str(random.randint(0, 9)) random_low_alpha = chr(random.randint(97, 122)) #生成a到z之间的一个字母 random_up_alpha = chr(random.randint(65, 90)) #生成A到Z之间的一个字母 random_char = random.choice([random_num, random_low_alpha, random_up_alpha]) draw.text((24+i*36,0), random_char, get_random_color(), font=font) #保存随机字符 temp.append(random_char) # 噪点噪线 width = 255 height=40 # 噪线 # for i in range(10): # x1=random.randint(0,width) # x2=random.randint(0,width) # y1=random.randint(0,height) # y2=random.randint(0,height) # draw.line((x1,y1,x2,y2),fill=get_random_color()) # # 噪点 # for i in range(20): # draw.point([random.randint(0, width), random.randint(0, height)], fill=get_random_color()) # x = random.randint(0, width) # y = random.randint(0, height) # draw.arc((x, y, x + 4, y + 4), 0, 90, fill=get_random_color()) #在内存生成图片 from io import BytesIO f = BytesIO() image.save(f, "png") data = f.getvalue() #获取图片的数据 f.close() # ["a","2","2","s"] valid_str = "".join(temp) #将生成的图片中的列表转换成字符串 "a22s" print("valid_str", valid_str) print("*"*120) print(temp) request.session["valid_str"] = valid_str #将图片中字符串存到session表中 return HttpResponse(data) #返回获取的图片数据 # 登录注册功能 from django import forms from django.forms import widgets from .models import UserInfo from django.core.exceptions import NON_FIELD_ERRORS, ValidationError class RegisterForm(forms.Form): user = forms.CharField(max_length=8, label="用户名", widget=widgets.TextInput(attrs={"class":"form-control"}) ) pwd = forms.CharField(min_length=4,label="密码", widget=widgets.PasswordInput(attrs={"class":"form-control"}) ) repeat_pwd = forms.CharField(min_length=4,label="确认密码", widget =widgets.PasswordInput(attrs={"class":"form-control"}) ) email = forms.EmailField(label="邮箱", widget=widgets.EmailInput(attrs={"class":"form-control"}) ) def clean_user(self): val = self.cleaned_data.get("user") ret = UserInfo.objects.filter(username=val) if not ret: return val else: raise ValidationError("该用户已存在") def clean(self): if self.cleaned_data.get("pwd") == self.cleaned_data.get("repeat_pwd"): return self.cleaned_data else: raise ValidationError("两次密码不一致!") from django.http import JsonResponse def register(request): if request.method == "POST": res = {"user": None,"error_dict": None} #取出所有的POST请求数据 form = RegisterForm(request.POST) if form.is_valid(): print(form.cleaned_data) # {"user":"yuan","pwd":"12345","repeat_pwd":"12","email":"123"} print(request.FILES) user = form.cleaned_data.get("user") print("="*120) print("user", user) print("="*120) pwd = form.cleaned_data.get("pwd") email = form.cleaned_data.get("email") avatar = request.FILES.get("avatar") print("user", user) if avatar: user=UserInfo.objects.create_user(username=user,password=pwd,email=email,image=avatar) else: user = UserInfo.objects.create_user(username=user, password=pwd,email=email) res["user"] = user.username else: print(form.errors) # {"repeat_pwd":["....",],"email":["......",]} print(form.cleaned_data) res["error_dict"] = form.errors return JsonResponse(res) form = RegisterForm() return render(request, "register.html", locals())
四、HTML页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>注册页面</title> <link rel="stylesheet" href="/static/bs/bootstrap.min.css"> <style> .container{ margin-top: 120px; } {#为头像设置样式#} #avatar{ display: none; } .avatar{ width: 60px; height: 60px; margin-left: 15px; } </style> </head> <body> <div class="container"> <div class="row"> <div class="col-md-6 col-md-offset-3"> <form action="" novalidate> {% csrf_token %} {% for field in form %} <div class="form-group"> <label for="">{{ field.label }}</label> {{ field }} <span class="error pull-right"></span> </div> {% endfor %} <div class="form-group"> <label for="avatar">头像<img class="avatar" src="/static/img/default.png" alt=""></label> <input type="file" id="avatar"> </div> <input type="button" class="btn btn-default reg_btn pull-right" value="提交"><span class="error" style="color: red;margin-left: 20px"></span> </form> </div> </div> </div> <script src="/static/js/jquery-3.2.1.min.js"></script> <script src="/static/csrf/init_ajax.js"></script> <script> //图像预览 $("#avatar").change(function () { //获取头像文件的数据 var choose_file=$(this)[0].files[0]; //实例一个读取文件对象 var reader = new FileReader(); reader.readAsDataURL(choose_file); //上传文件 reader.onload = function () { $(".avatar").attr("src",reader.result) //result读取文件所在路径 } }); //注册事件 {#$(".reg_btn").click(function () {#} {# var formdata = new FormData();#} {# formdata.append("user",$("#id_user").val());#} {# formdata.append("pwd",$("#id_pwd").val());#} {# formdata.append("repeat_pwd",$("#id_repeadt_pwd").val());#} {# formdata.append("email",$("#id_email").val());#} {# formdata.append("avatar",$("#avatar")[0].files[0]);#} {# console.log(formdata);#} {#alert("123");#} {# $.ajax({#} {# url:"",#} {# type:"post",#} {# //文件获取时固定写法#} {# processData:false,#} {# contentType:false,#} {# data:formdata,#} {# success:function (data) {#} {# if (data.user){#} {# //注册成功#} {# location.href="/login/"#} {# }#} {# else {#} {# //注册失败#} {# console.log(data.error_dict);#} {# //清空错误信息#} {# $("form span").html("");#} {# $("form.form-group").removeClass("has-error");#} {# //加载错误信息#} {# $.each(data.error_dict,function (field,error_list) {#} {# if(field=="__all__"){#} {# //取出错误信息,并设置颜色为红色#} {# $("#id_repeat_pwd").next().html(error_list[0]).css("color","red");#} {# //为重复密码的输入框加class#} {# $("#id_repeat_pwd").parent().addClass("has-error");#} {# $("id_repeat_pwd").prev().addClass("has-error")#} {##} {# }#} {##} {# $("#id_"+field).next().html(error_list[0]).css("color","red");#} {# $("#id_"+field).parent().addClass("has-error")#} {# })#} {# }#} {# }#} {##} {# })#} {#{)#} // 注册事件 $(".reg_btn").click(function () { var formdata=new FormData(); formdata.append("user",$("#id_user").val()); formdata.append("pwd",$("#id_pwd").val()); formdata.append("repeat_pwd",$("#id_repeat_pwd").val()); formdata.append("email",$("#id_email").val()); formdata.append("avatar",$("#avatar")[0].files[0]); {#formdata.append("csrfmiddlewaretoken",$("[name='csrfmiddlewaretoken']").val());#} $.ajax({ url:"", type:"post", processData:false, contentType:false, data:formdata, success:function (data) { //console.log(data) if (data.user){ // 注册成功 location.href="/login/" } else {// 注册失败 {#console.log(data.error_dict);#} // q清空错误信息 $("form span").html(""); $("form .form-group").removeClass("has-error"); // 加载错误信息 $.each(data.error_dict,function (field,error_list) { if(field=="__all__"){ $("#id_repeat_pwd").next().html(error_list[0]).css("color",'red'); $("#id_repeat_pwd").parent().addClass("has-error"); $("#id_pwd").next().html(error_list[0]).css("color",'red'); $("#id_pwd").parent().addClass("has-error") } $("#id_"+field).next().html(error_list[0]).css("color",'red'); $("#id_"+field).parent().addClass("has-error") }) } } }) }) </script> </body> </html>

浙公网安备 33010602011771号