今天用Flask + MySQL 实现用户注册,登录和登出。
一、实战场景
Flask 框架实现用户的注册,登录和登出。
二、主要知识点
涉及的知识点和细节很多,我下面就直接贴出注册部分的核心代码。
三、核心代码
马上安排!
1、应用初始化 MySQL 和 flask_login 模块
'''
Description: 创建应用程序,并注册相关蓝图
Python学习群 279199867 加群免费领取软件工具、视频教程、电子书、源码、课件,视频相关源码、福利文件赠送,学习问题交流共同进步!
'''
from flask import Flask
from base.base_model import db
from flask_login import LoginManager
# 登录插件
login_manager = LoginManager()
def register_auth_blueprint(app):
# 注册蓝图
from app.auth import auth_bp
app.register_blueprint(auth_bp)
def create_app(config=None):
# 创建应用
app = Flask(__name__)
# 加载配置
app.config.from_object('config')
# 注册 SQLAlchemy
db.init_app(app)
#
# 注册 login 模块
login_manager.init_app(app)
# 未登录时候的默认跳转页面
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 调试,需要将 debug 设置为 False,否则无法命中请求断点
app.run(host='0.0.0.0', debug=True)
2、设置配置文件
APP_NAME = "north"
SECRET_KEY = "fNqh2TNw3l0Dj8ZCMQyQh7m1YvWVSgDx"
DEBUG = True
SQLALCHEMY_DATABASE_URI = 'mysql://username:password@ip:3306/dbname'
# 设置sqlalchemy自动更跟踪数据库
SQLALCHEMY_TRACK_MODIFICATIONS = True
# 查询时会显示原始SQL语句
SQLALCHEMY_ECHO = True
3、蓝图初始化
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">确认密码</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">秀儿 © 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():
# 执行正确逻辑
user = User()
user.set_attrs(form.data)
user.name = user.nickname
user.token = user.generate_token()
db.session.add(user)
db.session.commit()
# 执行登录
login_user(user, False)
return redirect(url_for('auth.home'))
return render_template("auth/register.html", form=form)
6、用户模型
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'
# 表基础值
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)
# 定义一个对象属性,对应表中的 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、模型基类
import pymysql
import datetime
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import Column, Integer, SmallInteger
from sqlalchemy import String, Unicode, DateTime, Boolean
# 初始化数据库类型
pymysql.install_as_MySQLdb()
db = SQLAlchemy()
# 模型基础类
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、表单验证
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='电子邮箱不符合规范')
])
email = StringField('电子邮件',
validators = [
validators.DataRequired(),
validators.Length(10, 50)
# validators.Email(message='电子邮箱不符合规范')
])
password = PasswordField('密码', [
validators.DataRequired(),
validators.EqualTo('confirm_password', message='密码需要一致')
])
confirm_password = PasswordField('Repeat Password', [
validators.DataRequired(),
])
def validate_email(self, field):
# 自定义验证,命名对应
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、代码主要目录结构
├── 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
四、运行结果
1、注册和验证

2、注册成功登录

3、登录

兄弟们,今天的分享就到这里,下次见!
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。
我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的