注册功能
模型代码
# App/models.py
from App.ext import db
class User(db.Model):
id = db.Column(db.INTEGER,primary_key=True,autoincrement=True)
name = db.Column(db.String(16))
password_hash = db.Column(db.String(256))
@property
def password(self):
raise Exception("Error Action: Password can't be access")
@password.setter
def password(self, value):
self.password_hash = generate_password_hash(value)
def check_password(self, value):
return check_password_hash(self.password_hash, value)
前端代码
# App/templates/register.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>register</title>
</head>
<body>
<form action="{{ url_for('blue.user_register') }}" method="post">
<span>账号:</span><input type="text" name="username" placeholder="请输入账号">
<br>
<span>密码:</span><input type="text" name="password" placeholder="请输入密码">
<br>
<button>注册</button>
</form>
</body>
</html>
后端代码
# App/views/blue.py
@blue.route('/user/register/',methods=['GET','POST'])
def user_register():
# GET请求进入注册页面
if request.method == 'GET':
return render_template('register.html')
# 在注册页面中进行POST请求
elif request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
# 实例化表对象
# from App.models import User
user = User()
user.name = username
user.password = password
# 添加数据并提交至数据库
db.session.add(user)
db.session.commit()
# 注册成功提示
return "Register success!"
登录功能
前端代码
# App/templates/login.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>login</title>
</head>
<body>
<form action="{{ url_for('blue.user_login') }}" method="post">
<span>账号:</span><input type="text" name="username" placeholder="请输入账号">
<br>
<span>密码:</span><input type="text" name="password" placeholder="请输入密码">
<br>
<button>登录</button>
{% for message in get_flashed_messages() %}
<li>提示:{{ message }}</li>
{% endfor %}
</form>
</body>
</html>
后端代码
# App/views/blue.py
@blue.route('/user/login/',methods=['GET','POST'])
def user_login():
# GET请求进入登录页面
if request.method == 'GET':
return render_template('login.html')
# 在登录页面中进行POST请求
elif request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
# 实例化表对象
user = User.query.filter(User.name.__eq__(username)).first()
# 判断hash密码的正确性
if user and user.check_password(password):
# 登录成功提示
return "Login success!"
else:
# <SecureCookieSession {'_flashes': [('message', '账号或密码错误!')]}>
flash("账号或密码错误!")
# 登录失败重定向到当前页面并输出提示
return redirect(url_for('blue.user_login'))
邮件功能
启用邮箱POP3/SMTP服务(QQ邮箱)
登录邮箱选择设置->账户
开启POP3/SMTP服务
发送短信获取POP3/SMTP服务登录授权码
使用Flask-Mail扩展
安装flask-mail扩展
pip install flask-mail
加载插件
# App/ext.py
from flask_mail import Mail
mail = Mail()
# 初始化函数
def init_extension(app):
# 加载邮箱插件
mail.init_app(app)
配置参数
# App/settings.py
MAIL_SERVER = "smtp.qq.com"
MAIL_PORT = 25
MAIL_USERNAME = "690126048@qq.com"
MAIL_PASSWORD = "授权码"
MAIL_DEFAULT_SENDER = MAIL_USERNAME
编写接口
@blue.route('/send_email/')
def send_email():
message = Message("标题内容", recipients=["643659318@qq.com",])
message.body = '普通文本'
message.html = "html"
mail.send(message=message)
return "Email send success!"
短信功能
申请短信接口服务(网易云信)
使用Flask-caching扩展
安装flask-caching扩展
pip install flask-Caching
加载扩展
# App/ext.py
from flask_caching import Cache
cache = Cache()
# 初始化函数
def init_extension(app):
# 加载缓存插件
cache.init_app(app)
编写接口
短信接口函数
# App/utils.py
def send_verify_code(mobile):
url = "https://api.netease.im/sms/sendcode.action"
appkey = "58fab429641d3b1ce9e2e00ede008fbc"
appsecret = "e94ee1d83d2d"
nonce = hashlib.new("sha512", str(time.time()).encode("utf-8")).hexdigest()
curtime = str(int(time.time()))
checksum = hashlib.new("sha1", (appsecret+nonce+curtime).encode("utf-8")).hexdigest()
headers = {
"AppKey": appkey,
"Nonce": nonce,
"CurTime": curtime,
"CheckSum": checksum
}
form_data = {
"mobile":mobile,
}
resp = requests.post(url, data=form_data, headers=headers)
return resp
短信接口
# App/views/blue.py
@blue.route('/send_code/')
def send_code():
username = request.args.get('username')
mobile = request.args.get('mobile')
# from App.utils import send_verify_code
resp = send_verify_code(mobile)
result = resp.json()
if result.get('code') == 200:
obj = result.get('obj')
cache.set(username, obj)
data = {
'msg': 'success',
'status': 200
}
return data
data = {
'msg': 'failure',
'status':400
}
return data
注册接口
# App/views/blue.py
@blue.route('/user/register/',methods=['GET','POST'])
def user_register():
# GET请求进入注册页面
if request.method == 'GET':
return render_template('register.html')
# 在注册页面中进行POST请求
elif request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
mobile = request.form.get('mobile')
verifycode = request.form.get('verifycode')
# 判断验证码是否和缓存的验证码相同
if verifycode != cache.get(username):
return "Register failure!"
# 实例化表对象
user = User()
user.name = username
user.password = password
user.mobile = mobile
# 添加数据并提交至数据库
db.session.add(user)
db.session.commit()
# 注册成功提示
return "Register success!"
前端代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>register</title>
<script src="http://libs.baidu.com/jquery/1.11.1/jquery.min.js"></script>
<script type="text/javascript">
$(function () {
$("#get_code").click(function () {
var username = $("#username").val();
var mobile = $("#mobile").val();
$.getJSON("/send_code/", {"username":username, "mobile":mobile}, function(data){
console.log(data)})
})
})
</script>
</head>
<body>
<form action="{{ url_for('blue.user_register') }}" method="post">
<span>账号:</span><input type="text" id="username" name="username" placeholder="请输入账号">
<br>
<span>密码:</span><input type="text" name="password" placeholder="请输入密码">
<br>
<span>手机号:</span><input type="text" id="mobile" name="mobile" placeholder="请输入手机号">
<br>
<span>验证码</span><input type="text" name="verifycode" placeholder="请输入验证码"> <span id="get_code">获取验证码</span>
<br>
<button>注册</button>
</form>
</body>
</html>