flask通用登录注册流程设计(持续优化)

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 %}

猜你喜欢

转载自blog.csdn.net/weixin_35993084/article/details/80596767