【Python】Flask实战

注册功能

模型代码

# 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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值