Flask实战第44天:完成前台注册功能
注册功能后端逻辑
用户注册要把注册的表单提交上来,因此,我要先对表单进行验证,编辑front.forms
from apps.forms import BaseForm
from wtforms import StringField
from wtforms.validators import Regexp, Length, EqualTo, ValidationError
from utils import xcache
from .models import FrontUser class SignUpForm(BaseForm):
telephone = StringField(validators=[Regexp(r'1[35678]\d{9}', message='手机号码格式错误')])
sms_captcha = StringField(validators=[Regexp(r'\w{6}', message='短信验证码错误')])
username = StringField(validators=[Length(2,20, message='用户名格式错误')])
password1 = StringField(validators=[Length(5, 30, message='密码格式错误')])
password2 = StringField(validators=[EqualTo('password1', message='两次密码不一致')])
graph_captcha = StringField(validators=[Regexp(r'\w{4}', message='图形验证码错误')]) def validate_telephone(self, field):
user = FrontUser.query.filter_by(telephone=field.data).first()
if user:
raise ValidationError('该手机号已被注册') def validate_sms_captcha(self, field):
telephone = self.telephone.data
sms_captcha = field.data
xcache.set('', 'heboan')
sms_captcha_mem = xcache.get(telephone)
print('用户输入的验证码:{}'.format(sms_captcha))
print( '服务器存储的验证码:{}'.format(sms_captcha_mem))
if not sms_captcha_mem or sms_captcha_mem != sms_captcha:
raise ValidationError(message='短信验证码错误') def validate_graph_captcha(self, field):
graph_captcha = field.data
#因为图形验证码存储的key和值都是一样的,所以我们只要判断key是否存在就行
if not xcache.get(graph_captcha.lower()):
raise ValidationError(message='图形验证码错误')
front.views.py
然后就是注册的视图处理POST请求了, 编辑front.views.py
class SignUpViews(views.MethodView):
def get(self):
return render_template('front/front_signup.html') def post(self):
signup_form = SignUpForm(request.form)
if signup_form.validate():
telephone = signup_form.telephone.data
username = signup_form.username.data
password = signup_form.password1.data
user = FrontUser(telephone=telephone, username=username, password=password)
db.session.add(user)
db.session.commit()
return xjson.json_success('恭喜您,注册成功')
else:
return xjson.json_param_error(signup_form.get_error())
注册功能前端逻辑
前端我们通过ajax来请求,编辑front_signup.js
...
//注册
$(function () {
$('#submit-btn').click(function (event) {
event.preventDefault();
var telephone_input = $("input[name='telephone']");
var sms_captcha_input = $("input[name='sms_captcha']");
var username_input = $("input[name='username']");
var password1_input = $("input[name='password1']");
var password2_input = $("input[name='password2']");
var graph_captcha_input = $("input[name='graph_captcha']") var telephone = telephone_input.val();
var sms_captcha = sms_captcha_input.val();
var username = username_input.val();
var password1 = password1_input.val();
var password2 = password2_input.val();
var graph_captcha = graph_captcha_input.val(); bbsajax.post({
'url': '/signup/',
'data': {
'telephone': telephone,
'sms_captcha': sms_captcha,
'username': username,
'password1': password1,
'password2': password2,
'graph_captcha': graph_captcha
},
'success': function (data) {
if (data['code'] === 200){
//注册成功跳转到首页
window.location = '/';
}else{
xtalert.alertInfo(data['message']);
}
},
'fail': function (error) {
xtalert.alertNetworkError();
} });
})
});
这样注册功能就OK,注册成功后会跳转到首页。
注册完成跳转回上一个页面
现在我们的需求是,用户直接进入注册页面注册,则注册成功后跳到首页,如果从本站的其他页面访问到注册页面注册,则注册成功后跳转到上一个页面。
那么我们可以在注册的视图函数中的get请求获取到referrer(上个页面,也就是从哪个页面跳过来的url)
#写一个检测referre的函数放到safeutils.py中,该文件放到utils下面
from utils import safeutils class SignUpViews(views.MethodView):
def get(self):
#获取上一个页面的url
return_to = request.referrer
#referrer不一定会存在,比如直接访问的登录页面
#并且它不等于登录页面的url
#并且这个referre是个安全的url,防止恶意者去伪造它,被跳转到其它恶意的网站
if return_to and return_to !=request.url and safeutils.is_safe_url(return_to):
#把这个url传入到模板中
return render_template('front/front_signup.html', return_to=return_to)
return render_template('front/front_signup.html') ...
from urllib.parse import urlparse,urljoin
from flask import request def is_safe_url(target):
ref_url = urlparse(request.host_url)
test_url = urlparse(urljoin(request.host_url, target))
return test_url.scheme in ('http', 'https') and \
ref_url.netloc == test_url.netloc
safeutils.py
url传入到frony_signup.html,我在这个页面找个位置接收它
<span style="display:none;" id="return-to-span">{{ return_to }}</span>
然后我们的js就可以获取到这个值,编辑front_signup.js

