models:进行这一步首先要在mysql中创建名字为todoflask的数据库,且数据库的密码为redhat。
import random
import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from datetime import datetime
from flask_bootstrap import Bootstrap
from werkzeug.security import generate_password_hash, check_password_hash
"""
# session设置:
1).
2).
3).
app = Flask(__name__)
app.config['SECRET_KEY'] = '123456'
# or
app.secret_key = '123456'
# or
app.config.update(SECRET_KEY='123456')
"""
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:redhat@localhost/todoflask" #连接数据库
app.config['SECRET_KEY'] = os.urandom(24) #随机生成
Bootstrap(app)
db = SQLAlchemy(app) # 实例化db对象
class User(db.Model):
id = db.Column(db.Integer, autoincrement=True, primary_key=True)
name = db.Column(db.String(50), unique=True) # unique: 指定该列信息是唯一的;
pwd = db.Column(db.String(100)) # 此处为了用户帐号的安全性, 必须对密码进行加密;
email = db.Column(db.String(20), unique=True)
phone = db.Column(db.String(20), unique=True)
info = db.Column(db.Text) # 个性简介
addtime = db.Column(db.DateTime, default=datetime.now())
userlogs = db.relationship('UserLog', backref="user")
def check_pwd(self, pwd):
return check_password_hash(self.pwd, 'redhat3')
class UserLog(db.Model): # 用户登录日志
id = db.Column(db.Integer, autoincrement=True, primary_key=True)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
ip = db.Column(db.String(100)) # 登录的IP
add_time = db.Column(db.DateTime, default=datetime.now())
area = db.Column(db.String(100)) # 登录的城市
forms:
from flask_wtf import FlaskForm
from flask_wtf.file import FileRequired, FileAllowed
from wtforms import StringField, PasswordField, SubmitField, FileField
from wtforms.validators import DataRequired, EqualTo, Regexp, Email, ValidationError, Length
from models import User
class LoginForm(FlaskForm):
name=StringField(
label="用户名",
validators=[
DataRequired("请输入用户名!"),
Length(3,20)
],
render_kw={
'placeholder':"请输入用户名",
"class":"form-control"
}
)
pwd=PasswordField(
label="密码",
validators=[
DataRequired("请输入密码!")
],
render_kw={
'placeholder':"请输入密码",
"class": "form-control"
}
)
submit=SubmitField(
render_kw={
'value':"登录",
'class':'btn btn-success pull-right'
}
)
class RegisterForm(FlaskForm):
name=StringField(
label="用户名",
validators=[
DataRequired("请输入用户名")
],
render_kw={
'placeholder':"请输入用户名"
}
)
email=StringField(
label="邮箱",
validators=[
DataRequired("请输入邮箱"),
Email("邮箱格式不正确!")
],
render_kw={
'placeholder': "请输入邮箱",
}
)
phone=StringField(
label="电话号码",
validators=[
DataRequired("请输入电话"),
Regexp('1\d{10}',message="手机格式不正确!")
],
render_kw={
'placeholder': "请输入电话号码",
}
)
pwd=PasswordField(
label="密码",
validators=[
DataRequired("请输入密码!")
],
render_kw={
'placeholder':"请输入密码",
"class":"form-control"
}
)
repwd=PasswordField(
label="密码",
validators=[
DataRequired("请输入确认密码"),
EqualTo('pwd',message="两次密码不一致!")
],
render_kw={
'placeholder':"请输入确认密码",
"class":"form-control"
}
)
submit=SubmitField(
render_kw={
'value':"登录",
'class':'btn btn-success pull-right'
}
)
def validate_name(self,field):
name=field.data
user=User.query.filter_by(name=name).count()
if user==1:
raise ValidationError("昵称已经存在")
def validate_email(self,field):
email=field.data
user=User.query.filter_by(email=email).count()
if user == 1:
raise ValidationError("邮箱已经存在")
def validate_phone(self,field):
phone=field.data
user=User.query.filter_by(phone=phone).count()
if user == 1:
raise ValidationError("电话号码已经存在")
class UploadForm(FlaskForm):
file=FileField(
label="简历",
validators=[
FileRequired(),
FileAllowed(['pdf','txt'], '只接受.pdf和.txt格式的简历')
]
)
submit=SubmitField(
render_kw={
'value':"上传",
'class':'btn btn-success pull-right'
}
)
wtfFlask:
from io import BytesIO
from werkzeug.security import check_password_hash, generate_password_hash
from forms import LoginForm, RegisterForm, UploadForm
from models import app, db, User, UserLog
from flask import render_template, redirect, url_for, request, flash, session, make_response
from functools import wraps
from urllib.request import urlopen
import json
def get_ip_area(ip):# 通过ip获取该IP的所在城市和国家;
url = 'http://ip.taobao.com/service/getIpInfo.php?ip=%s' % (ip)# 构造url地址, 使用淘宝的API接口
json_data = urlopen(url).read().decode('utf-8')# 获取页面返回的内容()
s_data = json.loads(json_data)# 将json格式的数据转换为字典格式;
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()
if request.method == 'POST':# 判断用户的HTTP请求方法
data = request.form# 1). 接收提交的数据;
name = data['name']
pwd = data['pwd']
u = User.query.filter_by(name=name).first()# 2). 判断用户名是否存在, 密码是否正确?
if u and check_password_hash(u.pwd, pwd):
session['user'] = u.name
session['user_id'] = u.id
userlog = UserLog(
user_id=u.id,
ip=request.remote_addr,
area=get_ip_area(request.remote_addr)
)
db.session.add(userlog)
db.session.commit()
return "登录成功"
else:
flash('用户或者密码不正确!')# flash: 消息闪现,
return redirect(url_for('login'))
else:
return render_template('login.html',form=form)
@app.route('/logout/')
def logout():
session.pop('user', None)# 将会话中的key值弹出;
session.pop('user_id', None)
return redirect(url_for('login'))# 注销跳转到登录页面, 或者公共首页
@app.route('/register/',methods=['GET','POST'])
def register():
form=RegisterForm()
if form.validate_on_submit():
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/PycharmProjects/Charm/day-27/doc'+filename)
flash("上传成功",'ok')
return redirect('/upload/')
return render_template('upload.html',form=form)
@app.route('/code/')
def get_code():
from doc.get_code import gene_code
image,code=gene_code
buf=BytesIO()
image.save(buf,'png')
buf_str=buf.getvalue()
response=make_response(buf_str)
response.headers['Content-Type']='image/png'
session['code']=code
return response
if __name__ == "__main__":
app.run(port=9007)
下面写的就是前端页面,它们都写在文件夹templates
login.html
{% extends 'bootstrap/base.html' %}
{% block title %}用户登录{% endblock %}
{% block content %}
<div class="col-md-8 col-md-offset-2">
<form class="form-horizontal" action="{{ url_for('login') }}" method="post">
<h2>用户登录</h2>
{% for error in get_flashed_messages() %}
<p style=" color:red;">{{ error }}</p>
{% endfor %}
<div class="form-group">
<label class="col-sm-2 control-label">{{ form.name.label }}</label>
<div class="col-sm-10">
{# <input type="text" class="form-control" name="name" placeholder="请输入用户名">#}
{{ form.name }}
</div>
</div>
<div class="form-group">
<label class="col-sm-2 control-label">{{ form.pwd.label }}</label>
<div class="col-sm-10">
{# <input type="password" class="form-control" name="pwd" placeholder="请输入密码">#}
{{ form.pwd }}
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<div class="checkbox">
<label>
<input type="checkbox"> Remember me
</label>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
{# <button type="submit" class="btn btn-default">登录</button>#}
{{ form.submit }}
</div>
</div>
</form>
</div>
{% endblock %}
register.html
{% extends 'base.html' %}
{% import 'bootstrap/wtf.html' as wtf %}
{% block content %}
<div class="col-md-6 col-md-offset-3">
{% for msg in get_flashed_messages(category_filter='ok') %} {# 显示闪现的所有信息 #}
<div class="alert alert-success alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span
aria-hidden="true">×</span>
</button>
<strong>Success!</strong> {{ msg }}.
</div>
{% endfor %}
{% for msg in get_flashed_messages(category_filter='error') %}
<div class="alert alert-warning alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span
aria-hidden="true">×</span>
</button>
<strong>Warning!</strong> {{ msg }}.
</div>
{% endfor %}
{{ wtf.quick_form(form) }}
</div>
{% endblock %}
upload.html
{% extends 'base.html' %}
{% import 'bootstrap/wtf.html' as wtf %}
{% block content %}
<div class="col-md-6 col-md-offset-2">
<h3>上传简历</h3>
{% for msg in get_flashed_messages(category_filter='ok') %}
<div class="alert alert-success alert-dismissable" role="alert">
<button type="button" class="close" data-dismiss="alert"
aria-label="Close"><span aria-label="true">×</span>
</button>
<strong>Success!</strong>{{ msg }}
</div>
{% endfor %}
{% for msg in get_flashed_messages(category_filter='error') %}
<div class="alert alert-warning alert-dismissable" role="alert">
<button type="button" class="close" data-dismiss="alert"
aria-label="Close"><span aria-label="true">×</span>
</button>
<strong>Warning!</strong>{{ msg }}
</div>
{% endfor %}
{{ wtf.quick_form(form) }}
</div>
{% endblock %}