一、使用python连接数据库
要记得名字和密码都要用自己设置的,不然会报错:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
HOSTNAME = '127.0.0.1'
PORT = '3306'
USERNAME = 'root'
PASSWORD = '123456'
DATABASE = 'daimakuangjiashixian'
DB_URI = "mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8".format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE)
SQLALCHEMY_DATABASE_URI = DB_URI
再在主文件中引用本py文件
import config
二、实现注册功能
wtforms插件库,它能够做表单验证,将用户提交上来的数据进行验证是否符合系统要求,使用自己的代码进行约束和验证是否符合自己的约束,创建一个class,对注册列表进行创建,有对输入的密码进行确认:
class RegisterForm(wtforms.Form):
email = wtforms.StringField( validators=[Email(message='邮箱格式错误')])
capcha = wtforms.StringField(validators=[Length(min=4,max=4,message='验证码格式错误')])
username = wtforms.StringField(validators=[Length(min=3,max=20,message='用户名长度必须在3到20个字符之间')])
password = wtforms.StringField(validators=[Length(min=6,max=20,message='密码长度必须在6到20个字符之间')])
password_confirm = wtforms.StringField(validators=[EqualTo('password',message='两次输入的密码不一致')])
我们使用get的请求方法,去读取前端得到的数据,再以此存入我们的数据库,若表单读取成功,我们将进行下一步登录,若没有成功,则我们再次回到此页面,重新来:
def register():
# 如果请求方法为GET,则返回注册页面
if request.method == 'GET':
return render_template('register.html')
else:
form = RegisterForm(request.form)
# 如果表单验证成功,则创建用户模型,并将数据添加到数据库
if form.validate():
email = form.email.data
username = form.username.data
password = form.password.data
user = UserModel(email=email, username=username, password=generate_password_hash(password))
db.session.add(user)
db.session.commit()
# 注册成功后,跳转到登录页面
return redirect(url_for('auth.login'))
else:
# 如果表单验证失败,则打印错误信息,并跳转到注册页面
print(form.errors)
return redirect(url_for('auth.register'))
我们在创建一个新的model文件,写入我们存入数据库时需要的代码:
class UserModel(db.Model):
# 表名
__tablename__ = 'user'
# 主键
id = db.Column(db.Integer, primary_key=True,autoincrement=True)
# 用户名
username = db.Column(db.String(100), nullable=False)
# 密码
password = db.Column(db.String(200), nullable=False)
# 邮箱
email = db.Column(db.String(100), nullable=False, unique=True)
# 加入时间
join_time = db.Column(db.DateTime, default=datetime.now)
三、实现登录功能
做完注册的功能,登录的功能就不会太难,只是去读取存入数据库的代码是否为正确的,这里我们也是用的是get方法,使用get在数据库中查找数据是否存在,登录成功后浏览器会进行保存账号密码,对账户的密码使用session函数进行加密,若没有登录成功将会继续留在本页面:
def login():
if request.method == 'GET':
return render_template('login.html')
else:
form = LoginForm(request.form)
if form.validate():
email = form.email.data
password = form.password.data
user = UserModel.query.filter_by(email=email).first()
if not user:
print('用户不存在')
return redirect(url_for('auth.login'))
if check_password_hash(user.password, password):
session['user_id'] = user.id
return redirect('/')
else:
print('密码错误')
return redirect(url_for('auth.login'))
else:
print(form.errors)
return redirect(url_for('auth.login'))