1. 公用變量存儲使用
在web開發(fā)時涉及變量和數(shù)據(jù)的使用是非常復(fù)雜的。對于頁面之間的共同需要使用的變量,可以使用緩存技術(shù)保存在瀏覽器中,也可以在服務(wù)器端存儲到數(shù)據(jù)庫里后面再取用。例如對于有些網(wǎng)站需要保存用戶登錄狀態(tài),或者臨時存儲部分?jǐn)?shù)據(jù),除了采用session會話、cookie等緩存技術(shù)外,flask框架也提供了處理上下文的方式全局g對象和context處理。
g對象使用起來較為簡單,直接賦予其屬性即可。如g.name、g.attrs等。
from flask import g
g.name='cr'
在當(dāng)前頁面請求中就可以直接使用g的值了。
context上下文處理可以在局部也可以在全局。
例如想定義一下全局公用變量,可以采用如下方式:
@app.context_processor
def common():
isLogin=False
return isLogin
這樣代碼中的isLogin變量就會在項目業(yè)務(wù)中通用。
2. flask與數(shù)據(jù)庫連接,實現(xiàn)新聞讀取
上述表單的處理已經(jīng)涉及到了一些動態(tài)交互處理技術(shù),不過因為討論表單的處理方式,所以沒有涉及數(shù)據(jù)庫的操作。由于main.py實際上就是一個服務(wù)器上的后端處理程序,后端就可能會與數(shù)據(jù)庫鏈接來實現(xiàn)數(shù)據(jù)的持久性存儲和查詢讀取。
鑒于python中自帶sqlite輕量型數(shù)據(jù)庫,我們在這里直接使用即可。前面也有文章討論過在python中來操作數(shù)據(jù)庫,鏈接為:https://zhuanlan.zhihu.com/p/91075748
我們可以直接使用其中的方法來實現(xiàn)本案例,不過還需要結(jié)合flask框架來實施。
首先在web2020項目文件夾下新建一個dbutil.py文件,專門用于處理數(shù)據(jù)庫相關(guān)業(yè)務(wù)。然后在代碼窗口將增刪改查業(yè)務(wù)代碼編寫好,這里直接參考上述的鏈接代碼:
class dbUtils:
def __init__(self, dbName): # 連接數(shù)據(jù)庫
import sqlite3
self.conn = sqlite3.connect(dbName)
def db_action(self, sql, actionType=0): # 進(jìn)行相關(guān)業(yè)務(wù)操作
try:
res = self.conn.execute(sql)
if actionType == 1: # 當(dāng)操作類型為1時代表為查詢業(yè)務(wù),返回查詢列表
return res.fetchall()
else: # 當(dāng)操作類型不為1時代表為新增、刪除或更新業(yè)務(wù),返回邏輯值
return True
except ValueError as e:
print(e)
def close(self): # 關(guān)閉數(shù)據(jù)庫
self.conn.commit()
self.conn.close()
#1.創(chuàng)建數(shù)據(jù)庫
db=dbUtils('web2020.db')
#2.創(chuàng)建新聞表
sql='create table news (newsid int, content text, author text)'
if db.db_action(sql,0)==True:
print("創(chuàng)建新聞表成功!")
else: print("try again1")
#3.新增新聞
sql= "insert into news values(1,'武漢疫情非常嚴(yán)重,口罩等急需物品短缺','cao')," \
"(2,'全國人民都給武漢加油,疫情肯定會控制住','cao')"
if db.db_action(sql,0)==True:
print("新增新聞表成功!")
else: print("try again1")
db.close()
執(zhí)行后,就完成了新聞表的創(chuàng)建,同時新增了兩條新聞。
接下來在main.py文件中修改一下newspage方法,用于讀取數(shù)據(jù)庫中的兩條新聞,并顯示在新聞頁面中。
@app.route('/news')
def newspage():
import dbutil #導(dǎo)入dbutil模塊,就是上面這個文件
db=dbutil.dbUtils('web2020.db') #鏈接web2020數(shù)據(jù)庫
sql='select * from news' #組裝查詢sql語句
newslist=db.db_action(sql,1) #查詢處理并返回列表
db.close() #關(guān)閉數(shù)據(jù)庫
return render_template("news.html",data=newslist) #將數(shù)據(jù)傳遞到news.html頁面中
然后在news.html頁面中使用jinjia2模板中的語法來讀取兩條新聞內(nèi)容:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>news</title>
</head>
<body>
<p>今日新聞</p>
{% for item in data %} #采用循環(huán)來讀取列表中的內(nèi)容
<p style="color:red">{{item}}</p>
{% endfor %}
<hr>
<p><a href="/ ">回到首頁</a></p>
<p> <a href="{{ url_for('productpage',a=50) }}">去看產(chǎn)品頁</a></p>
</body>
</html>