一个web应用的诞生(5)

2024-04-30 17:18
文章标签 应用 web 诞生

本文主要是介绍一个web应用的诞生(5),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

下面把角色分为两种,普通用户和管理员用户,至少对于普通用户来说,直接修改DB是不可取的,要有用户注册的功能,下面就开始进行用户注册的开发。

用户表

首先要想好用户注册的时候需要提供什么信息:用户名、密码、昵称、邮箱、生日、性别、自我介绍,下面就按照这些信息修改用户模型:

class User(db.Model):__tablename__="users"id=db.Column(db.Integer,primary_key=True)username=db.Column(db.String(50),unique=True,index=True)password=db.Column(db.String(50))nickname=db.Column(db.String(50))email=db.Column(db.String(100))birthday=db.Column(db.DateTime)gender=db.Column(db.Integer)remark=db.Column(db.String(200))role_id=db.Column(db.Integer,db.ForeignKey("roles.id"))

然后使用脚本修改db

python default.py db migrate -m "修改用户表"

回车后界面显示内容为:

然后进行db差异的改动
python default.py db upgrade
这时看db中的表结构:

已经修改成功

注册界面

然后新建register.html模板,设置登录表单:

{% extends "base.html"%}
{% block content %} <!--具体内容-->
<div class="container"><div class="row"></div><div class="row"><div><div class="page-header"><h1>欢迎您注册</h1></div>{% for message in get_flashed_messages() %}<div class="alert alert-warning"><button type="button" class="close" data-dismiss="alter">&times</button>{{message}}</div>{% endfor %}<form method="post"><div class="form-group"><label for="username">用户名</label><input type="text" class="form-control" name="username" id="username" placeholder="请输入用户名"></div><div class="form-group"><label for="passworld">密码</label><input type="password" class="form-control" name="password" id="passworld" placeholder="请输入密码"></div><div class="form-group"><label for="email">昵称</label><input type="email" class="form-control" name="nickname" id="nickname" placeholder="请输入昵称"></div><div class="form-group"><label for="birthday">生日</label><input type="date" class="form-control" name="birthday" id="birthday" placeholder="请输入生日"></div><div class="form-group"><label >性别</label><label  class="form-control"><input type="radio" name="gender" value="0" id="gender0"><label for="gender0">男</label><input type="radio" name="gender" value="1" id="gender1"><label for="gender1">女</label></label></div><div class="form-group"><label for="email">电子邮箱</label><input type="email" class="form-control" name="email" id="email" placeholder="请输入电子邮箱"></div><button type="submit" class="btn btn-default">登录</button></form></div></div>
</div>
{% endblock %}

然后在default.py文件中新增register路由,代码为:

@app.route("/register",methods=["GET"])
def register():return  render_template("/register.html")

运行界面正常,然后增加post路由:

@app.route("/register",methods=["Post"])
def registerPost():user=User();user.username=request.form.get("username","")user.password = request.form.get("password", "")user.birthday = request.form.get("birthday", "")user.email = request.form.get("email", "")user.gender = request.form.get("gender", "")user.nickname = request.form.get("nickname", "")user.role_id = 1 #暂时约定公开用户角色为1#判断,其中用户名,密码,昵称不能为空if(len(user.username.strip())==0):flash("用户名不能为空")return render_template("/register.html")if(len(user.password.strip())==0):flash("用户密码不能为空")return render_template("/register.html")if (len(user.nickname.strip()) == 0):flash("用户昵称不能为空")return render_template("/register.html")db.session.add(user);flash("您已注册成功")return render_template("/register.html")

代码有点啰嗦,不漂亮,但基本意图能表达清楚,功能也可以实现,但现在的问题来了,加入我新增一个字段,那么需要修改三处代码(html,form.get,校验),并且尤其是需要修改html,而且html部分没有验证,如果增加客户端验证的话,需要修改的会更多。那么有没有一个针对表单进行优化的工具呢,答案是当然有,轮到wtf登场了。

引入WTF表单框架

和之前一样,首先需要安装插件。

pip3.6 install flask-wtf

然后引入所需的包

from flask.ext.wtf import Form
from wtforms import StringField,PasswordField,SubmitField,RadioField
from wtforms.validators import DataRequired,EqualTo,Length

下面创建一个表单RegisterForm:

class RegisterForm(Form):username = StringField("请输入用户名", validators=[DataRequired()])password = PasswordField("请输入密码", validators=[DataRequired()])repassword=PasswordField("确认密码", validators=[EqualTo("password")])nickname= StringField("昵称")birthday= DateField("出生日期")email= StringField("邮箱地址", validators=[Email()])gender= RadioField("性别", choices=[("0", "男"), ("1", "女")], default=0)remark= TextAreaField("自我简介")submit=SubmitField("提交")

修改register.html模板:

{% extends "base.html"%}
{% block content %} <!--具体内容-->
{% import "bootstrap/wtf.html" as wtf %}  <!--导入bootstrap模板 -->
<div class="container"><div class="row"></div><div class="row"><div><div class="page-header"><h1>欢迎您注册</h1></div>{% for message in get_flashed_messages() %}<div class="alert alert-warning"><button type="button" class="close" data-dismiss="alter">&times</button>{{message}}</div>{% endfor %}{{ wtf.quick_form(form)}} <!--创建表单--></div></div>
</div>
{% endblock %}

执行,输出结果:

阿欧,报错了,看看输出是什么错误:

