类视图和方法视图区别:
-
不需要装饰器,只需要继承MethodView,需要使用什么方式就写对应的方法名称,它就能自动匹配
@app.route("/delete/",methods=["DELETE"])这些就不用写了
但是不写装饰器并不意味着不写路由了,要在最底下编写路由
-
方法视图要写四个接口,而类视图只需要写一个接口
class ManageApi(MethodView): def get(self):#self关键字 作用是类内部共享公共资源属性和方法的调用 #设置个条件:根据用户主键id进行查询 #接收参数 useerid = request.args.get("id",None) _sql=text("select `email`,`password` from `user` where `id`={}".format(useerid)) print(_sql) user = db.session.execute(_sql).fetchone() print(user) if user: return jsonify({"errcode":0,"data":{"email": user[0], "password": user[1]}}) # return jsonify({"errcode":0,"data":dict(user)}) else: return jsonify({"errcode":1,"msg":"用户不存在"}) #匹配路由 app.add_url_rule("/",view_func=ManageApi.as_view("ManageApi"))
命令行显示:
查询数据库成功
测试文件运行结果:
(测试文件作为客户端接收到了来自后端项目入口文件的反馈)
验证用户合法性:
如果是方法视图的话就需要每个方法使用之前调用验证合法性的函数,麻烦
可以使用类的继承,新建BaseApi类,它继承的是来自flask框架中的MethodView类,在该类中定义了验证用户合法性的函数。然后新建ManageApi新类,它继承BaseApi类,该类中定义了处理Http请求的方法。
#父类 基础类(增删改查之前验证用户合法性) class BaseApi(MethodView): def get_user(self):#只要有人需要该方法,不需调用,仅仅需要继承 print("该用户合法") #类视图,接口 class ManageApi(BaseApi): def get(self):#self关键字 作用是类内部共享公共资源属性和方法的调用 #设置个条件:根据用户主键id进行查询 #调用父类的实例方法 self.get_user() #接收参数 useerid = request.args.get("id",None) ......
用户注册功能中检测邮箱是否已经注册过:
入库之后触发唯一索引,节省查询操作
右键点击user,为email添加唯一索引,然后运行,就会显示添加成功
添加唯一索引之后,注册中用户写入数据库的邮箱,在进行连接之前数据库会先检测是否与数据库中已有的邮箱重复,如果重复,拒绝连接。
注册流程图 draw.io
在“查询”中向user表中插入已经存在的值email字段的值和password字段的值
因为已经为email字段添加了唯一索引,所以当该条记录要插入字段中已经有的’3次邮箱‘值时,是会报错的,而password字段已经有了'3次数密码',但是其并没有设置唯一索引,单独作为一条插入记录是能插入进去的。但是由于email的唯一性约束使得整条记录插入失败。
发送邮件:
邮件发送类(两个方法)初始化方法:定义发送者邮箱,发送者密钥
发送方法:
构建邮件体:mimemultipart(),标题,发送者,接收者
邮件内容:mimetext()
建立连接对象:s=smtplib.SMTP_SSL('smtp.qq.com',465)登陆邮箱:s.login(self._user,self._pwd)
发送邮件
关闭连接
#工具库,保存系统中所有用到的工具 #导包 import smtplib #导入文件文本包 from email.mime.text import MIMEText #导入邮件分类库 from email.mime.multipart import MIMEMultipart #邮件发送类 class SendEmail: #此不需要继承 #初始化方法 def __init__(self): #初始化邮箱数据 #发送者的邮箱 self._user='3052864873@qq.com' #发送密钥 授权码 self._pwd = 'ylanafhvjjckdddc' #发送方法 def send_mail(self,_touser,_title,_cotent):#往哪发,发送标题,具体内容 #构建邮件体 msg=MIMEMultipart() #邮件标题 msg["Subject"] = _title #发件人 msg["From"] = self._user#通过self关键字来获取初始化方法里的_user #收件人 msg["To"] = _touser #邮件内容 part = MIMEText("这是社交平台一封测试邮件","html","utf-8") msg.attach(part) #发送逻辑 #建立链接对象(域名,端口号) s=smtplib.SMTP_SSL('smtp.qq.com',465)#http端口号是80,https端口号是443,smtp端口号是465 #登录邮箱 s.login(self._user,self._pwd) #发送邮件 s.sendmail(self._user,_touser,msg.as_string()) #关闭链接 # s.quit() s.close() if __name__ == '__main__':#测试一律main入口,main入口只是在本地调用起作用,别人导入不会起执行。若是不写,别人导入之后立刻执行 #实例化对象 sm = SendEmail() #发送 sm.send_mail('3451542714@qq.com','社交平台邮件标题','123456')#假设给自己发
生成随机码:import random #随机码 def create_code(abc=True,length=4):#abc为true为字符串加数字,false为纯数字 if abc: base_str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" else: base_str = "0123456789" #生成逻辑 # code="" # for _ in range(length): # mystr = random.choice(base_str) # code+= mystr return "".join([random.choice(base_str)for _ in range(length)] )#_意味着什么也没有,节约内存空间 if __name__ == '__main__':#测试一律main入口,main入口只是在本地调用起作用,别人导入不会起执行。若是不写,别人导入之后立刻执行 #实例化对象 # sm = SendEmail() #发送 # sm.send_mail('3451542714@qq.com','社交平台邮件标题','123456')#假设给自己发 print(create_code())#测试随机码生成