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 ...
随机推荐
- Convert DataTable to List<T> where Class of List is Dynamic
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Da ...
- HDU_3038 How Many Answers Are Wrong 【带权并查集】
一.题面 HDU3038 二.分析 用并查集可以方便的判断两个位置是否有关系,这种关系可以通过是否有公共父节点判断,如果有公共父节点则可以直接判断是否正确,如果没有公共父节点,就可以把这个条件与之前的 ...
- 江西理工大学南昌校区排名赛 F: 单身狗的骑马游戏
题目描述 萌樱花是一只单身狗. 萌樱花今天在学姐那里做了一道题: 假设赛马场上有n只马儿,第i只马儿的起点在第i米的位置,这些马儿都会朝着同一个方向奔跑. 每只马儿的速度都不一样,而且大家都不知道这些 ...
- HDU - 4686 函数积的前缀和
题意:求\(\sum_{i=0}^{n-1}a_ib_i\) 其中,\(a_i=A_xa_{i-1}+A_y,b_i=B_xb_{i-1}+B_y\) 构造矩阵分别维护\(a_ib_i,a_i,b_i ...
- 安装Linux虚拟机到执行Java程序
1.安装VMware 2.在VMware里安装 CentOs 镜像(CentOS-7.2-x86_64-DVD-1511.iso) 3.启动CentOs后如果不能上网,或者 没有 ifconfig命令 ...
- self_vue@1.0.0 dev: `webpack-dev-server --inline --progress --config build/webpack.dev.conf.js`
解决方案: 1.试一下 卸载npm uninstall webpack-dev-server,在安装这个npm i webpack-dev-server@2.9.7 2.删除node_modules目 ...
- 剑指offer——面试题15:二进制中 1的个数
// 面试题15:二进制中1的个数 // 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如 // 把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. #inc ...
- PIE SDK栅格拉伸渲染
1. 功能简介 栅格数据拉伸渲染是对指定的波段进行图像拉伸,并设置拉伸之后的颜色带,根据像元值和颜色带进行数据渲染. 2. 功能实现说明 2.1. 实现思路及原理说明 第一步 实例化拉伸渲染对象示例 ...
- 文献综述三:基于JSP的商品信息管理系统设计与开发
一.基本信息 标题:基于JSP的商品信息管理系统设计与开发 时间:2015 出版源:Computer Knowledge and Technology 文件分类:jsp技术的系统开发 二.研究背景 通 ...
- 分享:JAVA和C# 3DES加密解密
最近 一个项目.net 要调用JAVA的WEB SERVICE,数据采用3DES加密,涉及到两种语言3DES一致性的问题,下面分享一下,这里的KEY采用Base64编码,便用分发,因为Java的Byt ...