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 = emusr_add.name = nausr_add.password = psusr_add.id  =  iddb.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 = emailusr_add.name = nameusr_add.password = passwordusr_add.id  =  iddb.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參數,默認為noneid = 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)#啟動flaskif __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.textres = 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.pswp.cn/diannao/12339.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/12339.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/12339.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STL介紹及使用場景分析

一.總體介紹 STL(Standard Template Library)是C標準模板庫,提供了一系列的通用模板類和函數,用于實現常見的數據結構和算法,方便開發者快速地實現各種功能。STL包括了容器(Containers)、算法&a…

[BJDCTF 2020]easy_md5、[HNCTF 2022 Week1]Interesting_include、[GDOUCTF 2023]泄露的偽裝

目錄 [BJDCTF 2020]easy_md5 ffifdyop [SWPUCTF 2021 新生賽]crypto8 [HNCTF 2022 Week1]Interesting_include php://filter協議 [GDOUCTF 2023]泄露的偽裝 [BJDCTF 2020]easy_md5 嘗試輸入一個1,發現輸入的內容會通過get傳遞但是沒有其他回顯 觀察一下響應…

文本協議中嵌入二進制數據

在文本協議中嵌入二進制數據時,通常不推薦使用new String(byte[], Charset),除非你確定這些字節實際上是以指定的字符集編碼的文本。這是因為如果字節不是有效的文本編碼,那么使用new String(byte[], Charset)可能會產生不可預測的結果&#…

VictoriaMetrics

概念 介紹 VictoriaMetrics,是一個快速高效、經濟并且可擴展的監控解決方案和時序數據庫 本文均用VM簡稱VictoriaMetric 作用 用于作為prometheus的長期儲存方案,代替prometheus存儲監控采集的數據 優點 遠程存儲:可作為單一或多個Pro…

【算法】二分查找——二分查找

本節博客詳述“二分查找”并且以例子來進行討論,有需要借鑒即可。 目錄 1.二分查找1.1使用前提1.2模板 2.題目3.題解代碼示例4.二分查找的一般模板5.總結 1.二分查找 1.1使用前提 使用的條件:數組具有“二段性”,二段性指的是數組可以根據某…

110份財務常用excel模板(個稅、采購、報銷、預算),超實用!

如果你還在為報表頭疼,那你一定不能錯過這篇干貨滿滿的分享! 個稅報表 個人所得稅,聽起來就頭大?別擔心,掌握這些技巧,輕松搞定! - 記錄員工收入,確保數據準確無誤 - 計算應納稅…

【Unity Shader入門精要 第7章】基礎紋理(一)

1. 紋理映射 每一張紋理可以看作擁有一個屬于自己的2D坐標空間,其橫軸用U表示,縱軸用V表示,因此也稱為UV坐標空間。 UV空間的坐標范圍為[0,0]到[1,1],在Unity中,UV空間也是從左下到右上&#…

測試萌新Python學習(五)接口自動化測試requests

requests 接口自動化測試requests庫基本實現請求-GET基本實現請求-POST基本實現請求-補充 sessionCookie和Session案例params 接口自動化測試 概念程序驅動代替人工驅動去實現接口測試 實現方式 測試工具(jmeter, postman, …)編碼工具(python, java, …) 比較 工具 優點:…

Network Compression

