FLASK博客系列9——你想成为我的新用户吗?

    距离上次发文好久好久了。 先说声抱歉,拖更的毛病我会改掉的。

    

    上次我们教大家如何用后台去管理用户和新增文章,但始终都是单机操作,怎么让你的朋友也来加入你的小站呢?今天我们来为我们的网站增添一个新功能,实现用户的注册。

    我们来看下之前的页面。

    

    已经有模有样的了。那我们就把用户的注册放在右上角吧。

   修改templates/header.html为如下内容。为我们的导航栏添加一个注册按钮。

<nav class="navbar navbar-expand-sm navbar-dark bg-dark"><a class="navbar-brand" href="#" style="font-size: 1.5rem;">我的个人博客</a><div class="navbar-collapse collapse" id="navbarNav"><ul class="navbar-nav ml-md-auto"><li class="nav-item"><a class="nav-link text-white" href="#">注册</a></li></ul></div>
</nav>

    我们来看下效果。还行吧,风格统一。

    接着来写下注册的界面。我们在templates文件夹下新建一个文件夹users。接着新建一个register.html文件,内容如下:

{% extends "base.html" %}
{% block title %}用户注册
{% endblock %}{% block content %}
{% endblock content %}

    有了页面,但是我们还是得通过flask去渲染,这时候就需要再添加一个注册的接口了。

    打开app.py,添加如下内容:

@app.route('users/register', methods=['GET', 'POST'])
def register():if request.method =='GET':return render_template("users/register.html")else:pass

    当GET请求时,我们则渲染注册页面,POST请求时,则注册用户信息。好啦。接着就是继续完成注册页面的前端部分。

{% extends "base.html" %}
{% block title %}用户注册
{% endblock %}
{% block content %}<div class="container col-5" style="margin-top: 10vh"><form method="post" class="form-horizontal "><div class="form-group"><h2 class="text-center ">加入我们</h2></div><div class="form-group"><label for="username" class="col-sm-2 text-right" style="display: inline-block;">用户名: </label><div class="col-sm-9 "   style="display: inline-block;"><input type="text" name="username" class="form-control" id="username" value=""  required placeholder="请输入用户名"/></div></div><div class="form-group"><label for="email" class="col-sm-2 control-label text-right" style="display: inline-block;">邮箱: </label><div class="col-sm-9"  style="display: inline-block;"><input type="email" name="email" class="form-control" id="email" value="" autocomplete="off" required placeholder="请输入邮箱"/></div></div><div class="form-group"><label for="password" class="col-sm-2 control-label text-right" style="display: inline-block;">密码: </label><div class="col-sm-9"  style="display: inline-block;"><input type="password" name="password" class="form-control" id="password" value="" autocomplete="off" required placeholder="请输入密码"/></div></div><div class="form-group"><div class="col-sm-10" style="margin: 0 auto;"><button class="btn btn-lg btn-primary btn-block register-btn" type="submit">注册</button></div></div></form></div>
{% endblock content %}

    别忘了修改header.html中的跳转链接。

<a class="nav-link text-white" href="/users/register">注册</a>

    好了,我们来到首页,点击注册看下。

    不错,这是我们要的效果 。接下来我们来把注册的逻辑补上。这里有个问题,我们之前定义数据库模型的时候,只设计了用户id,用户名,并没有邮箱,密码这2个, 那怎么办呢?没错,让我们来回顾下,往User模型类添加这2个字段。然后做数据库迁移,最后再来写我们的注册,开干。

    

    打开models.py,增加2个字段。

from config import dbclass User(db.Model):  # 表名将会是 user(自动生成,小写处理)id = db.Column(db.Integer, primary_key=True, autoincrement=True)  # 主键name = db.Column(db.String(20), nullable=False)  # 用户名# 给这个article模型添加一个author属性(关系表),User为要连接的表,backref为定义反向引用# lazy表示禁止自动查询,后面可以直接操作这个对象。只可以用在一对多和多对多关系中,不可以用在一对一和多对一中articles = db.relationship('Article', backref=db.backref('user'), lazy='dynamic')password = db.Column(db.String(200), nullable=False)email = db.Column(db.String(88), nullable=False)def __repr__(self):return self.nameclass Article(db.Model):# 也可以自定义表名__tablename__ = 'article'# id 主键 自增id = db.Column(db.Integer, primary_key=True, autoincrement=True)# 文章标题 非空title = db.Column(db.String(100), nullable=False)# 文章正文 非空content = db.Column(db.Text, nullable=False)# 关联表,这里要与相关联的表的类型一致, user.id 表示关联到user表下的id字段author_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    接着对模型进行迁移。执行如下命令,将模型生成迁移文件。

python manage.py db migrate

    执行完命令后,你可以在migrations/versions下看到多了一个迁移文件。 这样就完成了吗?看到这里回忆一下,还需要怎么操作?emmmm。这时候你的数据库里是还没有创建表的。必须执行下面的语句。

python manage.py db upgrade

    好啦,是时候写下逻辑了。打开app.py,更改代码如下:

    

