Day_06
用户名/密码登录
1.python生成图片+写文字
https://www.cnblogs.com/wupeiqi/articles/5812291.html
pip install pillow
2.session和cookie的关系
图片验证码思路:
3.页面显示
4.登录
LoginForm
class LoginForm(BootStrapForm,forms.Form):
username = forms.CharField(label="手机号/邮箱")
password = forms.CharField(
label='密码',
min_length=8,
max_length=16,
error_messages={
'min_length': "密码长度不能小于8个字符",
'max_length': "密码长度不能大于16个字符",
},
widget=forms.PasswordInput(),# 添加 render_value = True可以让密码保留
)
code = forms.CharField(label="图片验证码")
def __init__(self,request,*args,**kwargs):
super().__init__(*args,**kwargs)
self.request = request
def clean_password(self):
pwd = self.cleaned_data["password"]
return md5(pwd)
def clean_code(self):
"""图片验证码的钩子"""
# 读取用户输入的
code = self.cleaned_data["code"]
# 去session中获取自己的验证码
session_code = self.request.session.get("image_code")
if not session_code:
raise ValidationError("验证码已过期,请重新获取")
if code.strip().upper() != session_code:
raise ValidationError("验证码输入错误")
return code
视图中的login函数
def login(request):
""" 用户名和密码登录 """
if request.method == "GET":
form = LoginForm(request)
return render(request, "login.html", {"form": form})
form = LoginForm(request,data=request.POST)
if form.is_valid():
username = form.cleaned_data["username"]
password = form.cleaned_data["password"]
# user_object = models.UserInfo.objects.filter(username=username,password=password).first()
# 手机=手机 and 密码=密码 or 邮箱=邮箱 and 密码=密码
user_object = models.UserInfo.objects.filter(Q(email=username) | Q(mobile_phone=username)).filter(password=password).first()
if user_object:
# 用户名和密码正确
request.session["user_id"] = user_object.id
request.session.set_expiry(60*60*24*14)
return redirect("index")
form.add_error("username","用户名或密码错误")
return render(request,"login.html",{"form":form})