Flask基础学习3

参考视频:41-【实战】答案列表的渲染_哔哩哔哩_bilibili


 flask 实现发送短信功能

pip install flask-mail # 安装依赖

 我这里用登录的网易邮箱获取的授权码(登录QQ邮箱的授权码总是断开收不到邮件),

# config
# config mail
MAIL_SERVER = 'smtp.163.com'
MAIL_USE_SSL = True
MAIL_PORT = 465
MAIL_USERNAME = 'xxx@163.com'
MAIL_PASSWORD='xxx'
MAIL_DEFAULT_SENDER  = 'xxx@163.com'
@bp.route('/mail/test')
def mail_test():message = Message(subject='mail test',recipients=['xxx@qq.com'],body='xxx')mail.send(message)

运行结果:

邮箱发送验证功能实现

@bp.route('/captcha/email')
def get_mail_cptcha():email = request.args.get('email')source= string.digits*4cap = random.sample(source,4)cap  = ''.join(cap)message = Message(subject='菜鸟学习测试', recipients=[email], body='你的验证码是:{}'.format(cap))mail.send(message)email_capt = EmailCaptchModel(email=email,captcha=cap)db.session.add(email_capt)db.session.commit()return jsonify({'code':200,'message':'','data':None})

查看DB数据

注册表单验证实现:

# blueprints/forms.py
import wtforms
from wtforms.validators import Email,Length,EqualTo
from models import UserModel,EmailCaptchModelclass RegisterForm(wtforms.Form):email = wtforms.StringField(validators=[Email(message="邮箱格式错误!")])captcha = wtforms.StringField(validators=[Length(min=4,max=4,message="验证码格式错误!")])username = wtforms.StringField(validators=[Length(min=3,max=20,message="用户名格式错误!")])password = wtforms.StringField(validators=[Length(min=3,max=20,message="密码长度为4-20位!")])password_confirm = wtforms.StringField(validators=[EqualTo('password',message="两次输入的错误不一致!")])def validate_email(self, field):email = field.datauser = UserModel.query.filter_by(email=email).first()if user:raise wtforms.ValidationError(message='该邮箱已经被注册!')def validate_captcha(self,field):captcha = field.dataemail = self.email.datacaptcha_model = EmailCaptchModel.query.filter_by(email=email,captcha=captcha).first()if not captcha_model:print('邮箱或验证码格式错误!')# raise wtforms.ValidationError(message='邮箱或验证码格式错误!')# else:#     db.session.delete(captcha_model)#     db.session.commit()

 注册功能后端的实现

# blueprints/auth.py
@bp.route('/register',methods = ['POST','GET'])
def register():if request.method == 'GET':return render_template('regist.html')form  = RegisterForm(request.form)if form.validate():email = form.email.datausername= form.username.datapassword = form.password.datauser= UserModel(email=email,username=username,password=generate_password_hash(password))db.session.add(user)db.session.commit()return redirect(url_for('auth.login'))else:print(form.data)print(form.errors)return redirect(url_for('auth.register'))

运行结果:

 登录功能后端的实现,并将session信息加密保存到cookie中

# forms.py
class LoginForm(wtforms.Form):email = wtforms.StringField(validators=[Email(message="邮箱格式错误!")])print(wtforms.validators.Email)password = wtforms.StringField(validators=[Length(min=4, max=20, message="密码长度为4-20位!")])# auth.py
@bp.route('/login',methods = ['POST','GET'])
def login():if request.method == 'GET':return render_template('login.html')form = LoginForm(request.form)print(form.data)if form.validate():email = form.email.datapassword = form.password.datauser = UserModel.query.filter_by(email=email).first()if not user:print('邮箱在数据库中不存在')return redirect(url_for('auth.login'))if check_password_hash(user.password,password):# cookie 存在浏览器上# flsk的session 是加密存在在cookiesession['user.id'] = user.idreturn redirect(url_for('auth.index'))else:print('密码错误')return redirect(url_for('auth.login'))else:print(form.errors)return redirect(url_for('auth.login'))

注意: 配置session信息时要配置自定义密钥,否则会报错

# 配置session
SECRET_KEY = 'DSAFSDFASFASDFADFSDSASFD' # 无要求,自定义

两个钩子的运用及实现

# from flask import g
# 全局变量g
@login_required
def my_before_request():user_id = session.get('user_id')if user_id:user = UserModel.query.get(user_id)setattr(g,'user',user)else:setattr(g,'user',None)@app.context_processor
def my_context_processor():return {'user':g.user}

配置用户的登录名称显示及注销功能的实现

{% if user %}<li><a href="#">{{ user.username }}</a></li><li><a href="{{ url_for('auth.logout') }}">注销</a></li>
{% else %}<li><a href="{{url_for('auth.login')}}">登录</a></li><li><a href="{{url_for('auth.register')}}">注册</a></li>
{% endif %}
@bp.route('/logout')
def logout():session.clear()return render_template('index.html')

发布问答后端接口的实现

