大家好,我是長風青雲。今天是鐵人賽的第24天了。突然感覺時間過得很快。
今天我打算做兩件事,一個是在首頁放入下載RSA生成器,讓使用者可以直接下載。另一個就是昨天說的好友。
你的信箱裡會不會有很多陌生人寄信給你?但如果偏偏其實那是重要的信件,你又不能說不看就不看。所以這裡面我做了一個機制,昨天的sidebar不是無法使用嗎?今天我們要讓他開始可以運作。
那我們就開始吧~
這部分很簡單,使用Flask自帶的函式send_from_directory()就好了。
@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^
處理未讀和已讀信件意味著我們必須將我們的mailbox做修改。
增加了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傻眼……)。
感覺特別符合需求吧~
你可以通知也可以不通知,反正你加別人好友也不會對對方造成影響www
這是friend的資料庫,那這就讓我們去後台吧~
@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。圖片來源
這個就是Join的簡單介紹,我在這裡使用到INNER JOIN 和 LEFT JOIN。
好友信件使用INNER JOIN的原因是因為,我要信件的存在與好友的存在同時成立。直接說好像不清楚,我們來看圖~
你可以看見當我執行第六行(INNER JOIN)時,因為系統並不是yueh860304或yueh970304的好友,所以他並不會被我查詢到。
但是如果我是使用LEFT JOIN(第七行),他會將mailbox裡面的全部顯現,只是右邊查詢不到的值為NULL。
所以在這裡我的好友及非好友就可以很容易的取出了~
那讓我們來看看影片吧~
看完影片,又到了預告時間。
我思來想去,要不這個實例就做到這裡吧,程式碼我會放到github上。
明天就到我一直心心念念的最後一個實例了!101 video!