Flask-wtf之wtfFlask后端代码

from io import BytesIO
from werkzeug.security import check_password_hash, generate_password_hash
from models import app, db, User, UserLog
from flask import render_template, redirect, url_for, request, flash, session, make_response
from urllib.request import urlopen
import json
from forms import LoginForm, RegisterForm, UploadForm


# 通过ip获取该IP的所在城市和国家;
def get_ip_area(ip):
    # 构造url地址, 使用淘宝的API接口
    url = 'http://ip.taobao.com/service/getIpInfo.php?ip=%s' % (ip)
    # 获取页面返回的内容()
    json_data = urlopen(url).read().decode('utf-8')
    # 将json格式的数据转换为字典格式;
    s_data = json.loads(json_data)
    country = s_data['data']['country']
    if country == 'XX':
        country = ''
    city = s_data['data']['city']
    if city == 'XX':
        city = ''
    return country + city


@app.route('/login/', methods=['POST', 'GET'])
def login():
    form = LoginForm()
    # 判断用户的HTTP请求方法
    if request.method == 'POST':

        # 1). 接收提交的数据;
        # data = request.form
        # name = data['name']
        # pwd = data['pwd']
        data = form.data  ##获取表单中的data
        name = data['name']
        pwd = data['pwd']

        # 2). 判断用户名是否存在, 密码是否正确?
        u = User.query.filter_by(name=name).first()
        code = data['verify_code']  ##forms中的验证码部分
        if u and check_password_hash(u.pwd, pwd):
            ##判断验证码是否正确
            if code == session['code']: ##验证码必须完全一致(区分大小写)
                session['user'] = u.name
                session['user_id'] = u.id
                ##将登录日志添加到数据库
                userlog = UserLog(
                    user_id=u.id,
                    ip=request.remote_addr,  ##python使用Flask框架获取用户IP地址的方法
                    area=get_ip_area(request.remote_addr)
                )
                db.session.add(userlog)
                db.session.commit()
                # return redirect(url_for('list'))
                return "登录成功"
            else:
                 flash('验证码不正确!','error')
                 return redirect(url_for('login'))
        else:
            # flash: 消息闪现,
            # 如何在前端html页面显示? Jinja2 get_flash_messages()
            # 返回的是一个列表, 想依次显示内容, 需要用到for循环;
            flash('用户或者密码不正确!','error')  ##闪现的种类不同,前端的内容不同
            return redirect(url_for('login'))
    else:
        return render_template('login.html', form=form)


@app.route('/logout/')
def logout():
    # 将会话中的key值弹出;
    session.pop('user', None)
    session.pop('user_id', None)
    # 注销跳转到登录页面, 或者公共首页
    return redirect(url_for('login'))


@app.route('/register/', methods=['POST', 'GET'])
def register():
    form = RegisterForm()
    if form.validate_on_submit():  ##validate_on_submit:会自动判断是否是一个POST请求
        data = form.data  # 获取表单提交的数据(字典数据类型)
        ##将注册的信息添加到数据库
        u = User(
            name=data['name'],
            pwd=generate_password_hash(data['pwd']),
            email=data['email'],
            phone=data['phone']
        )
        db.session.add(u)
        db.session.commit()
        flash('注册成功!', 'ok')
        return redirect('/register/')

    return render_template('register.html', form=form)


@app.route('/upload/', methods=['POST', 'GET'])
def upload():
    ##示例化表单
    form = UploadForm()
    if form.validate_on_submit():
        ##获取上传文件的文件名
        filename = form.file.data.filename
        ##将上传的文件保存到服务器
        form.file.data.save('/home/kiosk/wtfFlask/static/' + filename)
        flash("上传成功", "ok")
        return redirect('/upload/')
    return render_template('upload.html', form=form)


@app.route('/code/')  ##验证码的路由
def get_code():
    # 1.生成验证码
    from  doc.get_code import gene_code  # 从doc目录中导入生成验证码的函数
    image, code = gene_code() ##image图片,code图片中字符串的值
    # 2.将验证码图片以二进制的
    buf = BytesIO() ##将二进制数据赋给buf
    image.save(buf, 'png')  ##图片以.png保存
    buf_str = buf.getvalue()##获取二进制数据的字符串值

    session['code'] = code  ##将生成验证码中的字符串信息存在session中
    # 3.将数据显示给前端页面
    response = make_response(buf_str)  ##flask中的响应,response对象不过是一个遵循WSGI标准的应用而已
    response.headers['Content-Type'] = 'image/png'  ##响应头信息(还有个请求头信息request headers)
    return response


if __name__ == "__main__":
    app.run(host='0.0.0.0',port=9008)

猜你喜欢

转载自blog.csdn.net/qq_41661056/article/details/81135545