@app.route('/users/register', methods=['GET', 'POST'])
def register():error = None  # 错误if request.method == 'POST':  # 只有POST请求才是注册用户user = models.User()  # 实例化User类,后边可以拿来增删改查username = request.form.get("username", "")  # 从表单获取注册的用户名if user.query.filter(models.User.name == username).first():  # 判断用户名是否已经存在error = "用户已存在"  # 存在则报错。else:  # 不存在则新增。user.name = username  # 新增的用户名user.password = request.form.get("password", "")  # 新增的用户密码user.email = request.form.get("email", "")  # 用户的邮箱db.session.add(user)  # 新增用户db.session.commit()  # 提交到数据库return redirect(url_for('index'))  # 跳转到首页return render_template("users/register.html", error=error)

    好了,我们来注册个测试用户来试试看看吧。

    

    点击注册,可以看到成功跳转到首页。关于登录的,我们后面再讲,这个阶段重在理解逻辑,熟悉框架。我们打开数据库看看。

    

    可以看到,我们成功添加了一个新用户。但是细心的朋友会发现,数据库竟然明文存储了用户的密码。这不仅对数据不安全,万一被脱库了,那用户的信息人人皆知。作为一名合格的码农,我们当然要对它进行加密再存储。这方面Flask都为我们准备好了,它使用的是哈希加密。这里主要使用werkzeug的generate_password_hash,check_password_hash。

    我们将原来新增用户密码的代码按照下面的代码进行修改。

from werkzeug.security import generate_password_hash# user.password = request.form.get("password", "")  # 原来新增用户密码的代码
password = request.form.get("password", "")  # 新增的用户密码
user.password = generate_password_hash(password)  # 密码加密后再存储。

    我们再来新增一个用户test1,注册成功后同样的我们来看下数据库。

    

    我们可以看到密码被加密了,这下次安全了。

pbkdf2:sha256:150000$hEBNa3fz$45a8f9f6b8ffc54797d7380e2f8d671cccf685735b62abcfdd7417f83e2349b2

    好啦。今天给我们的博客网站增加了注册功能。当然这不是最好的办法,但把注册的原理给大家讲述了。大家可以根据喜好,比如新增手机号,昵称等,甚至可以对密码做2次校验输入,添加验证码等等功能。后面有时间的话我们会一步步教大家怎么去增加这些校验的功能。

    喜好的打赏下呗~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/173867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文心一言 VS 讯飞星火 VS chatgpt (144)-- 算法导论12.1 4题

四、用go语言&#xff0c;对于一棵有 n 个结点的树&#xff0c;请设计在 O(n)时间内完成的先序遍历算法和后序遍历算法。 我个人喜欢 灵小智 。 文心一言&#xff1a; 在 Go 语言中&#xff0c;我们可以使用递归来实现树的前序遍历和后序遍历。以下是实现这两种方法的代码。…

window环境搭建StarRocksFE节点

StarRocks部署–源码编译 前言 ​ 注意:本文借用了一些其他文章的一些截图&#xff0c;同时自己做了具体的编译步骤&#xff0c;添加了一些新的内容 ​ 目标&#xff1a; 编译StarRocks2.5.13版本FE节点代码&#xff0c;在本地window环境运行&#xff0c;可以访问到8030界面…

UIkit-UIAlertContent

简单Demo //注意&#xff01;&#xff01;&#xff01;必须放在viewController的viewDidAppear里面&#xff0c;viewDidLoad里面不行 - (void)viewDidAppear:(BOOL)animated {// 创建 UIAlertControllerUIAlertController *alertController [UIAlertController alertControll…

YOLO的网络结构组成

YOLOv5的CSP结构是 将原输入分成两个分支&#xff0c;分别进行卷积操作使得通道数减半&#xff0c; 然后一个分支进行Bottleneck * N操作&#xff0c;然后concat两个分支&#xff0c;使得BottlenneckCSP的输入与输出是一样的大小&#xff0c;这样是为了让模型学习到更多的特征。…

为什么你的团队不需要使用拉取请求 | IDCF

作者&#xff1a;Kief Morris 译者&#xff1a;冬哥 原文&#xff1a;https://infrastructure-as-code.com/book/2021/01/02/pull-requests.html 前 言 Github 引入了Pull Request拉取请求&#xff08;简称PR&#xff09;实践和相关的支持功能&#xff0c;使运行开源项目的人…

