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

發佈了35 篇原創文章 · 獲贊 6 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章