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 ...
随机推荐
- 大聊Python----多线程
Python里的多线程是假的多线程,不管有多少核,同一时间只能在一个核中进行操作!利用Python的多线程,只是利用CPU上下文切换的优势,看上去像是并发,其实只是个单线程,所以说他是假的单线程. 那 ...
- 【1】记一次破解wifi
当然,使用的依旧是aircrack套件,这次依旧是跑字典,今天,捉到了另一个实验室icephone的wpa握手包,我猜测实验室的wifi一般都跟自己的名字有关,icephone刚好是8位字母,于是我就 ...
- 1000: 恶意IP 课程作业
1000: 恶意IP Time Limit: 1 Sec Memory Limit: 16 MB Description Water同学最近好不容易学会了用Tornado建起一个个人的Website ...
- tornado当用户输入的URL无效时转入设定的页面
今天做web的测验..坑爹的要用tornado...作为一个比较新的用的人还不多的东东...查资料好麻烦.. 下面是当用户输入非法 url时, 显示一个自定义 404 页面提示用户,其访问的页面不存在 ...
- C基础 如何得到文件长度
引言 有一天看见看到返回文件长度代码返回值都是long,就感觉怪怪的, 一般32位long最大也就2G. 而大文件太多了, 一个Dota2安装包估计都得10多G吧. 一般C得到文件长度代码 /* * ...
- 通过file中的字段查询MySQL内容
# -*- coding: utf-8 -*- import MySQLdb with open(r"./user.txt", "r") as f: f.rea ...
- 谈谈mybatis逆向工程中的Example类
参考博客: http://openwares.net/database/mybatis_generator_example.html 一.Example类的作用:一个用于筛选复杂条件的类 二.Exam ...
- JS如何获取Input的name或者ID?
<input name="music" type="image" id="music" onclick="loadmusic ...
- mysql大法
mysql大法 MySQL 安装方式 1.rpm(yum) 2.源码包 3.通用二进制 企业中版本选择 5.6 5.7 选择 GA 6个月到1年之间的------------------------- ...
- Flash中的注册点和中心点
用一句话概括注册点和中心点的作用,那就是:注册点用来定位,中心点用来变形 当然,这句话不是非常准确,只是暂时先这么理解,下面会详细讲解. 认识注册点 每个元件都有一个注册点.在元件编辑窗口.或在舞台中 ...