Flask博客类登录注册验证模块代码(十四)
1 文件系统
blog #博客类
App
forms #表单
__init__.py
user.py
models #模型
__init__.py
user.py
static #静态文件
templates #模板
common #基类模板
base.html
email #邮件
email.html
errors #错误
error.html
main #主页
index.html
user #用户登录注册
login.html
register.html
views #视图蓝本
__init__.py
main.py
user.py
__init__.py
email.py #邮件
extensions.py #扩展库
settings.py #系统配置
migrations #迁移文件
manage.py #启动文件
2 forms目录下
#__init__.py
from .user import Register,Login
#user.py
from flask_wtf import FlaskForm
from wtforms import SubmitField,StringField,PasswordField,BooleanField,ValidationError
from App.models import User
from wtforms.validators import DataRequired,Email,Length,EqualTo
class Register(FlaskForm):
username = StringField('用户名',validators=[DataRequired(message='用户名不能为空...'),Length(min=6,max=12,message='长度为6-12位')],render_kw={'placeholder':'请输入用户名...','maxlength':12})
password = PasswordField('密码',validators=[DataRequired(message='密码不能为空'),Length(min=6,max=12,message='长度为6-12位'),EqualTo('confirm',message='俩次密码不一致')],render_kw={'placeholder':'请输入密码...','maxlength':12})
confirm = PasswordField('密码',validators=[DataRequired(message='密码不能为空'),Length(min=6,max=12,message='长度为6-12位')],render_kw={'placeholder':'请输入确认密码...','maxlength':12})
email = StringField('邮箱',validators=[Email(message='请输入正确的邮箱')],render_kw={'placeholder':'请输入邮箱...','maxlength':30})
submit = SubmitField('注册')
# 自定义验证器 用户名是否存在
def validate_username(self, field):
if User.query.filter(User.username == field.data).first():
raise ValidationError('该用户已注册!!!')
# 自定义验证器 邮箱是否存在
def validate_email(self, field):
if User.query.filter(User.email == field.data).first():
raise ValidationError('该邮箱已注册!!!')
class Login(FlaskForm):
username = StringField('用户名',validators=[DataRequired(message='用户名不能为空...'), Length(min=6, max=12, message='长度为6-12位')],render_kw={'placeholder': '请输入用户名...', 'maxlength': 12})
password = PasswordField('密码',validators=[DataRequired(message='密码不能为空'),Length(min=6, max=12, message='长度为6-12位')],render_kw={'placeholder': '请输入密码...', 'maxlength': 12})
remember = BooleanField('记住我')
submit = SubmitField('登录')
3 models目录下
#__init__.py
from .user import User
#user.py
from App.extensions import db
from werkzeug.security import generate_password_hash,check_password_hash
from itsdangerous import TimedJSONWebSignatureSerializer as Seralize
from flask import current_app
from flask_login import UserMixin
from App.extensions import login_manager
class User(UserMixin,db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer,primary_key=True)
username = db.Column(db.String(12),index=True)
password_hash = db.Column(db.String(128))
sex = db.Column(db.Boolean,default=True)
age = db.Column(db.Integer)
email = db.Column(db.String(40))
icon = db.Column(db.String(70),default='default.jpg')
#当期账户激活状态
confirm = db.Column(db.Boolean,default=False)
@property
def password(self):
raise ValueError
#密码设置为hash
@password.setter
def password(self, password):
self.password_hash = generate_password_hash(password)
#生成token的方法
def generate_token(self):
s = Seralize(current_app.config['SECRET_KEY'])
return s.dumps({'id':self.id})
#检测token的方法
@staticmethod
def check_token(token):
s = Seralize(current_app.config['SECRET_KEY'])
# print(s)
#从当前的token中拿出字典
try:
id = s.loads(token)['id']
except:
return False
#获取id对应的user数据
u = User.query.get(id)
if not u:
return False
if not u.confirm:
print(u.confirm)
u.confirm = True
print(u.confirm)
db.session.add(u)
return True
#验证密码
def check_password_hash(self,password):
return check_password_hash(self.password_hash,password)
#登录认证的回调 保持数据的一致性
@login_manager.user_loader
def user_loader(uid):
return User.query.get(int(uid))
3 views目录
#__init__.py
from .user import user
from .main import main
BluePrint = [
(user,''),
(main,'')
]
def config_blueprint(app):
for blueprint,prefix in BluePrint:
app.register_blueprint(blueprint,url_prefix=prefix)
#main.py
from flask import Blueprint,render_template
main = Blueprint('main',__name__)
@main.route('/')
def index():
return render_template('main/index.html')
#user.py
from flask import Blueprint,render_template,flash,redirect,url_for
from App.models import User
from App.forms import Register,Login
from App.extensions import db
from App.email import send_mail
from flask_login import login_user,logout_user,current_user
user = Blueprint('user',__name__)
#注册
@user.route('/register/',methods=['GET','POST'])
def register():
form = Register()
if form.validate_on_submit():
#实例化user模型类
u = User(username=form.username.data,password=form.password.data,email=form.email.data)
db.session.add(u)
db.session.commit()
#生成token
token = u.generate_token()
#发送邮件
send_mail('邮件激活',form.email.data,'activate',username=form.username.data,token=token)
flash('注册成功请去邮箱中激活')
#跳转到登录页面
return redirect(url_for('user.login'))
return render_template('user/register.html',form=form)
@user.route('/activate/<token>/')
def activate(token):
if User.check_token(token):
flash('激活成功 请登录')
return redirect(url_for('user.login'))
else:
flash('激活失败')
return redirect(url_for('main.index'))
#登录
#加一个时间的验证 如果输入错误超过三次 把激活改为False
@user.route('/login/',methods=['GET','POST'])
def login():
form = Login()
if form.validate_on_submit():
u = User.query.filter_by(username=form.username.data).first()
if not u:
flash('该用户不存在')
elif not u.confirm:
flash('该用户还没激活!!!')
elif u.check_password_hash(form.password.data):
flash('登录成功!')
login_user(u,remember=form.remember.data)
return redirect(url_for('main.index'))
else:
flash('请输入正确的密码')
return render_template('user/login.html',form=form)
#退出登录
@user.route('/logout/')
def logout():
logout_user()
flash('退出成功!')
return redirect(url_for('main.index'))
4 APP应用下
__init__.py
from flask import Flask,render_template
from App.settings import config
from App.extensions import config_extentions
from App.views import config_blueprint
#利用工厂函数统一在调用时绑定
def create_app(config_name):
app = Flask(__name__)
app.config.from_object(config[config_name])
config_extentions(app)
config_blueprint(app)
errors(app)
return app
#错误页面
def errors(app):
@app.errorhandler(404)
def page_not_found(e):
return render_template('errors/error.html',error=e)
@app.errorhandler(500)
def server_error(e):
return render_template('errors/error.html', error=e)
email.py
from flask import render_template,current_app
from flask_mail import Message
from threading import Thread
from App.extensions import mail
def async_send_mail(app,msg):
#获取文件上下文
with app.app_context():
mail.send(message=msg)
#定义发送邮件函数
def send_mail(subject,to,tem,**kwargs):
app = current_app._get_current_object()
msg = Message(subject=subject, recipients=[to], sender=app.config['MAIL_USERNAME'])
msg.html = render_template('email/'+tem+'.html',**kwargs)
send = Thread(target=async_send_mail,args=(app,msg))
send.start()
extensions.py
from flask_bootstrap import Bootstrap
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_login import LoginManager
from flask_mail import Mail
#扩展库的实例化
bootstrap = Bootstrap()
db = SQLAlchemy()
migrate = Migrate(db=db)
login_manager = LoginManager()
mail = Mail()
#统一进行app的初始化操作
def config_extentions(app):
bootstrap.init_app(app)
db.init_app(app)
migrate.init_app(app=app)
login_manager.init_app(app=app)
mail.init_app(app)
login_manager.login_view = 'user.login'
login_manager.login_message = '请登录在访问'
login_manager.session_protection = 'strong'
settings.py
import os
#所有环境配置的基类
class Config:
SECRET_KEY = 'xiafsadwsda'
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_COMMIT_ON_TEARDOWN = True
MAIL_SERVER = os.environ.get('MAIL_SERVER','smtp.163.com')
MAIL_USERNAME = os.environ.get('MAIL_USERNAME','15858017847@163.com')
MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD','mm22kk11')
#测试配置
class TestingConfig(Config):
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:xxx@127.0.0.1:3306/testing'
#开发配置
class DevelopmentConfig(Config):
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:xxx@127.0.0.1:3306/blogModel'
#生产配置
class ProductionConfig(Config):
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:xxx@127.0.0.1:3306/development'
#一个配置的字典
config = {
'development':DevelopmentConfig,
'production':ProductionConfig,
'test':TestingConfig,
'default':DevelopmentConfig
}
manage.py
from flask_script import Manager
from App import create_app
from flask_migrate import MigrateCommand
#调用创建create_app函数
app = create_app('default')
manager = Manager(app)
manager.add_command('db',MigrateCommand)
if __name__ == '__main__':
manager.run()
html页面的代码比较多,有需要的可以访问源码地址,感谢阅读!!
GitHub源码地址:https://github.com/whyjust/blog
Flask博客类登录注册验证模块代码(十四)的更多相关文章
- Flask博客开发——登录验证码
这部分为Flask博客的登录页面加个验证码.使用了PIL模块生成验证码图片,并通过Flask的session机制,进行验证码验证. 1.生成验证码 使用string模块:string.ascii_le ...
- vue koa2 mongodb 从零开始做个人博客(一) 登录注册功能前端部分
0.效果演示 插入视频插不进来,就很烦.可以出门右拐去优酷看下(点我!). 1.准备工作 1.1前端框架 前端使用了基于vue.js的nuxt.js.为什么使用nuxt.js? 首先我做的是博客的项目 ...
- vue koa2 mongodb 从零开始做个人博客(二) 登录注册功能后端部分
0.效果演示 插入视频插不进来,就很烦.可以出门右拐去优酷看下(点我!). 1.后端搭建 1.1项目结构 首先看一下后端的server目录 挨个解释一下 首先dbs文件夹顾名思义,操作数据库的,mod ...
- Flask博客开发——Tinymce编辑器
之前Flask博客的文本编辑器比较简陋,这里为博客添加个优雅易用的Tinymce文本编辑器. 1.项目中添加Tinymce 下载好Tinymce包以及语言包,并添加到项目中.添加到项目的方法,参考了这 ...
- Node.js 从零开发 web server博客项目[登录]
web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...
- 关于个人全栈项目【臻美IT】博客类出现的问题以及解决方法
每做一个项目,要记得写下心得哦,别偷懒啊!先上网址:https://www.maomin.club/ 这个项目属于博客类的,因为百度审核的问题就大体做了下,就当来练练手,里面文章链接的是CSDN的博客 ...
- Python学习:8.小项目之登录注册验证
简介 本次项目登录注册验证是对之前学习知识点的加深学习,这次项目的练习的知识点有函数.判断语句.循环语句.文件操作等. 项目流程 运行代码之后,输出登录或者注册选项. 当选择登录之后,输入用户名密码, ...
- CSDN博客添加量子恒道统计代码步骤
CSDN博客添加量子恒道统计代码步骤. 1. 去量子恒道网站统计 注册账户: 2. 添加已有的CSDN博客地址: 3. 添加博客后恒道代码里面会给你一个JavaScript脚本,记下里面的一串数字: ...
- 基于HTML5手机登录注册表单代码
分享一款基于HTML5手机登录注册表单代码.这是一款鼠标点击注册登录按钮弹出表单,适合移动端使用.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div class=&qu ...
随机推荐
- BZOJ - 2157 树链剖分+线段树
/*H E A D*/ int from[maxn<<1],to[maxn<<1],nxt[maxn<<1],cost[maxn<<1],head[ma ...
- Bubble Sort Graph CodeForces - 340D || 最长不下降/上升子序列
Bubble Sort Graph CodeForces - 340D 题意: 给出一个n个数的数列,建一个只有n个结点没有边的无向图,对数列进行冒泡排序,每交换一对位置在(i,j)的数在点i和点j间 ...
- PKI公钥基础设施简介
PKI(Public Key Infrastructure)公钥基础设施是提供公钥加密和数字签名服务的系统或平台,目的是为了管理密钥和证书.一个机构通过采用PKI 框架管理密钥和证书可以建立一个安全的 ...
- MyBatis模糊查询相关
Mybatis模糊查询的实现不难,如下实例:在UserMapper.xml中根据用户名模糊查询用户: <!-- 模糊查询用户 --> <select id="findSom ...
- 小问题总结:鼠标点击到输入框(input)里的时候,输入框的提示消失,鼠标再移开,输入框提示出现
问题如标题: 鼠标点击到输入框(input)里的时候,输入框的提示消失,鼠标再移开,输入框提示出现.如图所示: 做法如下: <input type="text" name ...
- java中的集合:继承关系和简介
1.继承关系图 2.Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collect ...
- ajax请求方法及参数说明
$.ajax()请求示例 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- 如何添加网页QQ在线组件
免费开通QQ推广服务 复制代码到你想要展示的位置 粘贴,完成.
- # 防止xss攻击,过滤script标签,获取出标签外的内容
from bs4 import BeautifulSoups = '<h1>123</h1> <span>456<span>'soup = Beauti ...
- C# 操作字符串
//(1)字符访问(下标访问s[i]) s ="ABCD"; Console.WriteLine(s[0]); // 输出"A ...