聽課(李宏毅老師的)筆記,方便梳理框架,以作復習之用。本節課主要講了Network Compression,包括為什么要壓縮,壓縮的主要手段(pruning,knowledge distillation,parameter quantization,architect…

Elasticsearch_sql插件安裝+使用

一、安裝 前提是你先安裝好了elasticseach,安裝過程在我上一篇博客有說,可以看一下。 在elasticsearch容器啟動的情況下,進入到elasticsearch容器,Elasticsearch_sql倉庫,比如我的版本是8.11.2,那么我就選…

[藍橋杯]真題講解:抓娃娃(思維+二分)

[藍橋杯]真題講解&#xff1a;抓娃娃&#xff08;思維二分&#xff09; 一、視頻講解二、正解代碼1、C2、python33、Java 一、視頻講解 [藍橋杯]真題講解&#xff1a;抓娃娃&#xff08;思維二分&#xff09;&#xff09; 二、正解代碼 1、C #include<bits/stdc.h> #d…

fastapi+vue實現導入Excel表格的功能

1.前端部分 1.1 api設置 // 導入用戶 export function uploadUser(data) {const formData new FormData();formData.append(file, data); // data 是從文件上傳事件中獲取的文件對象return request({url: /users/upload,method: post,headers: {Content-Type: multipart/fo…

前端CSS3基礎1(新增長度單位,盒子模型,背景,邊框,文本屬性,漸變,字體,2D變換,3D變換)

前端CSS3基礎1&#xff08;新增長度單位&#xff0c;盒子模型&#xff0c;背景&#xff0c;邊框&#xff0c;文本屬性&#xff0c;漸變&#xff0c;字體&#xff0c;2D變換&#xff0c;3D變換&#xff09; CSS3 新增長度單位CSS3 新增盒子模型相關屬性box-sizing怪異盒模型box-…

實現簡易版Vuex

從實現一個簡單的 Vuex 類來了解 Vuex 的工作原理。 實現思路 Vuex 下擁有 install 方法和 Store 類。即創建一個 Vuex 的模塊&#xff0c;這個模塊導出 install 方法和 Store 類。 install 方法 Vuex 是 Vue 的一個插件&#xff0c;所以需要實現 Vue 插件約定的 install 方…

Linux:ftp文件傳輸實驗

Linux&#xff1a;ftp文件傳輸實驗 實驗實現 # 安裝對應軟件 [rootserver120 ~]# dnf install vsftpd -y [rootserver120 ~]# dnf install lftp -y# 關閉防火墻以及開啟服務 [rootserver120 ~]# systemctl disable --now firewalld [rootserver120 ~]# systemctl enable --no…

ambari-server高可用配置方案

制品 https://kdocs.cn/l/cie4hSgvUunX 前置條件 環境需要支持VRRP協議 環境需要配置好yum源 變更影響面 變更不會影響其他組件 配置lb(需要客戶側配置并提供LB地址) 轉發方式選擇 主備 監聽端口為8080、8440、8441 協議為tcp 后端監聽選擇kde-offline1為主

【RAG 論文】UPR:使用 LLM 來做檢索后的 re-rank

論文&#xff1a;Improving Passage Retrieval with Zero-Shot Question Generation ???? EMNLP 2022, arXiv:2204.07496 Code: github.com/DevSinghSachan/unsupervised-passage-reranking 論文&#xff1a;Open-source Large Language Models are Strong Zero-shot Query…

【HR】阿里三板斧--20240514

參考https://blog.csdn.net/haydenwang8287/article/details/113541512 頭部三板斧 戰略能不能落地、文化能不能得到傳承、人才能不能得到保障。 頭部三板斧適用的核心場景有三個&#xff1a;一是戰略不靠譜&#xff1b;二是組織效率低、不聚心&#xff1b;三是人才跟不上。對…

c++ 各版本特性介紹

c C是一種高級編程語言&#xff0c;以其強大的功能、靈活性和高效性而聞名。它是由Bjarne Stroustrup在20世紀80年代初期在貝爾實驗室開發的&#xff0c;作為C語言的一個擴展。C不僅包含了C語言的所有特性&#xff0c;還引入了面向對象編程&#xff08;OOP&#xff09;的概念&…

基于Vue3+ElementPlus項目,復制文字到剪貼板功能實踐指南,揭秘使用js-tool-big-box工具庫的核心優勢

在前端開發項目中&#xff0c;很多時候有那么一個場景&#xff0c;就是要求將一段文案復制下來&#xff0c;這段文案可能是一串很長的id&#xff0c;可能是一條命令語句&#xff0c;可能是一小段文案&#xff0c;復制到剪貼板上。這樣有利于用戶復制到其他地方去&#xff0c;使…