最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Flask?+?MySQL如何實現(xiàn)用戶注冊,登錄和登出的項目實踐

 更新時間:2022年06月08日 08:59:49   作者:菜鳥實戰(zhàn)  
本文主要介紹了Flask?+?MySQL?如何實現(xiàn)用戶注冊,登錄和登出的項目實踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、實戰(zhàn)場景

Flask 框架實現(xiàn)用戶的注冊,登錄和登出。

二、主要知識點

  • flask_login 插件使用
  • SQLAlchemy 基礎(chǔ)操作
  • 用戶基礎(chǔ)類設(shè)計
  • Flask 讀取配置文件
  • 藍(lán)圖注冊與使用
  • wtforms 表單提交數(shù)據(jù)
  • wtforms 表單驗證
  • Bootstrap 集成
  • Jinjia2 模版繼承

 涉及的知識點和細(xì)節(jié)很多,我下面就直接貼出注冊部分的核心代碼

三、菜鳥實戰(zhàn)

馬上安排!

1、應(yīng)用初始化 MySQL 和 flask_login 模塊

'''
Author: 菜鳥實戰(zhàn)
Description: 創(chuàng)建應(yīng)用程序,并注冊相關(guān)藍(lán)圖
'''
 
from flask import Flask
from base.base_model import db
from flask_login import LoginManager
 
# 登錄插件
login_manager = LoginManager()
 
def register_auth_blueprint(app):
    # 注冊藍(lán)圖
    from app.auth import auth_bp
    app.register_blueprint(auth_bp)
 
def create_app(config=None):
    # 創(chuàng)建應(yīng)用
    app = Flask(__name__)
 
    # 加載配置
    app.config.from_object('config')
 
    # 注冊 SQLAlchemy
    db.init_app(app)
    #
    # 注冊 login 模塊
    login_manager.init_app(app)
 
    # 未登錄時候的默認(rèn)跳轉(zhuǎn)頁面
    login_manager.login_view = 'auth.login'
    # # login_manager.login_message = '請先登錄或注冊'
 
    register_auth_blueprint(app)
 
    if config is not None:
        if isinstance(config, dict):
            app.config.update(config)
        elif config.endswith('.py'):
            app.config.from_pyfile(config)
 
    return app
 
app = create_app()
 
with app.app_context():
    db.create_all()
 
if __name__ == '__main__':
    # 如果要使用 vscode 調(diào)試,需要將 debug 設(shè)置為 False,否則無法命中請求斷點
    app.run(host='0.0.0.0', debug=True)

2、設(shè)置配置文件

 
APP_NAME = "north"
 
SECRET_KEY = "fNqh2TNw3l0Dj8ZCMQyQh7m1YvWVSgDx"
 
DEBUG = True
 
SQLALCHEMY_DATABASE_URI = 'mysql://username:password@ip:3306/dbname'
 
# 設(shè)置sqlalchemy自動更跟蹤數(shù)據(jù)庫
SQLALCHEMY_TRACK_MODIFICATIONS = True
 
# 查詢時會顯示原始SQL語句
SQLALCHEMY_ECHO = True

3、藍(lán)圖初始化

'''
Author: 菜鳥實戰(zhàn)
'''
 
from flask import Blueprint
 
auth_bp = Blueprint(
    'auth',
    __name__,
)
 
from app.auth.user import user, auth
 

4、編寫注冊表單

 <main class="form-signin w-100 m-auto">
 <form action="{{ url_for('auth.register') }}" method="post">
    <img class="mb-4" src="{{ url_for('static', filename="3rd/images/bootstrap-logo.svg") }} " alt="" width="72" height="57">
    <h1 class="h3 mb-3 fw-normal">注冊信息</h1>
 
    <div class="form-floating">
      <input class="form-control"
             id="nickname" name="nickname"
              value="{{ form.data['nickname'] | default('',true) }}"
              placeholder="昵稱">
      <label for="floatingInput">昵稱</label>
    </div>
    <div class="form-floating">
      <input type="email" class="form-control"
             id="email" name="email"
              value="{{ form.data['email'] | default('',true) }}"
              placeholder="Email">
      <label for="floatingInput">郵箱</label>
    </div>
    <div class="form-floating">
      <input type="password" class="form-control"
              id="password" name="password"
              value="{{ form.data['password'] | default('',true) }}"
              placeholder="Password">
      <label for="floatingPassword">密碼</label>
    </div>
    <div class="form-floating">
      <input type="password" class="form-control"
              id="confirm_password" name="confirm_password"
              value="{{ form.data['confirm_password'] | default('',true) }}"
              placeholder="Confirm Password">
      <label for="floatingPassword">確認(rèn)密碼</label>
    </div>
        {% if form and form.errors %}
            {% for key, error in form.errors.items() %}
                <div class="alert alert-warning" role="alert">{{ key }} : {{ error }}</div>
            {% endfor %}
        {% endif %}
 
    <button class="w-100 btn btn-lg btn-primary" type="submit">注冊</button>
    <p class="mt-5 mb-3 text-muted">菜鳥實戰(zhàn) &copy; 2017–2022</p>
  </form>
