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. Linux系统下Qt环境搭建

    http://www.linuxidc.com/Linux/2013-07/87576.htm 主要是需要提前安装一些动态库,否则编译的时候会出现 /usr/bin/ld: cannot find - ...

  2. ssm裤架搭建异常: Dependency annotations: {@javax.annotation.Resource(shareable=true, lookup=, name=, description=, authenticationType=CONTAINER, type=class java.lang.Object, mappedName=)}

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService' ...

  3. 移动端bug和优化

    1.字体兼容bug 描叙:ios默认字体和andriod不一样,需要设置html的默认字体样式例子:font-family: PingFang-SC-Regular,Helvetica,sans-se ...

  4. hash & heap - 20181023 - 20181026

    129. Rehashing /** * Definition for ListNode * public class ListNode { * int val; * ListNode next; * ...

  5. 获取window.location.href路径参数

    GetQueryString(param) { //param为要获取的参数名 注:获取不到是为null var currentUrl = window.location.href; //获取当前链接 ...

  6. MAC 下 STF 的环境搭建和运行

    STF --WEB 端批量移动设备管理控制工具 安装各种包 (首先安装Macport,因为后面需要用到port:http://www.ccvita.com/434.html) linux的基本包安装, ...

  7. PHP 设置 socket连接

    摘要: 作者博文地址:https://www.cnblogs.com/liu-shuai/ nginx和fastcgi的通信方式有两种,一种是TCP的方式,一种是unix socket方式. sock ...

  8. (转)如何在Linux中统计一个进程的线程数

    如何在Linux中统计一个进程的线程数 原文:http://os.51cto.com/art/201509/491728.htm 我正在运行一个程序,它在运行时会派生出多个线程.我想知道程序在运行时会 ...

  9. IDEA 14.0 (默认模式) 快捷键

    IDEA 14.0 (默认模式) 快捷键 1.Alt+Shift+R:重命名变量名.类名.方法名(使用已经使用过的) 2.Ctrl+O :重写方法 3.Alt+Shift+P :实现接口 4.Alt+ ...

  10. 如何给MySql创建连接用户并授权

    一般在为MySql创建用户时建议使用GRANT前台命令,当然如果对我们开发者而言,方法还有很多种,比如使用INSERT命令,甚至是直接修改mysql user数据表,但仍然建议按照MySQL规范去授权 ...