# model.py
class QuestionModel(db.Model):__tablename__ = 'question'id = db.Column(db.Integer,primary_key=True,autoincrement=True)title = db.Column(db.String(1000),nullable=False)content = db.Column(db.Text,nullable=False)create_time = db.Column(db.DateTime,default=datetime.now())author_id = db.Column(db.Integer,db.ForeignKey('user.id'))author = db.relationship(UserModel,backref = 'questions')# form 验证器
class QuestionForm(wtforms.Form):title = wtforms.StringField(validators=[Length(min=4, max=100, message="标题格式错误!")])context = wtforms.StringField(validators=[Length(min=3, max=200, message="内容格式错误")])
from flask import Blueprint,request,render_template
from .forms import QuestionForm
from decorators import login_required
from models import QuestionModel
from exts import db
bp=Blueprint('qa',__name__,url_prefix='/qa')@bp.route('/question',methods = ['POST','GET'])
def question():if request.method == 'GET':return render_template('question.html')else:form  =QuestionForm(request.form)print(form.data)if form.validate():title = form.title.datacontext = form.context.dataquestion = QuestionModel(title=title,content=context,author=g.user)db.session.add(question)db.session.commit()return render_template('index.html')else:print(form.errors)return render_template('question.html')

登录装饰器的实现,只有在登录后才可进行发布问答

# 自定义登录装饰器
from functools import wraps
from flask import g,redirect,url_for
def login_required(func):# 保留func的信息@wraps(func)def inner(*args,**kwargs):if g.user:return func(*args,**kwargs)else:return redirect(url_for('auth.login'))return inner# 配置装饰器
@login_required
def question()

问答列表首页功能实现:

@bp.route('/')
def index():# 根据创建时间倒序排列questions = QuestionModel.query.order_by(QuestionModel.create_time.desc()).all()return render_template('index.html',questions=questions)

发布问答详细的功能实现

@bp.route('/qa/detail/<qa_id>')
def qa_detail(qa_id):question=QuestionModel.query.get(qa_id)return render_template('detail.html',question=question)@bp.post('/answer/public')
@login_required
def public_answer():form = AnswerForm(request.form)if form.validate():content = form.context.dataquestion_id = form.question_id.dataanswer = AnswerModel(content=content,question_id=question_id,author_id=g.user.id)db.session.add(answer)db.session.commit()return redirect(url_for('qa.qa_detail',qa_id=question_id))else:print(form.errors)return redirect(url_for('qa.qa_detail', qa_id=request.form.get('question_id')))

搜索功能的实现

@bp.route('/search')
def search():q = request.args.get('q')# 搜索标题的关键字questions= QuestionModel.query.filter(QuestionModel.title.contains(q)).all()return render_template('index.html',questions=questions)

 okok

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

十一、Qt数据库操作

一、Sql介绍 Qt Sql模块包含多个类&#xff0c;实现数据库的连接&#xff0c;Sql语句的执行&#xff0c;数据获取与界面显示&#xff0c;数据与界面直接使用Model/View结构。1、使用Sql模块 &#xff08;1&#xff09;工程加入 QT sql&#xff08;2&#xff09;添加头文件 …

第八章:指针

第八章:指针 指针重要性: 数据库–>动态分配内存数据结构–>链表、队列、树、图等操作系统–>改善子程序的效率指针为函数提供修改变量值的手段8.1-地址和指针 变量的地址 计算机中,数据存储在内存中 内存:是内部存储器,由存储单元组成的。内存可划分为若干存储单…

Map集合特点、遍历方式、TreeMap排序及Collections和Arrays

目录 ​编辑 一、集合框架 二、 Map集合 特点 遍历方式 HashMap与Hashtable的区别 TreeMap Collections Arrays 一、集合框架 二、 Map集合 Map集合是一种键值对的集合&#xff0c;其中每个键对应一个值。在Java中&#xff0c;Map接口定义了一种将键映射到值的数据结…

02|Order by与Group by优化

索引顺序依次是 &#xff1a; name,age,position 案例1 EXPLAIN SELECT * FROM employees WHERE name LiLei AND position dev ORDER BY age;分析: 联合索引中只是用到了name字段做等值查询[通过key_len 74可以看出因为name字段的len74]&#xff0c;在这个基础上使用了age进…

halcon中的一维测量

一维测量 像点到点的距离&#xff0c;边缘对的距离等沿着一维方向的测量都属于1D测量范畴。Halocn的一维测量首先构建矩形或者扇形的ROI测量对象&#xff0c;然后在ROI内画出等距离的、长度与ROI宽度一致的、垂直于ROI的轮廓线&#xff08;profile line&#xff09;的等距线。…

VBA实现快速逆透视

实例需求&#xff1a;将工作表中的数据&#xff08;多维度交叉&#xff09;&#xff0c;对日期进行逆透视&#xff0c;转换为下表的格式。 示例代码如下。 Sub UnpivotTable()Dim oSht As WorksheetDim inLastRow As Long, inLastCol As LongDim outLastRow As Long, outCol …

python毕设选题 - 大数据商城人流数据分析与可视化 - python 大数据分析

文章目录 0 前言课题背景分析方法与过程初步分析&#xff1a;总体流程&#xff1a;1.数据探索分析2.数据预处理3.构建模型 总结 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到…

