那么您想构建一个应用程序并获得许多用户吗?
我们都这样做,如果您是初学者,您需要考虑以下电子邮件注册功能。
- 有效的电子邮件地址和强密码
- 机器人预防
- 双重选择加入注册
可靠的电子邮件注册系统对于网络应用程序、时事通讯、免费下载、私人团体邀请和潜在客户开发至关重要。我们不要依赖使用 Auth0、Facebook 或 Google 等第三方服务来访问您的应用程序。 保留您的应用数据!
首先,您应该具有一些 Python 经验,因为我们将使用 Flask 框架和 MySQL 数据库。这比使用最流行的 CMS Wordpress 更有趣。您必须付费购买某些 Wordpress 插件才能具有与免费 Flask 扩展相同的功能。我之前已经在两者上构建过,并且更喜欢使用 Python Flask 来构建 Web 应用程序,尽管 Wordpress 非常有能力制作 Web 应用程序。
每个代码片段都会被解释并在代码中包含一些注释。如果您还没有建立用户注册或不了解内部工作原理,我将为您描述详细信息。以下是我们将按照第一段所述实现的功能的摘要:
有效的电子邮件地址可以通过使用正则表达式或 Flask 扩展解析用户的输入字符串来检查。我们不允许随机文本或 SQL 注入类型的黑客攻击。
机器人预防可以通过隐藏字段来完成,该字段不会向用户显示,但通常由爬行易受攻击的注册表单的机器人自动填充。
双重选择加入方法要求收件人通过接收指向其收件箱的验证链接来授予您向他们发送电子邮件的权限。这主要用于防止其他人使用您的电子邮件地址。这也可以防止测试用户刚刚注册并放弃其帐户。
让我们来编码吧!
创建工作目录:
mkdir 注册
光盘注册
mkdir signup
cd signup
使用 python3 -m venv signup 或 conda create -n signup python3 创建 Python 环境。我更喜欢康达。
创建 MySQL 表来存储您的用户。已验证字段用于双重选择加入:
创建表用户(
id INT 自动递增主键,
电子邮件 VARCHAR(120) NOT NULL UNIQUE,
密码 VARCHAR(120) NOT NULL,
创建时间为默认当前时间戳,
已验证 BOOLEAN 默认值 FALSE
);
mkdir signup
cd signup
安装依赖项:
pipflaskflask-mail 安全 SQLAlchemy Flask-WTF Flask-SQLAlchemy mysql-connector-python
或者,您可以在requirements.txt 文件中列出相同的内容并运行 pip install -rrequirements.txt
创建具有以下依赖项的 app.py 文件:
从 Flask 导入 Flask、render_template、request、url_for、redirect、flash
从flask_mail导入邮件、消息
从日期时间导入日期时间
从flask_sqlalchemy导入SQLAlchemy
从 sqlalchemy.sql 导入函数
from itsdangerous import URLSafeTimedSerializer, SignatureExpired
从 werkzeug.security 导入generate_password_hash、check_password_hash
导入秘密
mkdir signup
cd signup
使用以下行输入您自己的服务器配置数据:
# 烧瓶配置
秘密 = Secrets.token_urlsafe(32)
app.secret_key = 秘密
app.config['SECRET_KEY'] = Secret # 自动生成的密钥
# SQLAlchemy 配置
SQLALCHEMY_DATABASE_URI = 'mysql mysqlconnector://admin:user@localhost/表名'
# 电子邮件配置
app.config['MAIL_SERVER'] = 'smtp.example.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USERNAME'] = '
[email protected]'
app.config['MAIL_PASSWORD'] = '你的密码'
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USE_SSL'] = False
数据库 = SQLAlchemy(应用程序)
邮件 = 邮件(应用程序)
s = URLSafeTimedSerializer(app.config['SECRET_KEY']) #为serliazer设置秘密
mkdir signup
cd signup
最终,您应该将配置信息保存在 .env 文件中。
下一节将使用SQLAlchemy的ORM结构为您查询数据库。请注意,
类名称应与您的数据库表名称匹配,否则您将收到错误。 db.model 代表您的表设置,其中包括列名称、类型、长度、键和空值:
类用户(db.Model):
id = db.Column(db.Integer, Primary_key=True)
电子邮件 = db.Column(db.String(120), unique=True, nullable=False)
密码 = db.Column(db.String(120), nullable=False)
创建的_at = db.Column(db.DateTime, server_default=db.func.now())
已验证 = db.Column(db.Boolean, 默认=False)
mkdir signup
cd signup
如果您还没有手动创建 MySQL 数据库表,您可以直接在类 User 代码块之后使用此 Flask 代码来完成此操作:
# 创建数据库表
与 app.app_context():
db.create_all()
mkdir signup
cd signup
为了本教程的简洁,我们将跳过索引页面或您想要调用的应用程序主页,而仅使用 Python 的页面路由装饰器函数显示注册页面:
@app.route('/')
定义索引():
返回“
首页
”
@app.route('/signup',methods=['GET', 'POST'])
def 注册():
如果 request.method == 'POST':
# 隐藏字段验证以防止机器人提交
隐藏字段 = request.form.get('隐藏字段')
如果隐藏字段:
return redirect(url_for('index')) # 检测到机器人,忽略提交
电子邮件 = request.form['电子邮件']
密码 = request.form['密码']
hashed_password =generate_password_hash(密码,方法='sha256')
# 将用户插入数据库
new_user = 用户(电子邮件=电子邮件,密码=散列密码)
db.session.add(new_user)
db.session.commit()
# 发送确认邮件
令牌 = s.dumps(电子邮件, salt='电子邮件确认')
msg = Message('确认您的电子邮件', sender='
[email protected]',recipients=[email])
link = url_for('confirm_email', token=token, _external=True)
msg.body = f'您的链接是{link}'
邮件.发送(msg)
flash('一封确认邮件已发送到您的电子邮件地址。', '成功')
返回重定向(url_for('index'))
返回 render_template('signup.html')
mkdir signup
cd signup
在添加 html 注册表单之前,让我们通过添加用于验证双重选择加入功能的路由来完成后端。该路由使用我们之前创建的 s 变量,该变量生成时间敏感的秘密令牌。详细信息请参阅文档
最长期限是链接过期前的秒数,因此在本例中,用户有 20 分钟的时间来确认其电子邮件地址。
@app.route('/confirm_email/
')
def确认电子邮件(令牌):
尝试:
email = s.loads(token, salt='email-confirm', max_age=1200) # 令牌在 1 小时后过期
签名过期除外:
return '令牌已过期!
'
# 更新数据库中的字段
用户 = User.query.filter_by(email=email).first_or_404()
用户.验证= True
db.session.commit()
返回“电子邮件地址已确认!
”
mkdir signup
cd signup
现在我们来看看无处不在的 main 语句,它告诉 Python 在直接执行文件(而不是导入模块)时执行脚本:
如果 __name__ == '__main__':
应用程序运行(调试=真)
mkdir signup
cd signup
在我们完成这个后端代码之前,我们仍然需要前端html来供用户输入。我们将使用 Flask 的内置 Jinja 模板来完成此操作。创建一个名为 templates/signup.html 的文件,该文件的名称应与您之前在 app.py 中创建的路由匹配。默认情况下,Jinja 使用目录 /templates 来存放 html 文件。您可以更改此设置,但在本教程中,我们将使用应用程序的 /templates 目录。
电子邮件注册头>
注册