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博客类登录注册验证模块代码(十四)的更多相关文章

  1. Flask博客开发——登录验证码

    这部分为Flask博客的登录页面加个验证码.使用了PIL模块生成验证码图片,并通过Flask的session机制,进行验证码验证. 1.生成验证码 使用string模块:string.ascii_le ...

  2. vue koa2 mongodb 从零开始做个人博客(一) 登录注册功能前端部分

    0.效果演示 插入视频插不进来,就很烦.可以出门右拐去优酷看下(点我!). 1.准备工作 1.1前端框架 前端使用了基于vue.js的nuxt.js.为什么使用nuxt.js? 首先我做的是博客的项目 ...

  3. vue koa2 mongodb 从零开始做个人博客(二) 登录注册功能后端部分

    0.效果演示 插入视频插不进来,就很烦.可以出门右拐去优酷看下(点我!). 1.后端搭建 1.1项目结构 首先看一下后端的server目录 挨个解释一下 首先dbs文件夹顾名思义,操作数据库的,mod ...

  4. Flask博客开发——Tinymce编辑器

    之前Flask博客的文本编辑器比较简陋,这里为博客添加个优雅易用的Tinymce文本编辑器. 1.项目中添加Tinymce 下载好Tinymce包以及语言包,并添加到项目中.添加到项目的方法,参考了这 ...

  5. Node.js 从零开发 web server博客项目[登录]

    web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ...

  6. 关于个人全栈项目【臻美IT】博客类出现的问题以及解决方法

    每做一个项目,要记得写下心得哦,别偷懒啊!先上网址:https://www.maomin.club/ 这个项目属于博客类的,因为百度审核的问题就大体做了下,就当来练练手,里面文章链接的是CSDN的博客 ...

  7. Python学习:8.小项目之登录注册验证

    简介 本次项目登录注册验证是对之前学习知识点的加深学习,这次项目的练习的知识点有函数.判断语句.循环语句.文件操作等. 项目流程 运行代码之后,输出登录或者注册选项. 当选择登录之后,输入用户名密码, ...

  8. CSDN博客添加量子恒道统计代码步骤

    CSDN博客添加量子恒道统计代码步骤. 1. 去量子恒道网站统计 注册账户: 2. 添加已有的CSDN博客地址: 3. 添加博客后恒道代码里面会给你一个JavaScript脚本,记下里面的一串数字: ...

  9. 基于HTML5手机登录注册表单代码

    分享一款基于HTML5手机登录注册表单代码.这是一款鼠标点击注册登录按钮弹出表单,适合移动端使用.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class=&qu ...

随机推荐

  1. 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 ...

  2. HDU_3038 How Many Answers Are Wrong 【带权并查集】

    一.题面 HDU3038 二.分析 用并查集可以方便的判断两个位置是否有关系,这种关系可以通过是否有公共父节点判断,如果有公共父节点则可以直接判断是否正确,如果没有公共父节点,就可以把这个条件与之前的 ...

  3. 江西理工大学南昌校区排名赛 F: 单身狗的骑马游戏

    题目描述 萌樱花是一只单身狗. 萌樱花今天在学姐那里做了一道题: 假设赛马场上有n只马儿,第i只马儿的起点在第i米的位置,这些马儿都会朝着同一个方向奔跑. 每只马儿的速度都不一样,而且大家都不知道这些 ...

  4. 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 ...

  5. 安装Linux虚拟机到执行Java程序

    1.安装VMware 2.在VMware里安装 CentOs 镜像(CentOS-7.2-x86_64-DVD-1511.iso) 3.启动CentOs后如果不能上网,或者 没有 ifconfig命令 ...

  6. 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目 ...

  7. 剑指offer——面试题15:二进制中 1的个数

    // 面试题15:二进制中1的个数 // 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如 // 把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. #inc ...

  8. PIE SDK栅格拉伸渲染

    1. 功能简介 栅格数据拉伸渲染是对指定的波段进行图像拉伸,并设置拉伸之后的颜色带,根据像元值和颜色带进行数据渲染. 2. 功能实现说明 2.1. 实现思路及原理说明 第一步 实例化拉伸渲染对象示例 ...

  9. 文献综述三:基于JSP的商品信息管理系统设计与开发

    一.基本信息 标题:基于JSP的商品信息管理系统设计与开发 时间:2015 出版源:Computer Knowledge and Technology 文件分类:jsp技术的系统开发 二.研究背景 通 ...

  10. 分享:JAVA和C# 3DES加密解密

    最近 一个项目.net 要调用JAVA的WEB SERVICE,数据采用3DES加密,涉及到两种语言3DES一致性的问题,下面分享一下,这里的KEY采用Base64编码,便用分发,因为Java的Byt ...