基于Flask實(shí)現(xiàn)用戶的登錄/注冊。
# 導(dǎo)入表單基類
from flask_wtf import FlaskForm
# 導(dǎo)入需要用到的表格類型
from wtforms import StringField, PasswordField, SubmitField
# 導(dǎo)入需要用的驗證方式
from wtforms.validators import DataRequired, EqualTo, Length, Email
# 用戶注冊表單
class RegisterForm(FlaskForm):
# 用戶名表框
username = StringField(
label= '用戶名', # 標(biāo)簽
validators=[ # 驗證方式
DataRequired() # 不能為空
]
)
# 密碼表框
password = PasswordField(
label='密碼',
validators=[
DataRequired(),
Length(6,16,message='密碼長度應(yīng)在6-16位') # 密碼長度必須在6-16,否則輸出提示信息
]
)
# 郵箱表框
email = StringField(
label='郵箱',
validators=[
DataRequired(),
Email(message='郵箱不合法')
]
)
# 注冊按鈕
submit = SubmitField(
label='注冊'
)
# 登錄表單
class LoginForm(FlaskForm):
username = StringField(
label='用戶名',
validators=[
DataRequired()
]
)
password = PasswordField(
label='密碼',
validators=[
Length(6, 16, message='密碼長度應(yīng)在6-16位')
]
)
submit = SubmitField(
label='登錄'
)
from . import home_bp # 導(dǎo)入藍(lán)圖
from flask import render_template # 用于模板渲染
@home_bp.route('/')
def index():
return render_template('index.html')
@home_bp.route('/login/',methods =['GET','POST'])
def login():
from app.home.forms import LoginForm
form = LoginForm()
return render_template('login.html',form=form)
@home_bp.route('/register/',methods =['GET','POST'])
def register():
from app.home.forms import RegisterForm
form = RegisterForm()
return render_template('register.html',form=form)
基模板(/app/templates/base.html)
為了統(tǒng)一頁面風(fēng)格,繼承bootstrap/base.html,創(chuàng)建自己的基模板
創(chuàng)新互聯(lián)公司主要從事網(wǎng)頁設(shè)計、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機(jī)版網(wǎng)站建設(shè))、成都響應(yīng)式網(wǎng)站建設(shè)、程序開發(fā)、網(wǎng)站優(yōu)化、微網(wǎng)站、微信小程序定制開發(fā)等,憑借多年來在互聯(lián)網(wǎng)的打拼,我們在互聯(lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了豐富的成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計、網(wǎng)站設(shè)計、網(wǎng)絡(luò)營銷經(jīng)驗,集策劃、開發(fā)、設(shè)計、營銷、管理等多方位專業(yè)化運(yùn)作于一體。
登錄頁面(/app/templates/login.html)
登錄頁面,繼承自上面的base.html,并在content中生成登錄表單
在MySQL shell中創(chuàng)建數(shù)據(jù)庫
在配置文件中添加代碼如下:
# 數(shù)據(jù)庫配置
SQLALCHEMY_DATABASE_URI ="mysql://root:mysql@locallost/sentry" # 指定數(shù)據(jù)庫
SQLALCHEMY_TRACK_MODIFICATIONS = False # 關(guān)閉追蹤
在models.py中編寫數(shù)據(jù)表結(jié)構(gòu)如下:
from app import db
# 用戶數(shù)據(jù)表
class User(db.Model):
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
name = db.Column(db.String(30),unique=True)
password = db.Column(db.String(300))
email = db.Column(db.String(40),unique=True)
def __repr__(self):
return ""%self.name
在__init__.py中利用SQLAlchemy實(shí)例化數(shù)據(jù)庫對象
from flask_sqlalchemy import SQLAlchemy
import pymysql
# 數(shù)據(jù)庫報錯問題
pymysql.install_as_MySQLdb()
# 讀取配置文件的配置信息
app.config.from_pyfile('../config.py')
db = SQLAlchemy(app)
在manage.py中添加代碼如下:
from app import db # 導(dǎo)入數(shù)據(jù)庫對象
from werkzeug.security import generate_password_hash # 哈希加密
from app.models import User # 導(dǎo)入數(shù)據(jù)表類
@manager.command # 使函數(shù)可以作為命令在shell中直接執(zhí)行
def db_init():
db.drop_all() # 刪除已有數(shù)據(jù)表
db.create_all() # 創(chuàng)建新數(shù)據(jù)表
admin = User(name='admin', password=generate_password_hash('admin')) # 實(shí)例化一個用戶對象
db.session.add(admin) # 添加入session
db.session.commit() # 提交給數(shù)據(jù)庫
print("數(shù)據(jù)庫初始化成功")
在python shell 中執(zhí)行 python manage.py db_init 即可完成數(shù)據(jù)庫初始化
在mysql中查看
from werkzeug.security import generate_password_hash # 哈希加密
from app import db
from . import home_bp # 導(dǎo)入藍(lán)圖
from flask import render_template, redirect, request, flash, session, url_for
@home_bp.route('/')
def index():
return render_template('index.html')
# 登錄
@home_bp.route('/login/',methods =['GET','POST'])
def login():
from app.home.forms import LoginForm
from app.models import User
form = LoginForm()
if form.validate_on_submit():
# 獲取表單中的數(shù)據(jù)
username = form.username.data
password = form.password.data
# 在數(shù)據(jù)庫中查找
user = User.query.filter_by(name = username).first()
# 用戶名和密碼匹配成功時
if user and user.verify_password(password):
# 登陸成功將用戶信息添加到session信息中去
session['user']=user.name
session['id']= user.id
flash('登錄成功')
return redirect(url_for('home.index'))
flash('用戶名或密碼錯誤')
return render_template('login.html',form=form)
# 注冊
@home_bp.route('/register/',methods =['GET','POST'])
def register():
from app.home.forms import RegisterForm
from app.models import User
form = RegisterForm()
if form.validate_on_submit():
# 獲取表單中的數(shù)據(jù)
name = form.username.data
password = form.password.data
email = form.email.data
if User.query.filter_by(name=name).first():
flash('用戶名已存在')
return redirect(url_for('home.register'))
if User.query.filter_by(email=email).first():
flash('郵箱已占用')
return redirect(url_for('home.register'))
# 密碼進(jìn)行哈希加密
user = User(name=name,password=generate_password_hash(password),email=email)
db.session.add(user)
db.session.commit()
flash('注冊成功,請登錄')
return redirect(url_for('home.login'))
return render_template('register.html',form=form)
# 注銷
@home_bp.route('/logout/')
def logout():
# 清除session信息
session.clear()
return redirect(url_for('home.login'))