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

news2024/11/18 21:43:58

全栈开发一条龙——前端篇
第一篇:框架确定、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="测试文件内容")


就发送成功啦~

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

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

相关文章

国内好用的测试用例管理工具有哪些?

目前市面上的测试用例管理工具有很多,但由于针对的项目、领域、目标用户,功能也并不一致,所以选择一款适合的测试管理平台并不轻松。做好这件事,首先要需求明确你用测试管理工具干什么?最终想要达到什么目标&#xff1…

基于UnetPlusPlus(Unet++)实现的医学图像分割

1、前言 unetPlusPlus 在unet 的基础上增添了密集连接的结构,有点像densenet网络 因为这种密集连接,unet可以实现剪枝的轻量化操作。由于本人的没有接触过这种剪枝、蒸馏之类的轻量化方法,所以不多赘述 本章仅仅根据unet模型实现医学图像分…

西门子博途WINCC精致触摸屏配方实用一例

我们现场有一台设备,是用来锯切钢坯的,里面有几个重要的参数,一开始投产的时候厂家没有做配方功能,需要操作人员每次换钢坯就需要手动计算然后输入,后来有时间我就做了个这个定尺管理的功能,方便了操作人员…

汇昌联信电商:拼多多网店好做吗?

在电子商务的海洋中,拼多多以其独特的团购模式和亲民策略迅速崛起,吸引了大批消费者和商家的目光。对于“拼多多网店好做吗?”这个问题,答案并非简单的是与否,而是需要从多个维度进行深入分析。 一、市场定位与竞争环境 拼多多定…

华为开源自研AI框架昇思MindSpore应用案例:在ResNet-50网络上应用二阶优化实践

常见的优化算法可分为一阶优化算法和二阶优化算法。经典的一阶优化算法如SGD等,计算量小、计算速度快,但是收敛的速度慢,所需的迭代次数多。而二阶优化算法使用目标函数的二阶导数来加速收敛,能更快地收敛到模型最优值&#xff0c…

TCP的滑动窗口机制和流量控制

目录 滑动窗口 流量控制 拥塞控制 滑动窗口 TCP除了保证可靠性之外,也希望能够尽可能高效的完成数据传输。滑动窗口就是一种提高效率的机制。以下是不引入滑动窗口的数据传输过程: 可以看到,主机A这边每次收到一个ACK才发送下一个数据。这…

接口、会话控制

文章目录 接口介绍RESTful APIjson-server接口测试工具apipost公共参数和文档功能 会话控制cookie介绍和使用运行流程浏览器中操作Cookieexpress中cookie操作 Sessionsession运行流程:session中间件配置session 和 cookie 的区别CSRF跨站请求伪造 tokenJWT介绍与演示…

数据新探:用Python挖掘互联网的隐藏宝藏

Hello,我是你们的阿佑,今天给大家上的菜是——数据存储!听起来枯燥无味?错了!阿佑将带你重新认识数据存储的艺术。就像为珍贵的艺术品寻找完美的展览馆,为你的数据选择合适的存储方式同样重要! …

2022-1990年 各省碳排放Co2数据集(含数据及参考文献)

碳排放是指人类活动产生的二氧化碳(CO2)等温室气体释放到大气中的过程。通过划分排放源的范围以避免重复计算的思想,由世界资源研究所在关于企业温室气体排放清单编制的指南中首次提出。城市碳排放核算边界界定借鉴该思想,可分为3…

Web开发三层架构

##Controller Service Dao(mapper) 软件设计:高内聚 低耦合 Controller 调用Service, Service调用 DAO 模块之间耦合 如果要从EmpServiceA切换到EmpServiceB,Controller代码也要修改 new EmpServiceB 分层接耦 容器中放EmpServiceA&am…

(深度估计学习)Win11复现DepthFM

目录 1. 系统配置2. 拉取代码,配置环境3.开始深度预测4.运行结果 论文链接:https://depthfm.github.io/ 讲解链接:https://www.php.cn/faq/734404.html 1. 系统配置 本人系统:Win11 CUDA12.2 python3.11.5 这里附上几个CUDA安装链…

Linux第四节--常见的指令介绍集合(持续更新中)

点赞关注不迷路!本节涉及初识Linux第四节,主要为常见的几条指令介绍。 如果文章对你有帮助的话 欢迎 评论💬 点赞👍🏻 收藏 ✨ 加关注👀 期待与你共同进步! 1. more指令 语法:more [选项][文件]…

【数据可视化01】matplotlib实例介绍4之六边形分箱图

目录 一、引言二、实例介绍 一、引言 hexbin是一个二维直方图,其中箱子是六边形,颜色表示每个箱子内的数据点数。 二、实例介绍 import matplotlib.pyplot as plt import numpy as np# Fixing random state for reproducibility np.random.seed(19680…

umi搭建react项目

UMI 是一个基于 React 的可扩展企业级前端应用框架,提供路由、状态管理、构建和部署等功能,可以帮助开发者快速构建复杂的单页面应用(SPA)和多页面应用(MPA)。它与 React 的关系是,UMI 构建在 R…

draw.io 网页版二次开发(1):源码下载和环境搭建

目录 一 说明 二 源码地址以及下载 三 开发环境搭建 1. 前端工程地址 2. 配置开发环境 (1)安装 node.js (2)安装 serve 服务器 3. 运行 四 最后 一 说明 应公司项目要求,需要对draw.io进行二次开发&…

算法提高之加成序列

算法提高之加成序列 核心思想&#xff1a;迭代加深 dfs 从上往下逐渐增大depth 这样下面没有用的方案就不用遍历了 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N 110;int n;int path[N];//当前求哪个位置…

2.1.2 事件驱动reactor的原理与实现

LINUX 精通 2 day14 20240513 day15 20240514 算法刷题&#xff1a;2维前缀和&#xff0c;一二维差分 耗时 135min 习题课 4h 课程补20240425 耗时&#xff1a;4h 课程链接地址 回顾 怎么学0voice课网络io——一请求一线程&#xff0c;一个client一个连接再accpet分配io f…

考研数学|李林《880》做不动,怎么办!?看这一篇!

在考研数学的备考过程中&#xff0c;遇到难题是很常见的情况&#xff0c;尤其是当你尝试解决李林880习题集中的问题时。他以其难度和深度著称&#xff0c;旨在帮助考生深入理解数学分析的复杂概念。 如果你在解题过程中感到困难&#xff0c;这并不是你个人的问题&#xff0c;而…

数据库系统概论(超详解!!!)第八节 数据库设计

1.数据库设计概述 数据库设计是指对于一个给定的应用环境&#xff0c;构造&#xff08;设计&#xff09;优化的数据库逻辑模式和物理结构&#xff0c;并据此建立数据库及其应用系统&#xff0c;使之能够有效地存储和管理数据&#xff0c;满足各种用户的应用需求&#xff0c;包…

【LLM第五篇】名词解释:prompt

1.是什么 提示工程&#xff08;Prompt Engineering&#xff09;是一门较新的学科&#xff0c;关注提示词开发和优化&#xff0c;帮助用户将大语言模型&#xff08;Large Language Model, LLM&#xff09;用于各场景和研究领域。 掌握了提示工程相关技能将有助于用户更好地了解…