</main>
 

5、提交注冊表單

@auth_bp.route("/register", methods=['POST', 'GET'])
def register():
    # 注冊邏輯
    form = RegisterForm(request.form)
 
    # 檢查
    if request.method == 'POST' and form.validate():
        # 執(zhí)行正確邏輯
        user = User()
        user.set_attrs(form.data)
 
        user.name = user.nickname
        user.token = user.generate_token()
 
        db.session.add(user)
        db.session.commit()
 
        # 執(zhí)行登錄
        login_user(user, False)
 
        return redirect(url_for('auth.home'))
 
    return render_template("auth/register.html", form=form)

6、用戶模型

'''
Author: 菜鳥實戰(zhàn)
'''
import random
 
from sqlalchemy import Column, ForeignKey, func
from sqlalchemy import String, Unicode, DateTime, Boolean
from sqlalchemy import TIMESTAMP, Integer, Float
from flask_login import login_user, login_required, logout_user, current_user, UserMixin
from werkzeug.security import generate_password_hash, check_password_hash
 
 
from common.helpers.str_helper import random_string
from north import login_manager
 
from  base.base_model import BaseModel
 
class User(BaseModel, UserMixin):
    # UserMixin 繼承屬性
    __tablename__ = 'users'
 
    # 表基礎(chǔ)值
    phone_number = Column(String(16), unique=True)
    email = Column(String(64), unique=True, nullable=False)
    token = Column(String(64))
    password = Column('password', String(100))
    status = Column(Integer, default=1)
    type = Column(Integer, default=1)
 
    # 定義一個對象屬性,對應(yīng)表中的 password 字段
    _password = Column('password', String(100))
 
    @property
    def password(self):
        # 定義屬性,使用對象屬性賦值
        return self._password
 
    @password.setter
    def password(self, raw):
        # 屬性賦值
        self._password = generate_password_hash(raw)
 
    def check_password(self, raw):
        # 檢查密碼
        if not self._password:
            return False
        return check_password_hash(self._password, raw)
 
    def generate_token(self, expiration=60000):
        # 生成 token
        return random_string(32)
 
 
@login_manager.user_loader
def get_user(uid):
    # 必須, login 插件制定方法
    return User.query.get(int(uid))

7、模型基類

'''
Author: 菜鳥實戰(zhàn)
'''
 
import pymysql
import datetime
 
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import Column, Integer, SmallInteger
from sqlalchemy import String, Unicode, DateTime, Boolean
 
# 初始化數(shù)據(jù)庫類型
pymysql.install_as_MySQLdb()
db = SQLAlchemy()
 
# 模型基礎(chǔ)類
class BaseModel(db.Model):
    __abstract__ = True
 
    id = Column(Integer, primary_key=True)
    name = Column(String(32), nullable=False)
    nickname = Column(String(32), nullable=False)
    is_enable = Column(SmallInteger, default=1, nullable=False)
    created_at = db.Column(db.DateTime, default=datetime.datetime.now)
    updated_at = db.Column(db.DateTime, default=datetime.datetime.now, onupdate=datetime.datetime.now)
    deleted_at = db.Column(db.DateTime)
 
    def __init__(self):
        pass
 
    # 字典賦值, 場景: 表單提交
    def set_attrs(self, attrs):
        for key, value in attrs.items():
            if hasattr(self, key) and key != 'id':
                setattr(self, key, value)
 

8、表單驗證

'''
Author: 菜鳥實戰(zhàn)
Description: 注冊表單
'''
from wtforms import StringField, PasswordField, Form, validators
# from wtforms.validators import Length, Email, \
#     ValidationError, EqualTo
from app.auth.user.user_model import User
 
class RegisterForm(Form):
    nickname = StringField('昵稱',
        validators = [
            validators.DataRequired(),
            validators.Length(2, 32)
            #   validators.Email(message='電子郵箱不符合規(guī)范')
        ])
    email = StringField('電子郵件',
        validators = [
            validators.DataRequired(),
            validators.Length(10, 50)
 
            #   validators.Email(message='電子郵箱不符合規(guī)范')
        ])
    password = PasswordField('密碼', [
        validators.DataRequired(),
        validators.EqualTo('confirm_password', message='密碼需要一致')
    ])
    confirm_password = PasswordField('Repeat Password', [
        validators.DataRequired(),
 
    ])
 
    def validate_email(self, field):
        # 自定義驗證,命名對應(yīng)
        if User.query.filter_by(email=field.data).first():
            raise validators.ValidationError('郵件已被注冊')
 
    def validate_nickname(self, field):
        if User.query.filter_by(nickname=field.data).first():
            raise validators.ValidationError('昵稱已存在')

9、代碼主要目錄結(jié)構(gòu)