最简单的基于 FFmpeg 的编码器 - 纯净版(不包含 libavformat)

最简单的基于 FFmpeg 的编码器 - 纯净版&#xff08;不包含 libavformat&#xff09; 最简单的基于 FFmpeg 的视频编码器&#xff08;YUV 编码为 HEVC&#xff08;H.265&#xff09;&#xff09;正文结果工程文件下载 最简单的基于 FFmpeg 的视频编码器&#xff08;YUV 编码为 …

ES坑-创建索引使用_下划线-黑马旅游搜不到

学ES的时候&#xff0c;星级过滤无效 找不到数据。 需要 但是我们在创建的时候使用的是keyword 通过研究发现&#xff0c;我们导入数据的时候应该默认的为starName 我get库时候发现有2个字段 所以通过star_name搜索因为都是空数据搜不到&#xff0c;而starName类型为text所以…

UE蓝图 函数调用(CallFunction)节点和源码

系列文章目录 UE蓝图 Get节点和源码 UE蓝图 Set节点和源码 UE蓝图 Cast节点和源码 UE蓝图 分支(Branch)节点和源码 UE蓝图 入口(FunctionEntry)节点和源码 UE蓝图 返回结果(FunctionResult)节点和源码 UE蓝图 函数调用(CallFunction)节点和源码 文章目录 系列文章目录一、Call…

使用PM2实现高效的应用监控与管理

微信搜索“好朋友乐平”关注公众号。 1. pm2 PM2 是一个流行的进程管理器&#xff0c;用于 Node.js 应用程序。它支持应用程序的负载均衡、自动重启、日志管理、监控以及多环境管理等功能。PM2让开发者能够以守护进程的方式运行和管理 Node.js 应用&#xff0c;即使在应用崩溃…

什么是负载均衡集群?

目录 1、集群是什么&#xff1f; 2、负载均衡集群技术 3、负载均衡集群技术的实现 4、实现效果如图 5、负载均衡分类 6、四层负载均衡&#xff08;基于IP端口的负载均衡&#xff09; 7、七层的负载均衡&#xff08;基于虚拟的URL或主机IP的负载均衡) 8、四层负载与七层…

消息中间件篇之RabbitMQ-消息重复消费

一、导致重复消费的情况 1. 网络抖动。 2. 消费者挂了。 消费者消费消息后&#xff0c;当确认消息还没有发送到MQ时&#xff0c;就发生网络抖动或者消费者宕机。那当消费者恢复后&#xff0c;由于MQ没有收到消息&#xff0c;而且消费者有重试机制&#xff0c;消费者就会再一次消…

【Java程序设计】【C00282】基于Springboot的校园台球厅人员与设备管理系统(有论文)

基于Springboot的校园台球厅人员与设备管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的校园台球厅人员与设备管理系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块&#xf…

政安晨:【机器学习基础】(一)—— 泛化:机器学习的目标

政安晨的个人主页&#xff1a;政安晨 欢迎 &#x1f44d;点赞✍评论⭐收藏 收录专栏: 政安晨的机器学习笔记 希望政安晨的博客能够对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff01; 简述 泛化是机器学习中的基本概念之一。它指的是通过学习…

代码随想录刷题第41天

首先是01背包的基础理论&#xff0c;背包问题&#xff0c;即如何在有限数量的货物中选取使具有一定容量的背包中所装货物价值最大。使用动规五步曲进行分析&#xff0c;使用二维数组do[i][j]表示下标从0到i货物装在容量为j背包中的最大价值&#xff0c;dp[i][j]可由不放物品i&a…

Linux---进程间通信(下)

1、System V 共享内存 原理如下图 系统调用接口介绍 int shmget(key_t key, size_t size, int shmflg) 功能&#xff1a;用来创建共享内存 参数 key&#xff1a;这个共享内存段名字&#xff0c;内核用key来标识共享内存size&#xff1a;共享内存大小shmflg&#xff1a;由九个权…

Vue局部注册组件实现组件化登录注册

Vue局部注册组件实现组件化登录注册 一、效果二、代码1、index.js2、App.vue3、首页4、登录&#xff08;注册同理&#xff09; 一、效果 注意我这里使用了element组件 二、代码 1、index.js import Vue from vue import VueRouter from vue-router import Login from ../vie…

独立版表情包小程序完整版源码前后端源码,附带系统搭建教程

搭建要求&#xff1a; 1.系统要求Nginx 1.18.0PHP-7.2mysql5.6&#xff0c;开启 ssl&#xff0c;php需要安装 sg11 扩展 2.设置伪静态 location / { index index.php index.html index.htm; if (!-e $request_filename) { rewrite ^/(.*)$ /index.php?s$1; } } location /a…

运维的利器–监控–zabbix–第二步:建设–部署zabbix agent--windows server系统

文章目录 在windows server 2016安装zabbix agent第一步&#xff1a;下载windows安装agent软件第二步&#xff1a;解压到指定目录第三步&#xff1a;配置zabbix-agent.win.conf第四步&#xff1a;zabbix-agent安装第五步&#xff1a;启动zabbix-agent客户端第六步&#xff1a;确…