Flask账户注册(1)

Flask账户注册(1)

Flask账户注册

综合使用所学习过的知识,搭建登录页面

代码示例:https://github.com/ningwenyan/demo_code/tree/master/flask_demo_code/T26

总览

❯ tree
.
├── app.py
├── auth
│   ├── auth_form.py
│   ├── __init__.py
│   └── views.py
├── common
│   ├── errors.py
│   ├── exts.py
│   ├── __init__.py
│   ├── mailModel.py
│   └── sqlModel.py
├── config.py
├── manager.py
├── migrations
│   ├── alembic.ini
│   ├── env.py
│   ├── README
│   ├── script.py.mako
│   └── versions
│       ├── 44bc21866b0d_.py
│       └── __pycache__
│           └── 44bc21866b0d_.cpython-37.pyc
├── static
└── templates
    ├── 401.html
    ├── 403.html
    ├── 404.html
    ├── 500.html
    └── auth
        ├── change_email.html
        ├── change_password.html
        ├── index.html
        ├── login.html
        ├── mail
        │   ├── change_email.html
        │   ├── change_email.txt
        │   ├── confirm.html
        │   ├── confirm.txt
        │   ├── password_reset.html
        │   └── password_reset.txt
        ├── main
        │   └── reset_password.html
        ├── personal.html
        ├── register.html
        └── reset_password.html

搭建可供访问的基本界面

使用Flask Blueprint 搭建基本可供注册登录的页面.

❯ tree
.
├── app.py
├── auth             # 蓝图,账户登录页面
│   ├── __init__.py
│   └── views.py   # 视图
├── common       # 蓝图,403,404,500错误页面处理
│   ├── errors.py      # 错误处理逻辑
│   └──  __init__.py
├── config.py
├── static
└── templates
    ├── 403.html
    ├── 404.html
    ├── 500.html
    └── auth
        ├── index.html
        ├── login.html
        └── register.html
# config.py

DEBUG = True
TEMPLATES_AUTO_RELOAD = True
# auth/__init__.py
from flask import Blueprint

auth_bp = Blueprint('auth', __name__, url_prefix='/auth')

from . import views
# auth/views.py

from . import auth_bp
from flask import render_template, redirect, url_for

@auth_bp.route('/')
def index():
    return render_template('auth/index.html')

# 设计注册,登录页面

@auth_bp.route('/register/', methods = ['GET', 'POST'])
def register():
    return render_template('auth/register.html')

@auth_bp.route('/login/', methods = ['GET', 'POST'])
def login():
    return render_template('auth/login.html')

@auth_bp.route('/logout/')
def logout():
    return redirect(url_for('auth.index'))
# common/__init__.py

from flask import Blueprint

common_bp = Blueprint('common', __name__, url_prefix='/common')

from . import errors
from . import common_bp
from flask import render_template

# 设计403, 404, 500错误
@common_bp.app_errorhandler(403)
def forbidden(e):
    return render_template('403.html'), 403

@common_bp.app_errorhandler(404)
def page_not_found(e):
    return render_template('404.html'), 404

@common_bp.app_errorhandler(500)
def internal_server_error(e):
    return render_template('500.html'), 500

"""
设计在蓝图中的 app_errorhandler 可以接受所有的错误
"""

# app.py

from flask import Flask
import config
from auth import auth_bp
from common import common_bp

app = Flask(__name__)
app.config.from_object(config)

@app.route('/')
def hello_world():
    return 'Hello World!'

# 注册蓝图
app.register_blueprint(auth_bp)
app.register_blueprint(common_bp)

if __name__ == '__main__':
    app.run()

模板信息

<!----login --->
    <h3>Login</h3>
    <form action="" method="post">
        <div>
            <label for="">Email:</label>
            <input type="text" placeholder="Email" name="email">
        </div>
        <div>
            <label for="">Password:</label>
            <input type="password" placeholder="Password" name="password">
        </div>
        <div>
            <label for="">Remember me:</label>
            <input type="checkbox" name="confirmed">
        </div>
        <div>
            <input type="submit" name="submit" value="Login">
        </div>
    </form>
<!----register--->
    <h3>Register</h3>
    <form action="" method="post">
        <div>
            <label for="">Email:</label>
            <input type="text" placeholder="Email" name="email">
        </div>
        <div>
            <label for="">Username:</label>
            <input type="text" placeholder="Username" name="username">
        </div>
        <div>
            <label for="">Password:</label>
            <input type="password" placeholder="Password" name="password">
        </div>
        <div>
            <label for="">Confirm password:</label>
            <input type="password" placeholder="Confirm password" name="con_password">
        </div>
        <div>
            <input type="submit" name="submit" value="Register">
        </div>
    </form>

使用Flask-Login设计登录

设计表单验证

设计注册页面和登录页面的表单验证

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, BooleanField
from wtforms.validators import Length, EqualTo, Regexp, Required, DataRequired, Email

class LoginForm(FlaskForm):
    email = StringField(validators=[Email(), DataRequired(), Length(164)])
    password = PasswordField(validators=[Length(124)])
    confirmed = BooleanField()

class RegisterForm(FlaskForm):
    email = StringField('Email', validators=[Email(), Length(164), DataRequired()])
    username = StringField('Username', validators=[
        DataRequired(), Length(164),
        Regexp('^[A-Za-z][A-Za-z0-9_.]*$'0,
               'Username must have only letters, numbers, dots or '
               'underscores')
    ])
    password = PasswordField('Password', validators=[Length(124), Required()])
    con_password = PasswordField('Confirm Password', validators=[EqualTo('password')])

添加Flask-Login支持

# common/exts.py

from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager

db = SQLAlchemy()
login_manager = LoginManager()
# app.py
from common.exts import db, login_manager

login_manager.init_app(app)

加载密码加密模块(Flask_Bcrypt)

# common/exts.py
from flask_bcrypt import Bcrypt

flask_bcrypt = Bcrypt()
# app.py
from common.exts import db, login_manager, flask_bcrypt

flask_bcrypt.init_app(app)

– END –


原文始发于微信公众号(Flask学习笔记):Flask账户注册(1)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/36412.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!