├── app
│   ├── __init__.py
│   ├── auth
│   │   ├── __init__.py
│   │   └── user
│   └── tools
│       ├── __init__.py
│       └── db_tools.py
├── base
│   ├── __init__.py
│   ├── base_blueprint.py
│   ├── base_form.py
│   └── base_model.py
├── common
│   ├── __init__.py
│   └── helpers
│       ├── __init__.py
│       └── str_helper.py
├── config.py 

├── north.py 

四、運行結(jié)果

1、注冊和驗證

2、注冊成功登錄 

3、登錄 

 到此這篇關(guān)于Flask + MySQL如何實現(xiàn)用戶注冊,登錄和登出的項目實踐的文章就介紹到這了,更多相關(guān)Flask  MySQL 用戶注冊登錄登出內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python 高效編程技巧分享

    Python 高效編程技巧分享

    工作中經(jīng)常要處理各種各樣的數(shù)據(jù),遇到項目趕進(jìn)度的時候自己寫函數(shù)容易浪費時間。Python 中有很多內(nèi)置函數(shù)幫你提高工作效率。
    2020-09-09
  • 教你用python3根據(jù)關(guān)鍵詞爬取百度百科的內(nèi)容

    教你用python3根據(jù)關(guān)鍵詞爬取百度百科的內(nèi)容

    這篇文章介紹的是利用python3根據(jù)關(guān)鍵詞爬取百度百科的內(nèi)容,注意本文用的是python3版本以及根據(jù)關(guān)鍵詞爬取,爬取也只是單純的爬網(wǎng)頁信息,有需要的可以參考借鑒。
    2016-08-08
  • python控制結(jié)構(gòu)的條件判斷與循環(huán)示例詳解

    python控制結(jié)構(gòu)的條件判斷與循環(huán)示例詳解

    這篇文章主要為大家介紹了python控制結(jié)構(gòu)的條件判斷與循環(huán)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Python3 sort和sorted用法+cmp_to_key()函數(shù)詳解

    Python3 sort和sorted用法+cmp_to_key()函數(shù)詳解

    這篇文章主要介紹了Python3 sort和sorted用法+cmp_to_key()函數(shù)詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • python實現(xiàn)給微信公眾號發(fā)送消息的方法

    python實現(xiàn)給微信公眾號發(fā)送消息的方法

    這篇文章主要介紹了python實現(xiàn)給微信公眾號發(fā)送消息的方法,結(jié)合實例形式分析了Python針對微信公眾號接口操作的相關(guān)技巧,需要的朋友可以參考下
    2017-06-06
  • django+mysql的使用示例

    django+mysql的使用示例

    django可以自動生成這些create table, alter table, drop table的操作,這篇文章主要介紹了django+mysql的使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • python docx如何修改word表格內(nèi)容

    python docx如何修改word表格內(nèi)容

    使用Python-docx庫,可以方便地修改Word文檔中的表格內(nèi)容,首先需要安裝python-docx庫,然后使用該庫打開Word文檔,遍歷文檔中的表格并修改指定單元格內(nèi)容,最后另存為新文檔
    2024-09-09
  • Python實現(xiàn)PDF和TIFF格式之間的相互轉(zhuǎn)換

    Python實現(xiàn)PDF和TIFF格式之間的相互轉(zhuǎn)換

    PDF是數(shù)據(jù)文檔管理領(lǐng)域常用格式之一,主要用于存儲和共享包含文本、圖像、表格、鏈接等的復(fù)雜文檔,而TIFF常見于圖像處理領(lǐng)域, 在實際應(yīng)用中,我們可能有時需要將PDF文件轉(zhuǎn)換為TIFF圖像,本文將介紹如何使用Python實現(xiàn)PDF和TIFF格式之間的相互轉(zhuǎn)換,需要的朋友可以參考下
    2024-07-07
  • python得到windows自啟動列表的方法

    python得到windows自啟動列表的方法

    今天小編就為大家分享一篇python得到windows自啟動列表的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Python?venv創(chuàng)建失敗問題

    Python?venv創(chuàng)建失敗問題

    本文主要介紹了Python?venv創(chuàng)建失敗問題,解決方法是安裝缺失的venv庫,通過`sudo?apt-get?install?python3.11-venv`命令安裝后,即可成功創(chuàng)建虛擬環(huán)境,感興趣的可以了解一下
    2024-11-11

最新評論

容城县| 元阳县| 时尚| 敖汉旗| 东山县| 双峰县| 恩平市| 宕昌县| 临泉县| 塘沽区| 凤山县| 灯塔市| 海淀区| 大同市| 酉阳| 古浪县| 德化县| 惠安县| 姜堰市| 西乌珠穆沁旗| 江西省| 综艺| 安乡县| 卢湾区| 和硕县| 绥滨县| 贵阳市| 浮山县| 唐河县| 淳化县| 馆陶县| 茶陵县| 昌吉市| 商南县| 贵定县| 平安县| 锦州市| 葫芦岛市| 岑溪市| 青岛市| 河南省|