iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 24
0
Modern Web

慢慢帶你了解Flask系列 第 24

慢慢帶你了解Flask - Day24 SecretTalk(6):下載檔案與信件分類

大家好,我是長風青雲。今天是鐵人賽的第24天了。突然感覺時間過得很快。
今天我打算做兩件事,一個是在首頁放入下載RSA生成器,讓使用者可以直接下載。另一個就是昨天說的好友。

你的信箱裡會不會有很多陌生人寄信給你?但如果偏偏其實那是重要的信件,你又不能說不看就不看。所以這裡面我做了一個機制,昨天的sidebar不是無法使用嗎?今天我們要讓他開始可以運作。
那我們就開始吧~

下載RSA

這部分很簡單,使用Flask自帶的函式send_from_directory()就好了。
https://ithelp.ithome.com.tw/upload/images/20230606/20120116n79RIHP0eq.png

@app.route('/download/')
def download():
	path=os.path.dirname(__file__)
	return send_from_directory(path, 'rsa.exe', as_attachment=True)

path指向的是我們app.py所在的資料夾,所以我是將rsa.exe和資料夾放在同一層。這樣就可以了^w^

sidebar

未讀已讀

處理未讀和已讀信件意味著我們必須將我們的mailbox做修改。
https://ithelp.ithome.com.tw/upload/images/20230606/20120116w3TFuv3H8c.png
增加了UNREAD這個選項,我們就可以處理已讀與未讀的訊息了。
那python部分又該怎麼寫呢?
之前我使用request的方式都是使用request.form[‘name’]來獲得。但是偏偏這次我是很多個html共用一個路由,有些html裡面沒有那個form,所以在跑的時後一直出錯。
然後我其實是已經有點煩躁的……跑去測試了request.form.get(‘name’)。
沒想到!居然可以!request.form.get()是如果沒有得到name值的話,他會回傳None~助かった!(撒小花)
所以呢~我們未讀和已讀的的信件部分就可以寫成

if request.form.get('select')=='全部信件':
command="SELECT * FROM mailbox WHERE RECEIVER='%s'" % current_user.id
elif request.form.get('select')=='未讀信件':
command="SELECT * FROM mailbox WHERE RECEIVER='%s' AND UNREAD=1" % current_user.id
elif request.form.get('select')=='已讀信件':
command="SELECT * FROM mailbox WHERE RECEIVER='%s' AND UNREAD=0" % current_user.id

好友

我其實想了一陣子,有點糟糕的問題。
朋友該是設雙向的,還是單向的?
比如Facebook就是雙向的,instagram就是單向的。
我私心認為……其實朋友這件是算是單向的,但是運氣好人家箭頭也指向你,你們就變成雙向了,然後有些人其實你是會想要默默關注卻不想被對方知道的(其實我原本是想著偷偷追蹤自己崇拜的明星、結果別人說是偷窺自家弟妹、或是暗戀者心態OAO傻眼……)。
https://ithelp.ithome.com.tw/upload/images/20230606/201201160ud2CXOa6Q.png
感覺特別符合需求吧~
你可以通知也可以不通知,反正你加別人好友也不會對對方造成影響www
這是friend的資料庫,那這就讓我們去後台吧~
https://ithelp.ithome.com.tw/upload/images/20230606/20120116liuE7OAmgU.png

@app.route('/friend/',methods=['GET','POST'])
def friend():
	if request.method=='POST':
		command = "INSERT INTO friend VALUES (%s,%s)"
		val=(current_user.id,request.form['f_account'])
		cursor.execute(command, val)
		db.commit()
		if request.form.get('notify')=='yes':
			title="System mail"
			message=current_user.id+" request to be your friend."
			command = "SELECT * FROM information WHERE ACCOUNT='%s'" % request.form['f_account']
			cursor.execute(command)
			result = cursor.fetchone()
			c_theme=encrypt(title,result[3])
			c_content=encrypt(message,result[3])
			command = "INSERT INTO mailbox(SENDER,RECEIVER,UNREAD,THEME,CONTENT) VALUES (%s,%s,%s,%s,%s)"
			val=('System',request.form['f_account'],True,c_theme,c_content)
			cursor.execute(command, val)
			db.commit()
	return render_template('add_friend.html')

我們的f_account就是我們請求加為好友的人的帳號。
Notify則是決定要不要通知對方,如果選擇通知,對方會收到一封來自系統的信件。
既然加了好友,那我們在收件夾的MySQL command又是長什麼樣呢?

elif request.form.get('select')=='好友信件':
		command="SELECT * FROM mailbox INNER join friend on (mailbox.RECEIVER=friend.ACCOUNT AND mailbox.SENDER=friend.FRIEND) WHERE RECEIVER='%s'" % current_user.id
elif request.form.get('select')=='陌生信件':
		command="SELECT * FROM mailbox LEFT JOIN friend on (mailbox.RECEIVER=friend.ACCOUNT AND mailbox.SENDER=friend.FRIEND) WHERE ACCOUNT IS NULL AND RECEIVER='%s'" % current_user.id
elif request.form.get('select')=='系統信件':
		command="SELECT * FROM mailbox WHERE RECEIVER='%s' AND SENDER='system'" % current_user.id

因為要比對兩個資料表,所以我們使用到了join。圖片來源
https://ithelp.ithome.com.tw/upload/images/20230606/201201169s6wZqE2Vl.jpg
這個就是Join的簡單介紹,我在這裡使用到INNER JOIN 和 LEFT JOIN。
好友信件使用INNER JOIN的原因是因為,我要信件的存在與好友的存在同時成立。直接說好像不清楚,我們來看圖~
https://ithelp.ithome.com.tw/upload/images/20230606/20120116ftkatRYEA0.png
https://ithelp.ithome.com.tw/upload/images/20230606/20120116LgURFErqzK.png
你可以看見當我執行第六行(INNER JOIN)時,因為系統並不是yueh860304或yueh970304的好友,所以他並不會被我查詢到。
但是如果我是使用LEFT JOIN(第七行),他會將mailbox裡面的全部顯現,只是右邊查詢不到的值為NULL。
所以在這裡我的好友及非好友就可以很容易的取出了~
那讓我們來看看影片吧~

看完影片,又到了預告時間。
我思來想去,要不這個實例就做到這裡吧,程式碼我會放到github上。
明天就到我一直心心念念的最後一個實例了!101 video!


上一篇
慢慢帶你了解Flask - Day23 SecretTalk(5):寄信送信(加密解密)
下一篇
慢慢帶你了解Flask - Day25 101-Videos(1):前言 + 致敬(今日內容無關程式碼)
系列文
慢慢帶你了解Flask30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言