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)
Flask-wtf之wtfFlask后端代码
猜你喜欢
转载自blog.csdn.net/qq_41661056/article/details/81135545
今日推荐
周排行