sql操作、发送http请求和邮件发送 全栈开发之路——后端篇(2)

全栈开发一条龙——前端篇
第一篇:框架确定、ide设置与项目创建
第二篇:介绍项目文件意义、组件结构与导入以及setup的引入。
第三篇:setup语法,设置响应式数据。
第四篇:数据绑定、计算属性和watch监视
第五篇 : 组件间通信及知识补充
第六篇:生命周期和自定义hooks
第七篇:路由
第八篇:传参
第九篇:插槽,常用api和全局api。
全栈开发一条龙——后端篇
第一篇:初识Flask&MySQL实现前后端通信

本文将继续讲述sql操作、发送http请求和邮件发送。

文章目录

  • 一、sql数据库操作
    • 1.添加数据
    • 2.修改数据
    • 3.删除数据
  • 二、模式请求
  • 三、类视图
  • 四、邮件发送

一、sql数据库操作

数据库只有查找操作是可以用老版写法的,在上一篇我们已经说过了,接下来介绍一些别的操作。

1.添加数据

按老版本这么写:

db.session.execute(  "insert into user (email,password,name) values('1177@hotmail.com','Aa123456','DJTrump' ) " )

报错,把bug修了

db.session.execute(  text("insert into user (email,password,name) values('1177@hotmail.com','Aa123456','DJTrump') ") )

不报错,但不添加至数据库

注:如果一定要用老版本,请把每一个元素都写全,不然添加不成功。使用我下面的方法,可以缺省自增变量。
同时请注意,用老方法也别忘了commit,不然只是缓存。

新版要这么写:

