flask登录注册设计
此项目持续更新,减少耦合,增加复用率,向面向对象过渡
github有django面向对象开发项目,欢迎交流
——-github个人首页——–请移步此处
项目结构
'''
带 * 为文件目录
'''
flask_project #项目文件
*app #应用级目录
__init__.py #app入口文件
*models #模型文件
*common #通用模型层
base.py #通用模型继承类
*user #用户模型层
user.py #用户模型
*templates #模版文件
*common #通用模版层
base.html #通用模版继承类
*user #用户模版层
login.html #注册界面
register.html #登录界面
index.html #项目入口界面
*static #静态文件目录
*js
*css
*img
*upload
*forms #表单验证层
user.py #用户表单验证类
*web #蓝图层
user.py #用户操作
main.py #主界面操作
__init__.py #蓝图入口文件
ext.py #第三方扩展库
setting.py #配置文件
manage.py #项目入口
1. 应用层setting.py配置
app:setting.py
#默认配置
class config:
SECRET_KEY = 'jiami'
SQLALCHEMY_TRACK_MODIFICATIONS = False
SQLALCHEMY_COMMIT_ON_TEARDOWN = True
#开发配置(###代表自己数据库密码,库名)
class DevelopementConfig(Config):
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:###@loacalhost:3306/###'
#测试配置
class TestingConfig(Config):
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:###@localhost:3306/testbase'
#生产配置
class ProductionConfig(Config):
SQLALCHEMY_DATABASE_URI= 'mysql+pymysql://root:###@localhost:3306/product_base'
#定义配置字典
config = {
'development': DevelopmentConfig,
'test': TestingConfig,
'product': ProductionConfig,
'default': DevelopmentConfig,
}
2. app应用级第三方库导入
第三方库除少数,多需要pip下载到项目环境中
app:ext.py
from flask_bootstrap import Bootstrap
from flask_sqlalchemy import SQLALchemy
from flask_login import LoginManager
#实例化第三方扩展库
bootstrap = Bootstrap()
db = SQLALchemy()
login_manager = LoginManager
#定义第三方插件注册函数
def register_ext(app):
bootstrap.init_app(app)
db.init_app(app)
db.create_all(app=app)
'''
with app.app_context():
db.create_all()
'''
login_manager.init_app(app)
login_manager.login_view = 'web.login'
login_manager.login_message = '请先登录或注册'
3. web蓝图导入
web:__init__.py
from flask import Blueprint
#实例化蓝图
web = Blueprint('web',__name__)
#避免重复导入,此处导入web下user
#将蓝图层用户操作挂载到蓝图
from app.web import user
4. web蓝图层主界面入口
web:main.py
from flask import rend_template,
from app.web form web
#定义入口
@web.route('/')
def index():
return rend_template('common/index.html')
5. web蓝图层用户操作入口
from flask import rend_template
from app.web import web
#定义注册界面
@web.route('/register')
def register():
return rend_template('user/register.html')
#定义登录界面
@web.route('/login')
def login():
return rend_template('user/login.html')
6.app下入口文件定义实例化flask
app:__init__.py
from flask import Flask
from app.setting import config
from app.ext import register_ext
#将用户模型挂载到app核心对象上
from app.models.user import UseProfile
#定义实例化flask函数
def create_app(config_name):
app = Flask(__name__)
#注册蓝图
register_blueprint(app)
#注册第三方插件
register_ext(app)
#导入配置文件
app.config.from_object(config[config_name])
return app
#定义注册蓝图函数
def register_blueprint(app):
#导入蓝图
from app.web import web
app.register_blueprint(web)
7.定义项目入口
flask_project: manage.py
#导入项目实例化函数
from app import creat_app
app = create_app('default')
if __name__ == '__main__':
app.run()
以上文件在没有定义用户模型和表单前提下已验证通过
7.用户模型创建
app:models:user.py
from sqlalchemy import Column,String,Integer
from flask_login import UserMixin
from werkzeug.security import generate_password_hash, check_password_hash
from app.ext import db
class UserProfile(db.Model,UserMixin):
id = Column(Integer,primary_key=True,autoincrement=True)
nickname = Column(String(30),nullable=False)
email = Column(String(30),nullable=False)
gender = Column(Integer,default=0)
_password = Column(String(128),nullable=False)
phone = Column(String(11))
#定义密码哈希加密
@property
def password(self):
return self._password
def generate_password(self,raw):
self._password = generate_password_hash(raw)
# 验证密码
def check_password(self,raw):
return check_password_hash(self._passsword, raw)
8.form表单验证
app:forms:user.py
from flask_wtf import FlaskForm
from wtforms.fields import StringField,PasswordField,SubmitField
from wtforms.validators import Length, NumberRange, DataRequired, Email, ValidationError, EqualTo
class UserProfileForm(Form):
nickname = StringField(validators=[DataRequired(message='昵称不能为空'),Length(6,12)])
email = StringField(validators=[DataRequired(),Email(message='邮箱格式不合法'),Length(6,36)])
password = PasswordField(validators=[DataRequired(),Length(6,128,message='密码长度不正确'),EqualTo('confirm',message='两次输入密码不一致')])
confirm = PasswordField(validators=[DataRequired=(),Length(6,128,message='密码长度不正确')])
class LoginForm(Form):
email = StringField(validators=[DataRequired(),Email(message='邮箱格式不合法'),Length(6,36)])
password = PasswordField(validators=[DataRequired=(),Length(6,128,message='密码长度不正确')])
9.重写用户操作函数
app:web:user.py
from flask import requset,render_template,redierct
from flask_login import login_user
from app.web import web
from app.forms.user import UserProfileForm,LoginForm
from app.ext import db
@web.route('/register',methods=['GET','POST'])
def register():
#实例化用户表单验证
form = UserProfileForm(request.form)
if form.validate_on_submit():
#实例化用户模型
user = UserProfile(nickname=form.nickname.data,email=form.email.data,password=form.password.data)
db.session.add(user)
return '注册成功'
return render_template('user/register.html',form=form)
@web.route('/login'),methods=['GET','POST']
def login():
form = LoginForm(request.form)
if form.validate_on_submit():
user = UserProfile.query.filter(email=form.email.data)
if not user:
return '用户不存在'
password = check_password(form.password.data)
if not password:
return '用户名或密码错误'
login_user(user)
return '登录成功'
return redirect('user/login.html',form=form)
10.生成用户注册登录界面
app:templates:user/register.html
{% extends 'bootstrap/base.html' %}
{% block content %}
{% import 'bootstrap/wtf.html' as wtf %}
<div class='container'>
{{ wtf.quick_form(form) }}
<div>
{% endblock %}
app:templates:user/login.html
{% extends 'bootstrap/base.html' %}
{% block content %}
{% import 'bootstrap/wtf.html' as wtf %}
<div class='container'>
{{ wtf.quick_form(form) }}
<div>
{% endblock %}