登录
验证码逻辑:
生成随机数之后,将随机数保存在服务端。待用户输入的时候,在验证和服务端是不是一致
验证码的显示:
login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<h1 class="text-center">登录页面</h1>
<div class="form-group">
<label for="username">用户名:</label>
<input type="text" id="username" class="form-control">
</div>
<div class="form-group">
<label for="username">密码:</label>
<input type="text" id="password" class="form-control">
</div>
<div class="form-group">
<label for="username">验证码:</label>
<div class="row">
<div class="col-md-6">
<input type="text" id="code" class="form-control">
</div>
<div class="col-md-6">
<img src="/get_code/" width="365" height="40" alt="">
</div>
</div>
</div>
<input type="button" class="btn btn-success" value="登录">
</div>
</div>
</div>
</body>
</html>
views.py
def login(request):
return render(request, "login.html")
def get_random():
return random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)
def get_code(request): #生成随机数验证码
# 最终步骤4:写图片验证码
img_obj = Image.new('RGB', (430, 35), get_random())
img_draw = ImageDraw.Draw(img_obj) # 产生一个画笔对象
img_font = ImageFont.truetype('static/font/qq.ttf', 30) # 字体样式 大小 # 可以在zhaozi.cn里面下载
# 随机验证码 五位数的随机验证码 数字 小写字母 大写字母
code = ''
for i in range(5):
random_upper = chr(random.randint(65, 90)) # A-Z
random_lower = chr(random.randint(97, 122)) # a-z
random_int = str(random.randint(0, 9)) # 0-9
# 从上面三个里面随机选择一个
tmp = random.choice([random_lower, random_upper, random_int])
# 将产生的随机字符串写入到图片上
# 为什么一个个写而不是生成好了之后再写
# 因为一个个写能够控制每个字体的间隙 而生成好之后再写的话
# 间隙就没法控制了
img_draw.text((i * 60 + 60, -2), tmp, get_random(), img_font)
# 拼接随机字符串
code += tmp
print(code)
# 随机验证码在登陆的视图函数里面需要用到 要比对 所以要找地方存起来并且其他视图函数也能拿到
request.session['code'] = code
io_obj = BytesIO()
img_obj.save(io_obj, 'png')
return HttpResponse(io_obj.getvalue())
写后端的登录功能
def login(request):
if request.method == "POST":
back_dic = {"code": 200, "msg": "登陆成功"}
username = request.POST.get("username")
password = request.POST.get("password")
code = request.POST.get("code")
# 验证参数(先验证验证码,不对的话,直接干掉)
# 验证码是否正确(先看不正确的情况,这种写法的阅读性特别好)
if request.session.get("code") != code:
back_dic["code"] = 1005
back_dic["msg"] = "验证码错误"
return JsonResponse(back_dic)
# 把拿到的密码hash一下,和库里面的数据比较(库里面就是hash的数据)
m = hashlib.md5()
m.update(password.encode("utf-8"))
password = m.hexdigest() # 现在密码就是hash之后的
res = models.UserInfo.objects.filter(username=username, password=password).first()
if not res: # 直接用户名密码一起查,模糊提示
back_dic["code"] = 1006
back_dic["msg"] = "用户名或者密码错误"
return JsonResponse(back_dic)
# 保存用户信息(都正确的情况下)
request.session["username"] = username
back_dic["url"] = "/home/" # 可以参考之前的功能,跳转到用户输入的压面
return JsonResponse(back_dic)
# 业务复杂的话,会存username,和全部用户信息,后面要哪个数据都可以从这个res里面取
# request.session["userinfo"] = res
return render(request, "login.html")
写首页
现在实现一个这样的功能:没有登录的时候,显示注册和登录,登录的时候不显示
在首页里面判断一下
现在写改密码
前段点击修改密码,直接出来一个弹框,或者一个新的页面都可以
模态框
下面开始写功能,绑定事件
def set_pwd(request):
if request.method == "POST":
back_dic = {"code": 200, "msg": "修改成功"}
old_pwd = request.POST.get("old_pwd")
new_pwd = request.POST.get("new_pwd")
re_pwd = request.POST.get("re_pwd")
# 验证参数:验证原密码是否正确
m = hashlib.md5()
m.update(old_pwd.encode("utf-8"))
old_pwd = m.hexdigest() # 现在密码就是hash之后的
res = models.UserInfo.objects.filter(username=request.session.get("username"),
password=old_pwd) # username在session中,password需要加密
if not res: # 没有查到原密码,原密码不正确
back_dic["code"] = 1007
back_dic["msg"] = "原密码不正确"
return JsonResponse(back_dic)
if new_pwd != re_pwd: # 如果两次输入的密码不正确
back_dic["code"] = 1008
back_dic["msg"] = "确认密码不正确"
return JsonResponse(back_dic)
# 修改操作
m = hashlib.md5()
m.update(new_pwd.encode("utf-8"))
new_pwd = m.hexdigest() # 现在密码就是hash之后的
ret = models.UserInfo.objects.filter(id=request.session.get("id")).update(password=new_pwd) # 这里要用id来筛选,因为username是会重复的。
return JsonResponse(back_dic)
首页现在有了导航栏了,缺左边,右边中间的
{#下面是3块,先分一下#}
<div CLASS="container-fluid">
{#左边#}
<div class="col-md-2">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">Panel title</h3>
</div>
<div class="panel-body">
Panel content
</div>
</div>
<div class="panel panel-success">
<div class="panel-heading">
<h3 class="panel-title">Panel title</h3>
</div>
<div class="panel-body">
Panel content
</div>
</div>
<div class="panel panel-info">
<div class="panel-heading">
<h3 class="panel-title">Panel title</h3>
</div>
<div class="panel-body">
Panel content
</div>
</div>
</div>
{#中间#}
<div class="col-md-8"></div>
{#右边#}
<div class="col-md-2">
<div class="panel panel-primary">
<div class="panel-heading">
<h3 class="panel-title">Panel title</h3>
</div>
<div class="panel-body">
Panel content
</div>
</div>
<div class="panel panel-success">
<div class="panel-heading">
<h3 class="panel-title">Panel title</h3>
</div>
<div class="panel-body">
Panel content
</div>
</div>
<div class="panel panel-info">
<div class="panel-heading">
<h3 class="panel-title">Panel title</h3>
</div>
<div class="panel-body">
Panel content
</div>
</div>
</div>
</div>
两边的弄好了,现在就差中间的了,中间的就是文章了,就是数据了。这里我们利用后台管理,admin
先创建超级用户
现在我们要添加文章,就需要添加文章表
这个admin后台,就是给表一个增删改查的功能
null=True,是限制数据库可以为空。还需要加上 blank=True
现在还没有添加标签表,每个文章都需要标签的。我们现在添加一下
站点是跟user表关联的,我们在user表里面添加一下站点信息
这个就是把用户和站点关联起来了,用户个站点是一对一的关系
在加一下第三张表,是文章和标签之间关系的
现在数据添加好了,就需要在页面上把读出来了
在def home(request)里面,还是得搞文章的样式
现在就是要给他加东西
但是感觉文章标题有点奇怪,调整一下
但是现在感觉上下有点挤,可以加一个水平线