项目结构,没有提到的不需要
一:html
首先是前端页面,在templates目录下,效果是登陆信息保存到Mysql数据库,代码先呈上
<!DOCTYPE html>
<html lang="en">
<body>
<h1> Hello, please sign up! </h1>
<form method="POST" action="/">
{{ form.csrf_token }}
{{ form.name.label }} {{ form.name(size=20) }}
{{ form.email.label }} {{ form.email(size=20) }}
{{ form.psw.label }} {{ form.psw(size=8) }}
<input type="submit" value="Go">
</form>
</body>
</html>
二:app.py
主应用,没什么好说的
app.config['SECRET_KEY'] = 'AASDFASDF' #密钥,防御CSRF攻击 app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI # 数据库信息 app.config['SQLALCHEMY_TRACK_MODIFICALTIONS'] = True # 不开启会告警 db.init_app(app) # 初始化数据库 migrate = Migrate(app, db) # 数据库迁移 :1:flask db init 2:flask db migrate -m '内容说明' 3:flask db upgrade
数据库迁移在后面细说
自定义一个密码加密算法:
#jiami.py from hashlib import md5 def jiami(txt1,txt2): m1 = md5(txt1.encode()) m2 = md5(txt2.encode()) res = m1.hexdigest().encode()+m2.hexdigest().encode() return res
import datetime
from flask_migrate import Migrate
from flask import Flask, render_template, redirect, url_for
from forms import SignupForm # 表单信息
from models import Signups, Userinfo # 数据库表记录
from database import db, DB_URI # 数据库配置
from jiami import jiami # 密码加密
app = Flask(__name__)
app.config['SECRET_KEY'] = 'AASDFASDF'
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
app.config['SQLALCHEMY_TRACK_MODIFICALTIONS'] = True
db.init_app(app)
migrate = Migrate(app, db) # 数据库迁移 :1:flask db init 2:flask db migrate -m '内容说明' 3:flask db upgrade
@app.route("/", methods=('GET', 'POST'))
def signup():
form = SignupForm()
if not form.validate_on_submit(): # 空表单
return render_template('signup.html', form=form)
user = db.session.query(Userinfo).filter(Userinfo.name == form.name.data).first() # 查询一个
if user: # 该用户存在
password = jiami(form.name.data, form.psw.data).decode()
if user.password != password:
return redirect(url_for('fail')) # 密码错误
else:
return redirect(url_for('success')) # 登陆
else: # 该用户不存在
signup = Signups(name=form.name.data, email=form.email.data, date_signed_up=datetime.datetime.now())
password = jiami(form.name.data, form.psw.data).decode()
userinfo = Userinfo(name=form.name.data, password=password)
db.session.add(signup)
db.session.add(userinfo)
db.session.commit()
return redirect(url_for('success')) # 注册并登录
@app.route("/success")
def success():
return "登陆成功!"
@app.route("/fail")
def fail():
return "密码错误!"
if __name__ == '__main__':
app.run()
三:form.py
与前端表单数据交互的接口在form.py,里面需要用到wtforms,用表单对象的形式传递数据
from flask_wtf import FlaskForm
from wtforms.validators import DataRequired
from wtforms import StringField
class SignupForm(FlaskForm):
name = StringField('name', validators=[DataRequired()])
email = StringField('email', validators=[DataRequired()])
以对象的形式把参数传到前端,
前端:{{ form.name.label }} {{ form.name(size=20) }} form是app.py中响应的的参数: form = SignupForm() render_template('signup.html', form=form) 其内容是表单对象, form:name = StringField('name', validators=[DataRequired()])
四:database.py
配置数据库的信息,然后把参数传递到app.py进行初始化。这边只是配置数据库信息。
注意:不能在这边初始化数据库,初始化数据库需要调用app = Flask(__name__),这个是不能重复调用的
from flask_sqlalchemy import SQLAlchemy
"""
链接mysql数据库
"""
# 数据库配置
HOSTNAME = '127.0.0.1' #host
PORT = '3306'
DATABASE = 'test'
USERNAME = 'root'
PASSWORD = '密码'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
db = SQLAlchemy()
五:models.py
采用的是ORM模型,需要导入数据库。这里只是进行数据的封装,具体对封装后数据的操作同样实在app.py。根据需求创建字段。
from database import db
"""
ORM模型
"""
class Signups(db.Model):
__tablename__ = 'signups'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(256))
email = db.Column(db.String(256), unique=True)
date_signed_up = db.Column(db.DateTime())
class Userinfo(db.Model):
__tablename__ = 'userinfo'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(256))
password = db.Column(db.String(256))
以上就是这些内容。完成后需要进行数据库迁移。
在终端下进行下面三步操作:
flask db init
flask db migrate -m '内容说明'
flask db upgrade
结束后数据库就创建完成了。项目也可以启动了。