注意红线一句,是CSRF错误,CSRF的概念可直接百度,知道问题了,其实也很好修改,在框架中增加一个秘钥就可以有效的防范了,在default.py中增加一行:

app.config['SECRET_KEY'] = "Niu_blog String"

秘钥字符串可自定义

然后再次运行,出现界面:

并且包含验证bootstrap的验证样式,接下来继续改造default.py已完成此注册功能

@app.route("/register",methods=["GET","POST"])
def register():form=RegisterForm()if form.validate_on_submit():user=User()user.username=form.username.datauser.password=form.password.datauser.birthday=form.birthday.datauser.email=form.email.datauser.gender=form.gender.datauser.nickname=form.nickname.datauser.role_id=1          #暂时约定公开用户角色为1db.session.add(user)return  render_template("/register.html",form=form)

注意此时已删除registerPost方法

好运行测试一下

点击提交:

阿欧,日期格式为啥不对?这个要从源码里看了:

class DateField(DateTimeField):"""Same as DateTimeField, except stores a `datetime.date`."""def __init__(self, label=None, validators=None, format='%Y-%m-%d', **kwargs):super(DateField, self).__init__(label, validators, format, **kwargs)def process_formdata(self, valuelist):if valuelist:date_str = ' '.join(valuelist)try:self.data = datetime.datetime.strptime(date_str, self.format).date()except ValueError:self.data = Noneraise ValueError(self.gettext('Not a valid date value'))

这个是wtforms的field的源码,位于/wtforms/fields/core.py的745行,可以看到,这里支持的日期格式为年-月-日格式,格式限定比较死,并且文本框没有用html5的date而是普通的text,解决办法以后再说,暂时先修改输入,改为1988-2-5,然后点击提交:

注意,由于代码中提交成功之后依然是返回到此页,并注入内容,所以显示没有问题,看看db中:

记录正常进入db,功能实现完成。

改善登录页

下面改造登录页,首先创建登录表单:

class LoginForm(Form):username=StringField("请输入用户名",validators=[DataRequired()])password=PasswordField("请输入密码")submit=SubmitField("登录")

修改登录模板页:

{% extends "base.html"%}
{% import "bootstrap/wtf.html" as wtf %}
{% block content %} <!--具体内容-->
<div class="container"><div class="row"></div><div class="row"><div class="col-md-4 col-md-offset-4 col-sm-6 col-sm-offset-3"><div class="page-header"><h1>欢迎您登陆</h1></div>{% for message in get_flashed_messages() %}<div class="alert alert-warning"><button type="button" class="close" data-dismiss="alter">&times</button>{{message}}</div>{% endfor %}{{ wtf.quick_form(form)}}</div></div>
</div>
{% endblock %}

修改路由方法:

@app.route("/login",methods=["GET","POST"])
def login():form=LoginForm()if form.validate_on_submit():username = form.username.datapassword = form.password.datauser = User.query.filter_by(username=username, password=password).first()if user is not None:session["user"] = usernamereturn render_template("/index.html", name=username, site_name='myblog')else:flash("您输入的用户名或密码错误")return render_template("/login.html",form=form)  # 返回的仍为登录页return render_template("/login.html",form=form)

重启服务,运行程序,输入zhangji和123后,成功登录首页

回到首页

现在首页白茫茫的一片,什么内容都没有,正常的轻博客应该登录后显示发博按钮,已关注文章等,但首先要记录登录的状态,这些将在下一章说明。

这篇关于一个web应用的诞生(5)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/949456

相关文章

在Ubuntu上部署SpringBoot应用的操作步骤

《在Ubuntu上部署SpringBoot应用的操作步骤》随着云计算和容器化技术的普及,Linux服务器已成为部署Web应用程序的主流平台之一,Java作为一种跨平台的编程语言,具有广泛的应用场景,本... 目录一、部署准备二、安装 Java 环境1. 安装 JDK2. 验证 Java 安装三、安装 mys

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

手把手教你idea中创建一个javaweb(webapp)项目详细图文教程

《手把手教你idea中创建一个javaweb(webapp)项目详细图文教程》:本文主要介绍如何使用IntelliJIDEA创建一个Maven项目,并配置Tomcat服务器进行运行,过程包括创建... 1.启动idea2.创建项目模板点击项目-新建项目-选择maven,显示如下页面输入项目名称,选择

java中VO PO DTO POJO BO DO对象的应用场景及使用方式

《java中VOPODTOPOJOBODO对象的应用场景及使用方式》文章介绍了Java开发中常用的几种对象类型及其应用场景,包括VO、PO、DTO、POJO、BO和DO等,并通过示例说明了它... 目录Java中VO PO DTO POJO BO DO对象的应用VO (View Object) - 视图对象

Go信号处理如何优雅地关闭你的应用

《Go信号处理如何优雅地关闭你的应用》Go中的优雅关闭机制使得在应用程序接收到终止信号时,能够进行平滑的资源清理,通过使用context来管理goroutine的生命周期,结合signal... 目录1. 什么是信号处理?2. 如何优雅地关闭 Go 应用?3. 代码实现3.1 基本的信号捕获和优雅关闭3.2

正则表达式高级应用与性能优化记录

《正则表达式高级应用与性能优化记录》本文介绍了正则表达式的高级应用和性能优化技巧,包括文本拆分、合并、XML/HTML解析、数据分析、以及性能优化方法,通过这些技巧,可以更高效地利用正则表达式进行复杂... 目录第6章:正则表达式的高级应用6.1 模式匹配与文本处理6.1.1 文本拆分6.1.2 文本合并6

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,