创建项目
连接数据库 安装
pip install flask-sqlalchemy
pip install pymysql
用户模型定义和映射
models / auth
pip install shortuuid
import shortuuid as shortuuid
from werkzeug.security import generate_password_hash, check_password_hash
from exts import db
from datetime import datetime
class UserModel(db.Model):
__tablename__ = "user"
# shortuuid 正常来说主键都是整型和自增长的,但是再商业网站事不合适的,比如用户中心 用户的主键 能猜出网站多少人,通过自增长的id
id = db.Column(db.String(100), primary_key=True, default=shortuuid.uuid)
email = db.Column(db.String(50), unique=True, nullable=False)
username = db.Column(db.String(50), nullable=False)
_password = db.Column(db.String(200), nullable=False)
avatar = db.Column(db.String(100))
signature = db.Column(db.String(100))
join_time = db.Column(db.DateTime, default=datetime.now)
is_staff = db.Column(db.Boolean, default=False)
is_active = db.Column(db.Boolean, default=True)
def __init__(self, *args, **kwargs):
if "password" in kwargs:
self.password = kwargs.get('password')
kwargs.pop("password")
super(UserModel, self).__init__(*args, **kwargs)
@property
def password(self):
return self._password
@password.setter
def password(self, newpwd):
self._password = generate_password_hash(newpwd)
def check_password(self, rawpwd):
return check_password_hash(self.password, rawpwd)
代码详解
这是一个使用Python语言编写的类中的密码属性的代码。这个类中包含一个私有的属性"_password",通过@property装饰器定义了一个密码属性"password",并且通过@password.setter装饰器定义了一个setter方法,用于设置新密码。在这个setter方法中,新密码会被加密后存储到"_password"属性中,这里使用了"generate_password_hash"函数进行密码加密。这样做可以增强密码的安全性,防止密码被恶意破解。
映射倒数据库
pip install flask-migrate
目前app.py项目住入口和模型类没有产生关联,需要导入模块
执行迁移
flask db init
flask db migrate
flask db upgrade
新建蓝图
apps/front/views
from flask import Blueprint,request,render_template
bp = Blueprint("front",__name__,url_prefix="/")
@bp.route('/')
def hello_word():
return 'hello world'
@bp.route("/login",methods=["GET","POST"])
def loging():
if request.method=="GET":
return render_template("front/login.html")
@bp.route("/register",methods=["GET","POST"])
def register():
if request.method=="GET":
return render_template("front/register.html")
front/init
from .views import bp as front_bp
让视图和项目入口文件app产生关联
app.py
注册蓝图
配置邮箱发送邮件
# cbteirudavfecbdfa
# MAIL_USE_TLS:端口号587
# MAIL_USE_SSL:端口号465
# QQ邮箱不支持非加密方式发送邮件
# 发送者邮箱的服务器地址
MAIL_SERVER = "smtp.qq.com"
MAIL_PORT = 587
MAIL_USE_TLS = True
# MAIL_USE_SSL = True
MAIL_USERNAME = "455636959@qq.com"
MAIL_PASSWORD = "cbteirudavfecbdfa"
MAIL_DEFAULT_SENDER = "455636959@qq.com"
实现邮箱验证码的发送
pip install flask-mail
@bp.get("/email/captcha")
def email_captcha():
# /email/captcha?email=xx@q.com
email = request.args.get('email')
if not email:
return jsonify({'code':400,'message':'请先传入邮箱!'})
# 产生随机六位数字
source = list(string.digits)
captcha = "".join(random.sample(source,6))
# subject 主题 recipients 接收者
message = Message(subject='【滴滴】注册验证码',recipients=[email],body='【滴滴】您的注册验证码为:%s'%captcha)
try:
mail.send(message)
except Exception as e:
print('邮件发送失败!')
print(e)
return jsonify({'code':500,'message':'邮件发送失败'})
return jsonify({'code': 200, 'message': '邮件发送成功'})