MyBlog(五) -- 用户注册页面完善
文章目录
- 前言
- 一、用户数据提交
- 1. 表单
- 2. 校验数据
- 3. 模版文件
- 1. wait_start
- 2. user_register
- 二、验证
- 1. 发送邮件
- 1. 注册163邮箱后登录并设置
- 2. 开启IMAP/SMTP服务, IMAP/SMTP服务
- 3. 新增授权密码
- 2.邮箱内容
- 3.点击注册
- 4.发送邮件
- 5. 激活账号
- 1. 完善激活功能 -- user_active
- 2. 完善登录功能的界面
- 3. 用户登录校验模块
- 4. 前端文件
- 1. user_login
- 2. 404页面
- 3. wait_start
前言
在上一节我们实现了用户注册的基础页面,但是作为用户注册页面,需要有一定的基本功能,否则就会出现大量冗杂信息,比如一个人可以注册多个用户,所以这时候我们就需要设置一个用户的验证页面,比如验证码等等!!
一、用户数据提交
此时注册页面已经能够展示出来, 当我们输入内容点击注册时, 怎样对数据进行校验, 同时怎样真正的将数据注册到咱们的博客里面去呢?
1. 表单
- 通过表单可以快速帮我们对数据进行校验以及错误时的反馈
- 在 users app文件夹里面创建一个 forms.py 文件, 然后在里面创建表单
from django import formsclass RegisterForm(forms.Form):"""用户注册的表单: 当用户点击注册时, 可以通过我们所写的表单字段来对数据进行校验email: 用来校验用户提交的邮箱, EmailField(forms中定义的邮箱类型), required(保存用户提交的数据不能为空), error_messages(如果有错误, 则根据字典中错误的key来提示对应信息)password: 用来校验用户提交的密码, CharField(forms中定义的字符串类型)nick_name: 用来校验用户提交的名字"""email = forms.EmailField(required=True, error_messages={'required': '请填写邮箱', 'invalid': '请输入有效的邮箱'})password = forms.CharField(required=True, error_messages={'required': '请输入密码'})nick_name = forms.CharField(required=True, error_messages={'required': '请输入昵称'})
2. 校验数据
- 表单已经写完, 可以在视图文件中通过表单对前端注册所提交的数据进行校验
from django.shortcuts import render
from .models import UserProfile
from .forms import RegisterForm
def user_register(request):"""用户注册: 当进入到此路由应该显示注册页面, 但我们提交注册的数据时应该对数据进行处理所以可以根据不同的请求方法来做不同的请求事件"""if request.method == 'GET':# 如果是get请求则直接进入到注册页面return render(request, 'user_register.html')else:# 如果是post请求, 则代表是点击了注册进行提交数据register_form = RegisterForm(request.POST) # 生成表单进行验证if register_form.is_valid(): # 调用forms表单的方法来校验# 如果校验正确, 获取前端提交的数据email = register_form.cleaned_data.get('email')pwd = register_form.cleaned_data.get('password')nick_name = register_form.cleaned_data.get('nick_name')# 在用户类当中查询当前用户是否存在, 因为将email保存到username字段, 所以通过这样来查询数据user = UserProfile.objects.filter(username=email)# 如果能够查询到数据, 就代表该邮箱已经注册, 查询不到代表该邮箱还没注册if user:# 如果用户存在, 则回到注册页面, 同时给于一定的提示, 该字符串通过模板语言传递到模板当中去return render(request, 'user_register.html', {'msg': '用户名已存在'})else:# 如果用户不存在则保存信息user = UserProfile()user.username = emailuser.email = emailuser.nick_name = nick_nameuser.set_password(pwd) # 将密码加密后保存user.save()return render(request, 'wait_start.html')else:# 如果校验错误, 就代表我们提交的数据不符合表单的要求, 则回到注册页面, 然后通过表单将错误信息展示到页面上return render(request, 'user_register.html', {'register_form':register_form})
3. 模版文件
1. wait_start
<!doctype html>
<html lang="zh-CN">
<head><meta charset="utf-8"><meta name="renderer" content="webkit"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>快去激活</title><link rel="stylesheet" type="text/css" href="/static/css/bootstrap.min.css"><link rel="stylesheet" type="text/css" href="/static/css/nprogress.css"><link rel="stylesheet" type="text/css" href="/static/css/style.css"><link rel="stylesheet" type="text/css" href="/static/css/font-awesome.min.css"><link rel="apple-touch-icon-precomposed" href="/static/images/icon.png"><link rel="shortcut icon" href="/static/images/favicon.ico"><script src="/static/js/jquery-2.1.4.min.js"></script><script src="/static/js/nprogress.js"></script><script src="/static/js/jquery.lazyload.min.js"></script><!--[if gte IE 9]><script src="/static/js/jquery-1.11.1.min.js" type="text/javascript"></script><script src="/static/js/html5shiv.min.js" type="text/javascript"></script><script src="/static/js/respond.min.js" type="text/javascript"></script><script src="/static/js/selectivizr-min.js" type="text/javascript"></script><![endif]--><!--[if lt IE 9]><script>window.location.href = 'upgrade-browser.html';</script><![endif]--><style type="text/css">.panel {padding: 80px 20px 0px;min-height: 400px;cursor: default;}.text-center {margin: 0 auto;text-align: center;border-radius: 10px;max-width: 900px;-moz-box-shadow: 0px 0px 5px rgba(0, 0, 0, .3);-webkit-box-shadow: 0px 0px 5px rgba(0, 0, 0, .3);box-shadow: 0px 0px 5px rgba(0, 0, 0, .1);}.float-left {float: left !important;}.float-right {float: right !important;}img {border: 0;vertical-align: bottom;}h2 {padding-top: 20px;font-size: 20px;}.padding-big {padding: 20px;}.alert {border-radius: 5px;padding: 15px;border: solid 1px #ddd;background-color: #f5f5f5;}</style>
</head>
<body class="user-select">
<header class="header"><nav class="navbar navbar-default" id="navbar"><div class="container"><div class="header-topbar hidden-xs link-border"><ul class="site-nav topmenu"><!--<li><a href="#">标签云</a></li>--><!--<li><a href="#" rel="nofollow">读者墙</a></li>--><!--<li><a href="#" title="RSS订阅">--><!--<i class="fa fa-rss">--><!--</i> RSS订阅--><!--</a></li>--></ul>人生苦短, 我用Python</div><div class="navbar-header"><button type="button" class="navbar-toggle collapsed" data-toggle="collapse"data-target="#header-navbar" aria-expanded="false"><span class="sr-only"></span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><h1 class="logo hvr-bounce-in"><a href="#" title=""><img src="/static/images/logo.png" alt=""></a></h1></div><div class="collapse navbar-collapse" id="header-navbar"><form class="navbar-form visible-xs" method="post"><div class="input-group"><input type="text" name="keyword" class="form-control" placeholder="请输入关键字" maxlength="20"autocomplete="off"><span class="input-group-btn"><button class="btn btn-default btn-search" name="search" type="submit">搜索</button></span></div></form><ul class="nav navbar-nav navbar-right"><li><a data-cont="但尽人事 莫问前程" title="但尽人事 莫问前程" href="#">首页</a></li><li><a data-cont="python" title="" href="#"></a></li></ul></div></div></nav>
</header>
<section class="container"><div class="panel"><div class="text-center"><h2><stong>已发送激活链接到邮箱,请去激活! o(╥﹏╥)o</stong></h2><div class="padding-big"><a href="#" class="btn btn-primary">返回首页</a><div class="widget widget_search"><form class="navbar-form" action=""><div class="input-group"><input type="text" name="keyword" class="form-control" size="35" placeholder="请输入关键字"maxlength="15" autocomplete="off"><span class="input-group-btn"><button class="btn btn-default btn-search" type="submit">搜索</button></span></div></form></div></div></div></div>
</section>
<footer class="footer"><div class="container"><p>Copyright © 2022.知吾所想 予吾所好-Allen</p></div><div id="gotop" style="display: block;"><a class="gotop"></a></div>
</footer>
<script src="/static/js/bootstrap.min.js"></script>
<script src="/static/js/jquery.ias.js"></script>
<script src="/static/js/scripts.js"></script>
</body>
</html>
2. user_register
<!DOCTYPE html>
{% load static %}
<html>
<head><meta charset="utf-8"><link href="/static/css/reglogin.css" rel='stylesheet' type='text/css'/><meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<div class="main"><div class="header"><h1>注册一个用户!</h1></div><p></p><form action="{% url 'user_register' %}" method="post">{% csrf_token %}<ul class="left-form"><h2>注册:</h2>{# 第一个表单 #}<li><input type="text" placeholder="请输入您的邮箱" name="email"/><div class="clear"></div></li><div style="color: red">{{ register_form.email.errors.0 }}</div>{# 第二个表单 #}<li><input type="password" placeholder="请输入密码" name="password"/><div class="clear"></div></li><div style="color: red">{{ register_form.password.errors.0 }}</div>{# 第三个表单 #}<li><input type="text" placeholder="请输入您的昵称" name="nick_name"/><div class="clear"></div></li><div style="color: red">{{ register_form.nick_name.errors.0 }}</div><input type="submit" value="注册"><div class="clear"></div></ul><div class="clear"></div></form><h3 style="width: 200px;height: 30px;margin: auto;color: red;text-align: center">{{ msg }}</h3>
</div>
</body>
</html>
二、验证
1. 发送邮件
- 登录博客需要激活此账号才行, 所以当我们注册账号时, 可以给该邮箱发送一封邮件, 只有用户点击该邮件后才能激活成功
- Django中内置了邮件发送功能,被定义在django.core.mail模块中。发送邮件需要使用SMTP服务器,常用的免费服务器有:163, 126, QQ,下面以163邮件为例
1. 注册163邮箱后登录并设置
2. 开启IMAP/SMTP服务, IMAP/SMTP服务
3. 新增授权密码
新增授权密码之后记得保存授权密码,一定不要忘记,不然需要重新开启,授权密码会保存180天
2.邮箱内容
在项目文件夹下创建一个utils文件夹, 该文件夹下放一些工具方法, 然后在该文件夹下创建一个 send_verify_code.py 文件, 用来写发送邮箱验证的代码
# coding:utf-8
import time
import hashlib
from django.core.mail import send_mail
from django.conf import settings
from users.models import VerifyCodeEmaildef make_sign():'''生成一个加密的字符串时间戳 + Django密钥,并且通过md5进行加密:return:'''times = str(time.time())sign_str = times + settings.SECRET_KEYmd5 = hashlib.md5()md5.update(sign_str.encode())sign = md5.hexdigest()return signdef send_verify_email(to_email):'''发送验证邮件为了保证唯一性,该邮件只能是某一用户的激活邮件,这邮件后面的参数是通过加密来得到的一个字符串:param to_email::return:'''sign = make_sign()verify_url = '点击链接激活账号\n http://127.0.0.1:8000/user_active?sign=' + signverify_code = VerifyCodeEmail()verify_code.email = to_emailverify_code.code = signverify_code.code_type = 1verify_code.save()subject = '邮箱验证'html_message = '<p>尊敬的用户您好!</p>' \'<p>感谢您使用此网站。</p>' \'<p>您的邮箱为:%s 。请点击此链接激活您的邮箱:</p>' \'<p><a href="%s">%s<a></p>' % (to_email, verify_url, verify_url)# 调用Django提供的方法来发送邮件send_mail(subject, "", settings.EMAIL_FROM, [to_email], html_message=html_message)
3.点击注册
4.发送邮件
之后你注册时填写的邮箱就会收到下面这样的一封邮件
之后点击链接进行激活之后就可以完成账号的注册,并可以登录使用
5. 激活账号
这一步点击发送到邮箱的链接即可激活账号,账号激活成功之后会显示登录页面进行登录
1. 完善激活功能 – user_active
相关包自己要到的时候可以使用快捷键Alt+enter进行添加
# user/views
def user_active(request):# 拿到激活链接上的密钥sign = request.GET.get('sign')# 如果拿到了密钥则进行下面的激活操作if sign:# 查看校验类里面是否有数据verify_code = VerifyCodeEmail.objects.filter(code=sign)# 如果有,则对用户进行激活操作if verify_code:# 拿到当前的邮箱号email = verify_code[0].email# 激活用户user_obj = UserProfile.objects.get(email=email)user_obj.is_start = Trueuser_obj.save()# 删除当前的验证类verify_code.delete()return redirect(reverse('user_login'))else:return render(request, '404.html')
2. 完善登录功能的界面
# user/views
def user_login(request):'''用户登录1. 用户想要登录, 则直接进入到此页面2. 用户点击登录进入到主页可以根据不同的请求方法来做不同的请求事件:param request::return:'''if request.method == 'GET':return render(request, 'user_login.html')else:# 如果是post请求,则进行表单的验证login_form = UserLoginForm(request.POST)if login_form.is_valid():email = login_form.cleaned_data.get('email')password = login_form.cleaned_data.get('password')# 通过Django的方法来校验账号和密码user = authenticate(username=email, password=password)if user:# 如何账号和密码正确,则进行校验用户是否已经激活user_obj = UserProfile.objects.get(username=email)# 如果用户基因进行激活if user_obj.is_start:login(request, user)# 返回主页return redirect('/')else:return render(request, 'user_register.html', {'msg': '请激活账号后进行登录'})else:# 如果账号密码错误return render(request, 'user_login.html', {'msg': '账号或密码错误'})else:# 如果用户提交的数据有问题return render(request, 'user_login.html', {'msg': login_form})
3. 用户登录校验模块
# user/forms
class UserLoginForm(forms.Form):'''用户登录的表单: 当用户点击登录时, 可以通过我们所写的表单字段来对数据进行校验email: 用来校验用户提交的邮箱, EmailField(forms中定义的邮箱类型), required(保存用户提交的数据不能为空), error_messages(如果有错误, 则根据字典中错误的key来提示对应信息)password: 用来校验用户提交的密码, CharField(forms中定义的字符串类型)'''email = forms.EmailField(required=True,error_messages={'required':'请填写邮箱','invalid':'请输入有效的邮箱'})password = forms.CharField(required=True,error_messages={'required':'请填写密码'})
4. 前端文件
1. user_login
# user_login
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><link href="/static/css/reglogin.css" rel='stylesheet' type='text/css'/><meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<div class="main"><div class="header"><h1>登录!</h1></div><p></p><form action="{% url 'user_login' %}" method="post">{% csrf_token %}<ul class="left-form"><h2>登录:</h2>{# 输入的邮箱 #}<li><input type="text" placeholder="请输入您的邮箱" name="email"/><div class="clear"></div></li><div style="color: red">{{ login_form.email.errors.0 }}</div>{# 输入的密码 #}<li><input type="password" placeholder="请输入密码" name="password"/><div class="clear"></div></li><div style="color: red">{{ login_form.password.errors.0 }}</div><input type="submit" value="登录"><div class="clear"></div></ul><div class="clear"></div></form><h3 style="width: 200px;height: 30px;margin: auto;color: red;text-align: center">{{ msg }}</h3>
</div>
</body>
</html>
2. 404页面
{% load static %}
<!doctype html>
<html lang="zh-CN">
<head><meta name="360-site-verification" content="85326d9c1b0d512826605334e6eb1d5c"><meta charset="utf-8"><meta name="renderer" content="webkit"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="baidu_union_verify" content="6c3c4420bcc5cb0d05563cc88180cd88"><title>很抱歉,没有相关内容</title><meta name="keywords" content="Django博客">{# <link rel="stylesheet" type="text/css" href="/static/css/bootstrap.min.css">#}
{# <link rel="stylesheet" type="text/css" href="/static/css/nprogress.css">#}
{# <link rel="stylesheet" type="text/css" href="/static/css/style.css">#}
{# <link rel="stylesheet" type="text/css" href="/static/css/shang.css">#}
{# <link rel="stylesheet" type="text/css" href="/static/css/font-awesome.min.css">#}
{# <link rel="apple-touch-icon-precomposed" href="/static/images/icon.png">#}
{# <link rel="shortcut icon" href="/static/images/favicon.ico">#}<link rel="stylesheet" type="text/css" href="{% static 'css/bootstrap.min.css' %}"><link rel="stylesheet" type="text/css" href="{% static 'css/nprogress.css' %}"><link rel="stylesheet" type="text/css" href="{% static 'css/style.css' %}"><link rel="stylesheet" type="text/css" href="{% static 'css/shang.css' %}"><link rel="stylesheet" type="text/css" href="{% static 'css/font-awesome.min.css' %}"><link rel="apple-touch-icon-precomposed" href="{% static 'images/icon.png' %}"><link rel="shortcut icon" href="{% static 'images/favicon.ico' %}">{# <script src="/static/js/jquery-2.1.4.min.js"></script>#}
{# <script src="/static/js/nprogress.js"></script>#}
{# <script src="/static/js/jquery.lazyload.min.js"></script>#}<script src="{% static 'js/jquery-2.1.4.min.js' %}"></script><script src="{% static 'js/nprogress.js' %}"></script><script src="{% static 'js/jquery.lazyload.min.js' %}"></script><style type="text/css">.panel {padding: 80px 20px 0px;min-height: 400px;cursor: default;}.text-center {margin: 0 auto;text-align: center;border-radius: 10px;max-width: 900px;-moz-box-shadow: 0px 0px 5px rgba(0, 0, 0, .3);-webkit-box-shadow: 0px 0px 5px rgba(0, 0, 0, .3);box-shadow: 0px 0px 5px rgba(0, 0, 0, .1);}.float-left {float: left !important;}.float-right {float: right !important;}img {border: 0;vertical-align: bottom;}h2 {padding-top: 20px;font-size: 20px;}.padding-big {padding: 20px;}.alert {border-radius: 5px;padding: 15px;border: solid 1px #ddd;background-color: #f5f5f5;}</style>
</head>
<body class="user-select">
<header class="header"><nav class="navbar navbar-default" id="navbar"><div class="container"><div class="header-topbar hidden-xs link-border"><ul class="site-nav topmenu"><!--<li><a href="#">标签云1</a></li>-->{% if request.user.is_authenticated %}<li><a href="#">@{{ request.user.username }}</a></li><li><a href="{% url 'user_logout' %}" style="border-left: 1px solid black">退出</a></li>{% else %}<li><a href="{% url 'user_login' %}" target="_blank">登录</a></li><li><a href="{% url 'user_register' %}" target="_blank"style="border-left: 1px solid black">注册</a></li>{% endif %}</ul>人生苦短, 我用Python</div><div class="navbar-header"><button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#header-navbar" aria-expanded="false"><span class="sr-only"></span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><h1 class="logo hvr-bounce-in"><a href="#" title="首页">
{# <img src="/static/images/logo.png" alt="首页">#}<img src="{% static 'images/logo.png' %}" alt="首页"></a></h1></div>{# 头部下面右 #}<div class="collapse navbar-collapse" id="header-navbar"><ul class="nav navbar-nav navbar-right">{# 所有的分类 #}<li><a data-cont="python" title="Python" href="#">Python</a></li><li><a data-cont="python" title="Java" href="#">Java</a></li><li><a data-cont="python" title="C" href="#">C</a></li><li><a data-cont="python" title="C++" href="#">C++</a></li></ul></div></div></nav>
</header>
<section class="container"><div class="panel"><div class="text-center"><h2><stong>很抱歉,没有相关内容 o(╥﹏╥)o</stong></h2><div class="padding-big"><a href="#" class="btn btn-primary">返回首页</a></div></div></div>
</section>
<footer class="footer"><div class="container"><p><p>Copyright © 2022.知吾所想 予吾所好-Allen</p></div><div id="gotop"><a class="gotop"></a></div>
</footer>
<script src="/static/js/bootstrap.min.js"></script>
<script src="/static/js/jquery.ias.js"></script>
<script src="/static/js/scripts.js"></script><script src="{% static 'js/bootstrap.min.js' %}"></script>
<script src="{% static 'js/jquery.ias.js' %}"></script>
<script src="{% static 'js/scripts.js' %}"></script>
<script>var _hmt = _hmt || [];(function () {var hm = document.createElement("script");hm.src = "https://hm.baidu.com/hm.js?e8ae61fbc1aa8b44823aae4cd23690b0";var s = document.getElementsByTagName("script")[0];s.parentNode.insertBefore(hm, s);})();
</script></body>
</html>
3. wait_start
<!doctype html>
<html lang="zh-CN">
<head><meta charset="utf-8"><meta name="renderer" content="webkit"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>快去激活</title><link rel="stylesheet" type="text/css" href="/static/css/bootstrap.min.css"><link rel="stylesheet" type="text/css" href="/static/css/nprogress.css"><link rel="stylesheet" type="text/css" href="/static/css/style.css"><link rel="stylesheet" type="text/css" href="/static/css/font-awesome.min.css"><link rel="apple-touch-icon-precomposed" href="/static/images/icon.png"><link rel="shortcut icon" href="/static/images/favicon.ico"><script src="/static/js/jquery-2.1.4.min.js"></script><script src="/static/js/nprogress.js"></script><script src="/static/js/jquery.lazyload.min.js"></script><!--[if gte IE 9]><script src="/static/js/jquery-1.11.1.min.js" type="text/javascript"></script><script src="/static/js/html5shiv.min.js" type="text/javascript"></script><script src="/static/js/respond.min.js" type="text/javascript"></script><script src="/static/js/selectivizr-min.js" type="text/javascript"></script><![endif]--><!--[if lt IE 9]><script>window.location.href = 'upgrade-browser.html';</script><![endif]--><style type="text/css">.panel {padding: 80px 20px 0px;min-height: 400px;cursor: default;}.text-center {margin: 0 auto;text-align: center;border-radius: 10px;max-width: 900px;-moz-box-shadow: 0px 0px 5px rgba(0, 0, 0, .3);-webkit-box-shadow: 0px 0px 5px rgba(0, 0, 0, .3);box-shadow: 0px 0px 5px rgba(0, 0, 0, .1);}.float-left {float: left !important;}.float-right {float: right !important;}img {border: 0;vertical-align: bottom;}h2 {padding-top: 20px;font-size: 20px;}.padding-big {padding: 20px;}.alert {border-radius: 5px;padding: 15px;border: solid 1px #ddd;background-color: #f5f5f5;}</style>
</head>
<body class="user-select">
<header class="header"><nav class="navbar navbar-default" id="navbar"><div class="container"><div class="header-topbar hidden-xs link-border"><ul class="site-nav topmenu"><!--<li><a href="#">标签云</a></li>--><!--<li><a href="#" rel="nofollow">读者墙</a></li>--><!--<li><a href="#" title="RSS订阅">--><!--<i class="fa fa-rss">--><!--</i> RSS订阅--><!--</a></li>--></ul>人生苦短, 我用Python</div><div class="navbar-header"><button type="button" class="navbar-toggle collapsed" data-toggle="collapse"data-target="#header-navbar" aria-expanded="false"><span class="sr-only"></span><span class="icon-bar"></span><span class="icon-bar"></span><span class="icon-bar"></span></button><h1 class="logo hvr-bounce-in"><a href="#" title=""><img src="/static/images/logo.png" alt=""></a></h1></div><div class="collapse navbar-collapse" id="header-navbar"><form class="navbar-form visible-xs" method="post"><div class="input-group"><input type="text" name="keyword" class="form-control" placeholder="请输入关键字" maxlength="20"autocomplete="off"><span class="input-group-btn"><button class="btn btn-default btn-search" name="search" type="submit">搜索</button></span></div></form><ul class="nav navbar-nav navbar-right"><li><a data-cont="但尽人事 莫问前程" title="但尽人事 莫问前程" href="#">首页</a></li><li><a data-cont="python" title="" href="#"></a></li></ul></div></div></nav>
</header>
<section class="container"><div class="panel"><div class="text-center"><h2><stong>已发送激活链接到邮箱,请去激活! o(╥﹏╥)o</stong></h2><div class="padding-big"><a href="#" class="btn btn-primary">返回首页</a><div class="widget widget_search"><form class="navbar-form" action=""><div class="input-group"><input type="text" name="keyword" class="form-control" size="35" placeholder="请输入关键字"maxlength="15" autocomplete="off"><span class="input-group-btn"><button class="btn btn-default btn-search" type="submit">搜索</button></span></div></form></div></div></div></div>
</section>
<footer class="footer"><div class="container"><p>Copyright © 2022.知吾所想 予吾所好-Allen</p></div><div id="gotop" style="display: block;"><a class="gotop"></a></div>
</footer>
<script src="/static/js/bootstrap.min.js"></script>
<script src="/static/js/jquery.ias.js"></script>
<script src="/static/js/scripts.js"></script>
</body>
</html>
本期内容到此结束,我们下期再见,拜拜!!
相关文章:
MyBlog(五) -- 用户注册页面完善
文章目录 前言一、用户数据提交1. 表单2. 校验数据3. 模版文件1. wait_start2. user_register 二、验证1. 发送邮件1. 注册163邮箱后登录并设置2. 开启IMAP/SMTP服务, IMAP/SMTP服务3. 新增授权密码 2.邮箱内容3.点击注册4.发送邮件5. 激活账号1. 完善激活功能 -- user_active2…...
NLP任务四大范式的进阶历程:从传统TF-IDF到Prompt-Tuning(提示词微调)
引言:从TF-IDF到Prompt-Tuning(提示词微调),NLP的四次变革 自然语言处理(NLP)技术从最早的手工特征设计到如今的Prompt-Tuning,经历了四个重要阶段。随着技术的不断发展,我们的目标…...
量化交易系统开发-实时行情自动化交易-8.3.开拓者TBQuant平台
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来会对于开拓者TBQuant平台介绍。 …...
第八课 Unity编辑器创建的资源优化_特效篇(Particle System)详解
无论是CPU还是GPU,粒子系统对其的影响面都是不容小觑的。随着项目的重度化和3A化,玩家的口味变挑剔了、游戏玩法复杂度变高了、画面的特效表现变复杂了......所以我们还是更加谨慎地对待粒子系统。 特效(Particle System) 游戏效…...
redis常见数据类型
Redis是一个开源的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息代理,支持多种数据类型。 一、数据类型介绍 String(字符串) Redis中最基本的数据类型。可以存储任何类型的数据,包括字符串、数字和二进制…...
【解决安全扫描漏洞】---- 检测到目标站点存在 JavaScript 框架库漏洞
1. 漏洞结果 JavaScript 框架或库是一组能轻松生成跨浏览器兼容的 JavaScript 代码的工具和函数。如果网站使用了存在漏洞的 JavaScript 框架或库,攻击者就可以利用此漏洞来劫持用户浏览器,进行挂马、XSS、Cookie劫持等攻击。 1.1 漏洞扫描截图 1.2 具体…...
深入解析 Kubernetes 节点操作:Cordon、Uncordon 和 Drain 的使用与最佳实践
摘要 Kubernetes 是一个用于自动化容器部署、扩展和管理的开源系统,而节点管理是其核心功能之一。cordon、uncordon 和 drain 是 Kubernetes 提供的与节点操作相关的三个重要命令,用于节点的调度控制和维护管理。本文将从概念、命令解析、内部机制和最佳…...
python array矩阵相关操作
目录: 一、判断某个值是否在array二维数组的某列中 二、根据某列中的特定值筛选array数组 三、查找一个元素在二维 array 矩阵中的位置 四、判断array数组中的每个元素是否包含特定的子字符串 一、判断某个值是否在array二维数组的某列中 在 Python 中…...
网络安全——浅谈HTTP协议
HTTP请求 HTTP请求是客户端往服务端发送请求动作,告知服务器自己的要求。 HTTP请求由状态行、请求头、请求正文三部分组成: 状态行:包括请求方式Method、资源路径URL、协议版本Version;请求头:包括一些访问的域名、…...
BWO-CNN-BiGRU-Attention白鲸优化算法优化卷积神经网络结合双向门控循环单元时间序列预测,含优化前后对比
BWO-CNN-BiGRU-Attention白鲸优化算法优化卷积神经网络结合双向门控循环单元时间序列预测,含优化前后对比 目录 BWO-CNN-BiGRU-Attention白鲸优化算法优化卷积神经网络结合双向门控循环单元时间序列预测,含优化前后对比预测效果基本介绍模型描述程序设计…...
55 基于单片机的方波频率可调
目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 采用STC89C52单片机最小系统,设计DAC0832、放大器、与示波器显示方波,四位数码管显示频率,两个按键可调。 二、硬件资源 基于KEIL5编写C代码,PROT…...
SAP SD学习笔记15 - 投诉处理2 - 返品处理流程之 参照请求传票(发票)来生成返品传票
上一章讲了返品处理(退货处理)的流程。 SAP SD学习笔记14 - 投诉处理1 - 返品处理(退货处理)的流程以及系统实操,比如 返品传票;请求Block标记;收到退货之后的处理,请求传票的登录_…...
LWIP和FATFS 实现 FTP 服务端
目录 一、前言 二、LWIP 和 FTP 简介 1.LWIP 2.FTP 三、实现 FTP 服务端的主要步骤 1.初始化 LWIP 2.创建 FTP 服务器任务 3.处理客户端连接 4.实现 FTP 命令处理 5.文件系统操作 6.错误处理和日志记录 四、示例代码 1.创建FTP任务 2. FTP任务代码 3.处理交互数据…...
缓冲区的奥秘:解析数据交错的魔法
目录 一、理解缓存区的好处 (一)直观性的理解 (二)缓存区的好处 二、经典案例分析体会 (一)文件读写流(File I/O Buffering) BufferedOutputStream 和 BufferedWriter 可以加快…...
【MySQL — 数据库基础】MySQL的安装与配置 & 数据库简单介绍
数据库基础 本节目标 掌握关系型数据库,数据库的作用掌握在Windows和Linux系统下安装MySQL数据库了解客户端工具的基本使用和SQL分类了解MySQL架构和存储引擎 1. 数据库的安装与配置 1.1 确认MYSQL版本 处理无法在 cmd 中使用 mysql 命令的情况&a…...
如何使用Python解析从淘宝API接口获取到的JSON数据?
基本的 JSON 解析 当从淘宝 API 接口获取到数据后(假设数据存储在变量response_data中),首先要判断数据类型是否为 JSON。如果是,就可以使用 Python 内置的json模块进行解析。示例代码如下: import json # 假设respon…...
Day1 生信新手笔记
生信新手笔记 生信学习第一天笔记打卡。 转录组学中: 上游分析-基于linux,包括质控、过滤、比对、定量; 下游分析-基于R语言,包括差异分析、富集分析、可视化。 1. 级别标题 一个井号加空格 就是一级标题,两个井号加…...
内网穿透步骤
步骤 第一次需要验证token window和linux的方法不同。 然后 启动 cpolar 服务: 在命令窗口中输入 cpolar.exe htttp 8080,启动内网穿透服务。确保命令窗口保持开启状态,以维持穿透效果。 cpolar.exe hhttp 8080 成功后 注意事项 命令窗口…...
docker启动容器,语句名词解释
#启动容器代码docker run -it -d --name dev_aios -v D:\project\aialign:/www/ -v D:\project\data\dev\aios:/myfile/data/dev/aios -w /www/stand-alone-aios/aios -p 9002:9000 --ulimit core0 aialign/python-base:1.0 bash名词解释 docker run: 这是 Docker 的命令&#…...
微服务之短信验证服务配置完后junit单元测试短信发送失败
总之岁月漫长,然而值得等待。 主要是版本冲突问题,具体报错与解决方法如下: 报错前: 启动失败 短信服务测试报错: 解决后: 启动成功 短信服务测试发送成功: 在使用 SpringBoot 开发时&am…...
QSqlTableModel的使用
实例功能 这边使用一个实例显示数据库 demodb 中 employee 数据表的内容,实现编辑、插入、删除的操作,实现数据的排序和记录过滤,还实现 BLOB 类型字段 Photo 中存储照片的显示、导入等操作,运行界面如下图: 在上图中…...
构建高可用系统设计OpenStack、Docker、Mesos和Kubernetes(简称K8s)
如果构建高可用、高并发、高效运维的大型系统 大型系统架构设计包括业务层设计、服务层设计、基础架层设计、存储层设计、网络层协同设计来完成。 一、业务层 根据主要业务范畴的分类和特征提取,抽象出独立的业务系统,分别统计系统的用户角色群体、访…...
CondaValueError: Malformed version string ‘~‘: invalid character(s).
问题描述:在window下使用conda安装任何包都会报错。报错信息是CondaValueError: Malformed version string ~: invalid character(s). 解决办法:把.condarc文件的源地址删除(八成是源地址访问不了了),只保存默认的&am…...
uniapp图片上传预览uni.chooseImage、uni.previewImage
文章目录 1.上传图片2.预览图片 1.上传图片 uni.chooseImage(OBJECT) 从本地相册选择图片或使用相机拍照。 App端如需要更丰富的相机拍照API(如直接调用前置摄像头),参考plus.camera 微信小程序从基础库 2.21.0 开始, wx.choos…...
代码随想录算法训练营第三十二天 | 509. 斐波那契数 | 70. 爬楼梯 | 746. 使用最小花费爬楼梯
Day 32 总结 自己实现中遇到哪些困难今日收获,记录一下自己的学习时间 12:30 - 21:30 理论基础 代码随想录 动态规划 问题有很多的重叠子问题需要解决,状态涉及推导 DP 5部曲 DP数组含义 状态转移公式 dp数组初始化 数组遍历顺序 举例推导 视频&a…...
Flink常见面试题
1、Flink 的四大特征(基石) 2、Flink 中都有哪些 Source,哪些 Sink,哪些算子(方法) 预定义Source 基于本地集合的source(Collection-based-source) 基于文件的source(…...
SpringCloud之Config:从基础到高级应用
目录 一、SpringCloud Config 简介1、SpringCloud Config 概述(1)核心概念(2)SpringCloud Config 的特点(3)应用场景(4)工作原理(5)优势(6&#x…...
redis 底层数据结构
概述 Redis 6 和 Redis 7 之间对比: Redis6 和 Redis7 最大的区别就在于 Redis7 已经用 listpack 替代了 ziplist. 以下是基于 Redis 7基础分析。 RedisObject Redis是⼀个<k,v>型的数据库,其中key通常都是string类型的字符串对象,⽽…...
机器学习之RLHF(人类反馈强化学习)
RLHF(Reinforcement Learning with Human Feedback,基于人类反馈的强化学习) 是一种结合人类反馈和强化学习(RL)技术的算法,旨在通过人类的评价和偏好优化智能体的行为,使其更符合人类期望。这种方法近年来在大规模语言模型(如 OpenAI 的 GPT 系列)训练中取得了显著成…...
openwrt利用nftables在校园网环境下开启nat6 (ipv6 nat)
年初写过一篇openwrt在校园网环境下开启ipv6 nat的文章,利用ip6tables控制ipv6的流量。然而从OpenWrt22版本开始,系统内置的防火墙变为nftables,因此配置方法有所改变。本文主要参考了OpenWRT使用nftables实现IPv6 NAT 这篇文章。 友情提示 …...
Vue3+node.js实现注册
文章目录 前端代码实现后端代码实现 效果图 前端代码实现 <template><div class"register-container"><el-card class"register-card"><template #header><div class"card-header"><span>注册</span&…...
LabVIEW将TXT文本转换为CSV格式(多行多列)
在LabVIEW中,将TXT格式的文本文件内容转换为Excel格式(即CSV文件)是一项常见的数据处理任务,适用于将以制表符、空格或其他分隔符分隔的数据格式化为可用于电子表格分析的形式。以下是将TXT文件转换为Excel(CSV&#x…...
SpringBoot源码-Spring Boot启动时控制台为何会打印logo以及自定义banner.txt文件控制台打印
1.当我们启动一个SpringBoot项目的时候,入口程序就是main方法,而在main方法中就执行了一个run方法。 SpringBootApplication public class StartApp {public static void main(String[] args) {// testSpringApplication.run(StartApp.class);} }publi…...
【笔记】软技能
硬技能:操控世界的能力,处理对象为【物】。软技能:影响他人的能力,处理对象为【人】。软技能包括一个人的情商、个性、社交礼仪、沟通、语言、个人习惯,还有解决问题的能力、领导能力、时间管理能力等一切非技术能力。…...
试题转excel;试题整理工具;试卷转excel;word转excel
一、问题描述 我父亲是一名教师,偶尔会需要将试卷转excel,方便管理处理一些特别重要的题目 于是,就抽空写一个专门将试题转excel的工具,便于各位教师从业者和教育行业的朋友更好的整理试题,减少一点重复枯燥的工作 …...
【热门主题】000072 分布式数据库:开启数据管理新纪元
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【热…...
常见靶场的搭建
漏洞靶场 渗透测试(漏洞挖掘)切忌纸上谈兵,学习渗透测试(漏洞挖掘)知识的过程中,我们通常需要一个包含漏洞的测试环境来进行训练。而在非授权情况下,对于网站进行渗透测试攻击,是触及…...
C语言——链表
1 链表基础 1 什么是链表 !!!链表相当于多个结构体变量链接在一起!!! //链表节点结构 struct Node //数据域和指针域 {int data; //数据域//struct Student data;数据尽量不写在链表结构体里面…...
【经典】星空主题的注册界面HTML,CSS,JS
目录 界面展示 完整代码 说明: 这是一个简单的星空主题的注册界面,使用了 HTML 和 CSS 来实现一个背景为星空效果的注册页面。 界面展示 完整代码 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8&…...
94.【C语言】解析预处理(2)
目录 1.带有副作用的宏参数 代码 一个判断最大值的宏代码 运行结果 分析 "副作用"的解释 2.宏替换规则 解释 3.宏和函数的对比 附一张对比表 承接93.【C语言】解析预处理(1)文章 1.带有副作用的宏参数 代码 一个判断最大值的宏代码 #define MAX(a, b) (…...
(数据结构与算法)如何提高学习算法的效率?面试算法重点有哪些?面试需要哪些能力?
面试官眼中的求职者 通过对你算法的考察!!!! 缩进太多!!一般不要超过三层!!!缩进越少,bug越少;逻辑比较复杂,把这些包装成为函数&…...
STM32 BootLoader 刷新项目 (十二) Option Byte之FLASH_OPTCR-命令0x58
STM32 BootLoader 刷新项目 (十二) Option Byte之FLASH_OPTCR-命令0x58 STM32F407芯片的OPTION Byte全面解析 STM32F407芯片是STMicroelectronics推出的一款功能强大的微控制器,广泛应用于工业控制、通信和消费电子等领域。其中,OPTION Byte࿰…...
MySQL主从复制
华子目录 实验环境准备修改配置文件 实验主开启bin-log日志创建用于主从复制的用户master配置salve配置 测试 添加一台新的slave,如何实现数据的全部同步呢什么环境下主比较多,什么环境下从比较多?延迟复制测试 并行复制gtid模式未启用gtid时…...
贝叶斯统计:高斯分布均值μ的后验分布推导
使用贝叶斯统计方法 均值 ( μ \mu μ ) 的后验分布解析 在贝叶斯统计中,后验分布表示在观察到数据后,对参数的更新后的信念。本篇文章将结合高斯分布的假设,详细解析均值 ( μ \mu μ ) 的后验分布推导过程,并对 ( μ \mu μ…...
linux常用指令都是工作中遇到的
前端打war包 jar -cvf dist.war *创建 WAR 文件的命令 jar -cvf dist.war * 用于将当前目录下的所有文件和文件夹打包成一个名为 dist.war 的 WAR 文件。以下是该命令的详细解释: jar: Java Archive 工具,用于创建 JAR、WAR 或 EAR 文件。 -c: 创建新的…...
亚马逊自研大语言模型 Olympus 即将亮相,或将在 LLM 竞赛中掀起新波澜
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
droppath
DropPath 是一种用于正则化深度学习模型的技术,它在训练过程中随机丢弃路径(或者说随机让某些部分的输出变为零),从而增强模型的鲁棒性和泛化能力。 代码解释: import torch import torch.nn as nn # 定义 DropPath…...
通信与网络安全之IPSEC
IPSec(IP Security)是IETF制定的为保证在Internet上传送数据的安全保密性能的三层隧道加密协议。IPSec在网络层对IP报文提供安全服务。IPSec协议本身定义了如何在IP数据包中增加字段来保证IP包的完整性、 私有性和真实性,以及如何加密数据包。…...
Linux内核编译流程(Ubuntu24.04+Linux Kernel 6.8.12)
万恶的拯救者,使用Ubuntu没有声音,必须要自己修改一下Linux内核中的相关驱动逻辑才可以,所以被迫学习怎么修改内核&编译内核,记录如下 准备工作 下载Linux源码:在Linux发布页下载并使用gpg签名验证 即:…...
什么是GAN?
一、基本概念 生成对抗网络(Generative Adversarial Network,GAN)是一种由两个神经网络共同组成深度学习模型:生成器(Generator)和判别器(Discriminator)。这两个网络通过对抗的方式…...