flask框架實戰(zhàn)5-全局對象g和連接數(shù)據(jù)庫

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>

--參考
https://zhuanlan.zhihu.com/p/104273184

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容