NX二次开发UF_CURVE_create_arc_point_tangent_point 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_create_arc_point_tangent_point Defined in: uf_curve.h int UF_CURVE_create_arc_point_tangent_point(tag_t point1, tag_t tangent_object, tag_t point2, UF_CURVE_he…

Temu要求提交RSL Report 铅镉或RSL-Phthalate邻苯报告如何办理

Temu要求提交RSL Report 铅镉或RSL-Phthalate邻苯报告如何办理 Temu要求提交RSL Report 铅镉或RSL-Phthalate邻苯报告如何办理 RSL Report是欧盟REACH法规要求的一种资质报告&#xff0c;旨在确保产品不含对人体有害的化学物质。在珠宝首饰行业中&#xff0c;RSL Report认证是…

SpringCloudAlibaba微服务 【实用篇】| Nacos注册中心

目录 一&#xff1a;Nacos注册中心 1. 认识和安装Nacos 2. Nacos快速入门 3. Nacos服务分级存储模型 ①Nacos服务分级存储模型 ②NacosRule负载均衡 ③根据权重负载均衡 4. Nacos环境隔离 二&#xff1a;Nacos和Eureka的对比 tips&#xff1a;前些天突然发现了一个巨…

Linux:docker容器操作(4)

docker的基础操作 Linux&#xff1a;docker基础操作&#xff08;3&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/134616198?spm1001.2014.3001.5501 我这里准备了两个镜像 镜像加载到容器 docker create [选项] 镜像 运行的程序 -i 让容器的标准输…

外汇天眼:嘿!他们说这个比赛有手就能赢,你敢不敢来试试?

在外汇市场的波涛汹涌中&#xff0c;一场引人注目的模拟交易比赛正在悄然展开&#xff0c;参与者们纷纷聚焦&#xff0c;听所有获奖的参赛投资者们说&#xff1a;这个比赛有手就能赢&#xff0c;你敢不敢来试试&#xff1f; 比赛规则简单而富有挑战性。你只需在外汇天眼APP开通…

安卓手机如何使用JuiceSSH连接内网的Linux虚拟机并实现远程访问?

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;安全协议的文件传输协议。与FTP协议相比&#xff0c;SFTP使用了…

期刊Neurocomputing为什么简称IJON?

在数据库dplp的引用bib页面&#xff0c;Neurocomputing被简写为ijon&#xff0c;以dblp中的最新一篇文章为例&#xff1a; article{DBLP:journals/ijon/LiYFZH24,author {Mingchen Li andHuiqun Yu andGuisheng Fan andZiyi Zhou andZijie Huang},title {Enhan…

“文件批量改名专家:轻松自定义重命名并智能导出文件信息“

在日常工作中&#xff0c;处理大量文件时&#xff0c;往往需要一款得力的文件批量改名工具来协助我们高效、有序地进行文件管理。今天&#xff0c;我要向大家介绍一款强大的文件批量改名工具&#xff0c;它不仅支持统一自定义重命名&#xff0c;还能将相关信息导出到表格中&…

借助arthas 性能调优全过程

使用 arthas 的trace 命令分析方法耗时瓶颈&#xff1a; 可以看出 bindReloadZoneTimeLimite 耗时最久&#xff0c; 通过分析Bind 底层&#xff0c;将业务粒度进行拆分&#xff0c;加入并发执行 再次使用arthas 追踪单个方法耗时时间&#xff1a; 核心耗时方法&#xff0c…

Drupal Core 8 PECL YAML 反序列化任意代码执行漏洞(CVE-2017-6920)

漏洞描述 影响软件&#xff1a;Drupal方式&#xff1a;反序列化参考链接&#xff1a;CVE-2017-6920:Drupal远程代码执行漏洞分析及POC构造效果&#xff1a;任意代码执行 漏洞环境及利用 搭建docker环境 环境启动后&#xff0c;访问 将会看到drupal的安装页面&#xff0c;一路…

vue 表格虚拟滚动

1.使用vxetable实现 官网 问题&#xff1a; 实现了表格的虚拟滚动&#xff0c;但是单元格数据不自动换行了 &#xff0c;如下显示的... 然后在官网看到是这样的&#xff0c;那我不是白写。。。 解决&#xff1a; 1.包一层div2.再写个换行样式 <vxe-column field"s…

个微协议开发/微信个人号二次开发/ipad协议/api接口

E云管家&#xff0c;是完整的第三方服务平台&#xff0c;并基于IPAD协议8.0.37开发出的最新个微API服务框架。 你可以 通过API 实现 个性化微信功能 &#xff08;例云发单助手、社群小助手、客服系统、机器人等&#xff09;&#xff0c;用来自动管理微信消息。用户仅可一次对接…

如何更好的设计测试用例,看完就懂了。。。

引言 测试用例设计的最基本要求&#xff1a;覆盖住所要测试的功能。这是再基本不过的要求了&#xff0c;但别看只是简单的一句话&#xff0c;要能够达到切实覆盖全面&#xff0c;需要对被测试产品功能的全面了解、明确测试范围(特别是要明确哪些是不需要测试的)、具备基本的测…

EasyExcel生成多sheet页的excel

一、controller层 ApiOperation(value "明细查询导出") PostMapping(value "/SummaryDetailExport") public void summaryDetailExport(RequestBody SearchDTO dto, HttpServletResponse response) throws IOException {reportService.deptPackagingSum…

北邮22级信通院数电:Verilog-FPGA(11)第十一周实验(1)用JK触发器实现8421码十进制计数器

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分 1.1 JK_8421.v 1.2 JK_ff.v …