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