Flask实战第44天:完成前台注册功能的更多相关文章
- WordPress添加前台注册功能
一.添加注册表单 1.首先在当前主题的目录下新建一个php文件,命名为reg-page.php,然后将page.php中的所有代码复制到reg-page.php中: 2.删除reg-page.php开 ...
- Flask实战第38天:前台模型创建
安装shortuuid pip install shortuuid 编辑front.models.py from exts import db import shortuuid from werkze ...
- Flask实战第58天:发布帖子功能完成
发布帖子后台逻辑完成 首先给帖子设计个模型,编辑apps.models.py class PostModel(db.Model): __tablename__ = 'post' id = db.Col ...
- Django学习笔记第六篇--实战练习二--简易实现登录注册功能demo
一.绪论: 简易实现登录功能demo,并没有使用默认身份验证模块,所以做的也很差,关闭了csrf保护,没有认证处理cookie和session,只是简单实现了功能.另外所谓的验证码功能是伪的. 二. ...
- Flask实战-留言板-安装虚拟环境、使用包组织代码
Flask实战 留言板 创建项目目录messageboard,从GreyLi的代码中把Pipfile和Pipfile.lock文件拷贝过来,这两个文件中定义了虚拟环境中需要安装的包的信息和位置,进入m ...
- 一百一十三:CMS系统之前台注册界面
html {% from 'common/_macros.html' import static %}<!DOCTYPE html><html lang="en" ...
- 学习MVC之租房网站(八)- 前台注册和登录
在上一篇<学习MVC之租房网站(七)-房源管理和配图上传>完成了在后台新增.编辑房源信息以及上传房源配图的功能.到此后台开发便告一段落了,开始实现前台的功能,也是从用户的登录.注册开始. ...
- 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(五)——实现注册功能
使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...
- flask 开发用户登录注册功能
flask 开发用户登录注册功能 flask开发过程议案需要四个模块:html页面模板.form表单.db数据库操作.app视图函数 1.主程序 # app.py # Auther: hhh5460 ...
随机推荐
- linux iptables开放/关闭端口命令
在CentOS/RHEL 7以前版本上开启端口 #开放端口:8080/sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT#将更改进行保存/etc/ ...
- Kendo Grid:将Edit button 移到grid view 得顶部
因为kendo grid 得toolbar 里不包括Edit button,所以我们要先用template 创建一个自定义得edit button,然后再对这个button实现edit 功能. < ...
- eclipse执行maven install命令时跳过test
在pom.xml里面配置一下代码,将跳过test. <plugins> <plugin> <groupId>org.apache.maven.plugins< ...
- Linux中断(interrupt)子系统之二:arch相关的硬件封装层【转】
转自:http://blog.csdn.net/droidphone/article/details/7467436 Linux的通用中断子系统的一个设计原则就是把底层的硬件实现尽可能地隐藏起来,使得 ...
- Composer 手动安装
Linux/Mac 环境 sudo wget -O /usr/local/bin/composer https://dl.laravel-china.org/composer.phar sudo ch ...
- JDK1.8特性实现jdk动态代理,使业务解耦
首先,先创建一个interface IHello 目标接口类 interface IHello { void sayHello(); } 然后再写一个目标类的实现类 class HelloImpl i ...
- udp调用connect有什么作用(转)
原文链接如下: http://blog.csdn.net/wannew/article/details/18218619 整理一下.1:UDP中可以使用connect系统调用 2:UDP中connec ...
- 在 Visual Studio 中使用正则表达式
Visual Studio 使用 .NET framework 正则表达式查找和替换文本. 在 Visual Studio 2010 和早期版本中,Visual Studio 在“查找和替换”窗口中使 ...
- linux命令(38):traceroute命令
1.命令格式: traceroute[参数][主机] 2.命令功能: traceroute指令让你追踪网络数据包的路由途径,预设数据包大小是40Bytes,用户可另行设置. 具体参数格式:tracer ...
- P1466 集合 Subset Sums(01背包求填充方案数)
题目链接:https://www.luogu.org/problem/show?pid=1466 题目大意:对于从1到N (1 <= N <= 39) 的连续整数集合,能划分成两个子集合, ...