class user_add(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    email = db.Column( db.String(150) )
    password = db.Column( db.String(150) )
    name = db.Column( db.String(45) )
# 添加数据
usr_add = user_add()
usr_add.email = "1177@hotmail.com"
usr_add.name = "DJTrump"
usr_add.password = "Aa123456"
db.session.add(usr_add)
db.session.commit()


就添加成功了。我们把他封装起来,并写一个路由。

@app.route('/add')
def user_add(em,na,ps,id):
        # 添加数据
    usr_add = user()
    usr_add.email = em
    usr_add.name = na
    usr_add.password = ps
    usr_add.id  =  id
    db.session.add(usr_add)
    db.session.commit()

2.修改数据

我们先用filter找到我们要修改什么数据,然后修改,最后提交。

@app.route('/edit')
def user_edit():
    changei = user.query.filter(user.id=="1").first()
    changei.email = "114514@123.com"
    db.session.commit()


调用这个方法发现是可以修改成功的。
其中.first表示找到的第一个,也可以是all等参数,由于我们这里的id是唯一参数,所以必定只能找到一个,怎么写都可以了。

3.删除数据

与修改数据类似。

@app.route('/delete')
def user_delete():
    delete_user = user.query.filter(user.id=="2").first()
    db.session.delete(delete_user)
    db.session.commit()


至此完整代码如下:

from flask import Flask,jsonify,request
from flask_cors import CORS
from sqlalchemy import text
from dataset_info import *

app = Flask(__name__)
app.config["JSON_AS_ASCII"] = False



#导入数据库
from data import db
URI = "mysql://" + mysql_account + ":" + mysql_password + "@" + mysql_host + ":" + mysql_port + "/" + mysql_data_col
app.config["SQLALCHEMY_DATABASE_URI"] = URI
app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"] = True
#初始化操作
db.init_app(app)

CORS(app,cors_allowed_orgins = "*")

def list_row2list_dic(list_row):  
    dic_temp = {}
    list_dic = []
    for x in list_row:
        listda = []
        listidx= []
        for dx in x:    
            listda.append(dx)
        xx = x._key_to_index        
        for idx in xx:
            listidx.append(idx)
        dic_temp=dict(zip(listidx,listda))
        list_dic.append(dic_temp)
    return list_dic
class user(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    email = db.Column( db.String(150) )
    password = db.Column( db.String(150) )
    name = db.Column( db.String(45) )

@app.route('/add')
def user_add(email,name,password,id):
        # 添加数据
    usr_add = user()
    usr_add.email = email
    usr_add.name = name
    usr_add.password = password
    usr_add.id  =  id
    db.session.add(usr_add)
    db.session.commit()

@app.route('/edit')
def user_edit():
    changei = user.query.filter(user.id=="1").first()
    changei.email = "114514@123.com"
    db.session.commit()

@app.route('/delete')
def user_delete():
    delete_user = user.query.filter(user.id=="2").first()
    db.session.delete(delete_user)
    db.session.commit()

@app.route('/', methods=['GET'])
def index():
    res = {"msg" : "你好,这里是后端入口"}
    
    #url传参 获取id参数,默认为none
    id = request.args.get("id",None)
    print("id:"+id)
    
    raw_userlist = db.session.execute( text("select * from user") ).fetchall()
    userlist = list_row2list_dic(raw_userlist)
    d2js={"data":userlist}

    return jsonify(d2js)

#启动flask

if __name__ == "__main__":
     #调试模式 这样每次修改代码不用每次重启服务
     app.run(debug=True, host = "0.0.0.0",port = 5000)
   # app.run(debug=True)

配置可以专门写一个文件,防止以后改的时候到处找

mysql_account = "root"
mysql_password = "xxxxx"
mysql_host = "localhost"
mysql_port = "3306"
mysql_data_col = "test_data"

二、模式请求

我们之前说过get的请求模式,我们现在来试试post的请求。一般我们用post来提交数据、表单等,返回值一般为是否提交成功。post的接参数的方法与put一致,用form。delete和get用args接收参数,其他写法几乎一致,我们这里拿post举例。其他只要form换args就行了,就不写了。

manage:

# 测试post
@app.route('/insert/', methods=['POST'])
def test_post():
    #post和get用form接收参数
    email = request.form.get("email",None)
    id = request.form.get("id",None)
    name = request.form.get("name",None)
    password = request.form.get("password",None)
    user_add(email=email,id=id,name=name,password=password)
    
    return jsonify(  {"errorcode":0,"msg":"插入成功"}  )

test:

    def test_post(self,url,data={}):
        res = requests.post(url=url,data=data)
        return res.text
    res = httpapi.test_post("http://localhost:5000/insert/",data={"id":123,"name":"123","email":"123","password":"123"})
    res = res.encode('utf-8').decode('unicode_escape')
    print(res)

运行后我们可以发现数据库中确实加入了数据,具体怎么写的应该很容易理解,看代码即可。

三、类视图

到此为止,我们的方法已经很多了,我们需要用更好的封装方式来管理我们的方法。


我们可以请求函数写成类,然后可以写get,post等几个不同的功能,这样就可以一个接口多个功能,而且还能继承,非常方便。

四、邮件发送

掌握了数据库和数据传输之后,我们如果想做最基础的登录注册,还需要学会邮箱验证。
打开你的邮箱,找到设置,我的是163邮箱

把这个服务打开,然后会跳出一长串大写字母的授权码,请记录下来。
接下来进入代码阶段:
我们先在social文件夹中在建立一个文件:mail_send.py文件,用于封装发送邮件。

我们先导入库,这些库应该都是python自带的。

import smtplib
#导入文本库
from email.mime.text import MIMEText
#导入邮件分类
from email.mime.multipart import MIMEMultipart

然后写发送邮件的业务类

class send_email:
    def __init__(self):
        self.sender_mail = "你的账号"
        self.password = "你的授权码"

    def send_mail(self,dest_mail,title,content):
        mail = MIMEMultipart()
        #设置标题
        mail["Subject"] = title
        #发送者
        mail["From"] = self.sender_mail
        #收件人
        mail["to"] = dest_mail

        #写内容
        part = MIMEText(content,"html","utf-8")
        #把内容填进去
        mail.attach(part)

        s = smtplib.SMTP_SSL("smtp.163.com",465) 
        s.login(self.sender_mail , self.password )
        s.sendmail(self.sender_mail , dest_mail , mail.as_string() )

        s.close()

注释写的非常清楚,代码的理解请看注释,唯一要说的是 s = smtplib.SMTP_SSL("smtp.163.com",465)这是在定义stmp协议类,前面的请输入你的邮箱的运营商的stmp,我是163邮箱,如果你是qq邮箱,就把163换成qq。后一个参数是port端口号,stmp协议的默认端口号是465.

最后写一个测试代码

sendemail = send_email()
sendemail.send_mail(dest_mail="你想发给的人",title="测试标题",content="测试文件内容")


就发送成功啦~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RK3566(泰山派):3.1寸屏幕D310T9362V1SPEC触摸驱动(竖屏)

RK3566(泰山派):3.1寸屏幕D310T9362V1SPEC触摸驱动(竖屏) 文章目录 RK3566(泰山派):3.1寸屏幕D310T9362V1SPEC触摸驱动(竖屏)电路配置i2c1设备树创建驱动编写…

什么是50etf期权?期权的三级交易权限是什么?

今天期权懂带你了解什么是50etf期权?期权的三级交易权限是什么?期权三级交易权限,作为股票期权交易中的最高级别权限,赋予了投资者更广泛、更灵活的交易选择和策略。 什么是50etf期权? ETF期权是指在支付一定额度的权…

如何让机器理解人类语言?Embedding技术详解

如何让机器理解人类语言?Embedding技术详解 文章目录 如何让机器理解人类语言?Embedding技术详解介绍什么是词嵌入?什么是句子嵌入?句子嵌入模型实现句子嵌入的方法值得尝试的句子嵌入模型 句子嵌入库实践Step 1Step 2Step 3 Doc2…

SwiftUI中三大渐变色的介绍

在SwiftUI中,渐变色是一种常用的视觉效果,用于创建平滑过渡的颜色变化。通过使用渐变色,我们可以实现丰富多彩的界面设计,增强用户体验。 1. 渐变色的种类和用途 种类: 线性渐变(Linear Gradient&#x…

oracle多条重复数据,取最新的

1、原理讲解-可直接看2 筛选出最新的 SELECT * FROM ( SELECT t.*, ROW_NUMBER() OVER (PARTITION BY LOCALAUTHID ORDER BY LASTUPDATETIME DESC) AS rn FROM USER_LOCALAUTH_STATE t ) t WHERE t.rn 1; 解释: 这个序号是基于[LOCALAUTHID]字段进行分…

计算机vcruntime140.dll找不到如何修复,分享5种靠谱的修复教程

当您在运行某个应用程序或游戏时遇到提示“找不到vcruntime140.dll”,这通常意味着系统中缺少了Visual C Redistributable for Visual Studio 2015或更高版本的一个重要组件。这个错误通常发生在运行某些程序时,系统无法找到所需的动态链接库文件。小编将…

ASP.NET医药进销存系统

摘 要 目前,大中型城市的多数药品店已经实现了商品管理、客户管理、销售管理及销售管理等的信息化和网络化,提高了管理效率。但是,在大多数小药品店,药品店管理仍然以传统人工管理为主,特别是在药品的采购、销售、库…

电商核心技术揭秘56:客户关系管理与忠诚度提升

相关系列文章 电商技术揭秘相关系列文章合集(1) 电商技术揭秘相关系列文章合集(2) 电商技术揭秘相关系列文章合集(3) 文章目录 引言客户关系管理(CRM)的重要性提升顾客体验数据驱…

Springboot打包jar如何后台启动和查看日志?

如何后台启动Spring Boot的fat jar 使用nohup命令启动: 在Linux或Unix系统中,你可以使用nohup命令来启动jar包,以确保即使你关闭了终端或断开了SSH连接,程序仍然可以在后台运行。命令格式如下:nohup java -jar yourapp…

PCie协议之-TLP Header详解(一)

✨前言: 在PCIe通信过程中,事务层数据包(Transaction Layer Packets,简称TLP)扮演着非常重要的角色。TLP用于在设备之间传递数据和控制信息,它们是PCIe的基本信息传输单元。 TLP可分为几个部分&#xff0c…

硬盘格式化后能恢复数据吗?这个恢复方法电脑小白也能用!

硬盘格式化后能恢复数据吗?对于这个问题需要先了解清楚硬盘格式化和数据恢复的原理了。 目前我们所说的硬盘格式化通常都是指“快速格式化”,一般来说当我们在清理磁盘空间或者新建磁盘分区时会使用到这个功能,最终的结果就是清除掉磁盘上的…

“打工搬砖记”中吃什么的轮盘功能实现(二)

文章目录 打工搬砖记转盘主要的逻辑实现转盘的素材小结 打工搬砖记 先来一个吃什么轮盘的预览图,这轮盘文案加字呈圆形铺出来,开始后旋转到指定的选项处停下来。 已上线小程序“打工人搬砖记”,可以扫码进行预览观看。 转盘主要的逻辑实现…

【Unity Shader入门精要 第7章】基础纹理补充内容:MipMap原理

1.纹理采样 我们对纹理采样进行显示的过程,可以理解为将屏幕上的一个像素(下文用像素表示)映射到纹理上的一个像素(下文用纹素表示),然后用纹理上的这个像素的颜色进行显示。 理想情况下,屏幕…

AcqKnowledge 5.0使用方法

Biopac 数据导入 matlab 处理方法 第一步:在 AcqKnowledge 软件中,将数据通道的 mark 信息导入到 Graph,并将数据存储为 acq3 的格式 第二步:MATLAB中读取acq3文件脚本 clc clear %%%所有被试这一层路径 pathsub fullfile(file…

【JavaEE】HTTP 协议

文章目录 一、HTTP 协议1、HTTP 是什么2、理解 "应用层协议"3、理解 HTTP 协议的工作过程4、HTTP 协议格式5、HTTP 请求 (Request)5.1 认识 URL 6、 二、HTTPS1、HTTPS是什么2、"加密" 是什么3、HTTPS 的工作过程3.1 对称加密3.2 非对称加密3.3 证书3.4 完…

iOS——消息传递和消息转发

消息传递(Message Passing): 在 iOS 中,消息传递机制是基于 Objective-C 语言的动态性质的一种编程方式。这种机制主要涉及到两个概念:发送者(即消息的发送对象)和接收者(即消息的接…

RS422一主多从MAX3490

RS422一主多从MAX3490 最近项目用到了RS422一主多从,一个主机4个从机。芯片用的MAX3490,几经折腾,最终只能从一拖4改为一拖2。 主机发送端,从机4个接收端都是正常的,没有问题。波形非常完美,没有太大变形 …

matlab使用2-基础绘图

matlab使用2-基础绘图 文章目录 matlab使用2-基础绘图1. 二维平面绘图2. 三维立体绘图3. 图形窗口的分割 1. 二维平面绘图 % 创建一些二维数据 x 0:0.01:10; % x轴的数据点,从0到10,间隔为0.01 y sin(x); % y轴的数据点,是x的正弦…

版本控制:软件开发的基石(一文读懂版本控制)

未经允许,禁止转载! 在现代软件开发中,版本控制是不可或缺的工具。它帮助开发者跟踪和管理代码的变化,协作完成项目,并确保代码的完整性和安全性。本文将基于Git官网的视频“什么是版本控制”来深入探讨版本控制的基本…

pyqt QComboBox下拉列表框控件

pyqt QComboBox下拉列表框控件 QComboBox效果代码 QComboBox QComboBox 是 PyQt(中的一个控件,它允许用户从下拉列表中选择一个选项。这个控件在需要用户从预定义选项中进行选择时非常有用。 效果 代码 import sys from PyQt5.QtWidgets import QAppl…