[Flask] Flask問題集(後端模板渲染項目)

1.redirect和render_template的區別?

redirect:重定向,會改變urlcss

render_template:模板渲染,用模板來渲染當前頁,不會改變urlhtml

 

2.關於 'g' 對象踩的坑

【描述】前端

博客項目,在login請求中設置g對象,在register請求中取得g對象,取得Noneajax

@bp.route('/login',methods=('GET','POST'))
def login():
    #...
    g.myname = 'john'

@bp.route('/register',methods=('GET','POST'))
def register():
    #...
    name = g.get('myname')
    print(name) # None

【分析】sql

文檔中說道:To share data that is valid for one request only from one function to another ...shell

注意是一次請求,一次!數據庫

 要實現跨request須要用到sessionflask

 

3.從DB取出的博客文章顯示最多100個字符,其後的省略,如何實現?

【描述】windows

最終須要的效果圖:後端

個人數據庫:

CREATE TABLE user (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  username TEXT UNIQUE NOT NULL,
  password TEXT NOT NULL
);

CREATE TABLE post (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  author_id INTEGER NOT NULL,
  created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  title TEXT NOT NULL,
  body TEXT NOT NULL,
  FOREIGN KEY (author_id) REFERENCES user (id)
);

 

【解決方案1】

1.寫sql的時候這樣寫 :SUBSTR(p.body,1,100) as body

SELECT p.id , title, SUBSTR(body,1,100) as body,created,author_id,username
FROM post p JOIN user u ON p.author_id = u.id
ORDER BY created DESC

注意必定要定義別名 ... as body,否則會致使在html模板中取不到值

2.前端css代碼

font-size:0.6em;
overflow:hidden;
white-space: nowrap;
text-overflow:ellipsis;

 【解決方案2】

在模板中使用過濾器(truncatechars),以下將截斷100位以後的字符串,並以...表示

<p class="list-group-item-text blog-index-textbody">{{ post['body']|truncatechars:100  }}</p>

 

 

4.按照flask官方文檔,我在VScode的TERMINAL中運行失敗,如何解決?

【描述】

【解決方案】

看了一下VScode的TERMINAL是powershell,CMD 和 powershell 的命令不同

powershell

> $env:FLASK_APP = "myapp"
> $env:FLASK_ENV="development"
> flask run

CMD

> set FLASK_APP=myapp
> set FLASK_ENV=development
> flask run

 【備註】

1.由於導出的環境變量問題,致使windows下初始化db失敗(flask init-db),經過上述方案成功解決

2.windows下把這啓動flask服務的命令寫進bat文件,之後每次只須要運行這個bat文件就能夠了,固然命令要用CMD的那個

運行方法: ./start.bat 

 

5.從數據庫中博客表(TABLE post)取出的時間(created)不對

【描述】

博客表:

CREATE TABLE post (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  author_id INTEGER NOT NULL,
  created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  title TEXT NOT NULL,
  body TEXT NOT NULL,
  FOREIGN KEY (author_id) REFERENCES user (id)
);

其中created字段時間比實際時間早了8小時左右

 

【解決方案】 

網上查了一下是由於時區的關係

記得datetime外層必定要裹上括號

created TIMESTAMP NOT NULL DEFAULT (datetime('now','localtime')),

 或者

created TIMESTAMP NOT NULL DEFAULT (datetime(CURRENT_TIMESTAMP,'localtime')),

參考:https://www.cnblogs.com/GDLMO/archive/2010/07/19/1780920.html

 

6.今天碰到操做sqlite的時候出現db locked的狀況。

緣由是我用了sqlite manager打開了數據庫觀察,致使刪除文章失敗。。。嘔

 

7.從後臺取到html的數據(博客內容body),反應到模板上顯示出了源碼,如何解決

【描述】

模板: <p class="list-group-item-text blog-index-textbody">{{ post['body'] }}</p> 

顯示以下:

 

【解決方案】

正則去掉標籤

 

8.flask怎麼實現點擊連接後在新標籤頁打開?

 

9.B站發表評論的HTML代碼,爲何沒有用form?他用的是什麼?

估計是ajax

10.用form提交表單後刷新頁面,會提示「確認從新提交表單」的警告框,如何解決?

 【解決方案】redirect

11.如何實現評論了以後不刷新頁面,只刷新評論列表呢?(局部刷新)

【解決方案】ajax

12.一個html裏面有多個form表單,如何區別這些表單呢?

 【解決方案】

用隱藏輸入框<input type="hidden" name="form1"/>

 

13.刪除一篇博客文章後,怎麼同時刪除留言等信息呢?數據庫該如何設計?

 【方法一】

利用外鍵完整性約束,在外鍵加入ON DELETE CASCADE

DROP TABLE IF EXISTS user;
DROP TABLE IF EXISTS post;
DROP TABLE IF EXISTS comment;
CREATE TABLE user (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  username TEXT UNIQUE NOT NULL,
  password TEXT NOT NULL
);

CREATE TABLE post (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  author_id INTEGER NOT NULL,
  created TIMESTAMP NOT NULL DEFAULT (datetime(CURRENT_TIMESTAMP,'localtime')),
  title TEXT NOT NULL,
  body TEXT NOT NULL,
  FOREIGN KEY (author_id) REFERENCES user (id)
);


CREATE TABLE comment (
  authorid INTEGER NOT NULL,
  postid INTEGER NOT NULL,
  userid INTEGER NOT NULL,
  ctext TEXT NOT NULL,
  ctime TIMESTAMP NOT NULL DEFAULT (datetime(CURRENT_TIMESTAMP,'localtime')),
  enable_dis BOOLEAN NOT NULL,
  reply_targetid INTEGER,
  FOREIGN KEY (userid) REFERENCES user (id),
  FOREIGN KEY (reply_targetid) REFERENCES user (id),
  FOREIGN KEY (authorid) REFERENCES post (author_id),
  FOREIGN KEY (postid) REFERENCES post (id) ON DELETE CASCADE
);


 

注意:sqlite須要手動開啓外鍵完整性約束: sqlite> PRAGMA foreign_keys = ON; 

參考:https://blog.csdn.net/qq_34082034/article/details/54927680

 

14.flask中一個簡單的路由系統必須返回一個渲染頁面或者重定向頁面嗎?若是我只是想進行邏輯處理呢?

【描述】

一個簡單的路由:

@app.route('/hello')
def hello():
    pass
    return render_template('index.html')

前端傳來一個form想由後端處理,只須要邏輯處理後update一下數據庫就行,不用返回新頁面,如何實現呢?

 【解決方案】ajax

15.【踩坑】模板中註釋的語句竟然也會被debug檢查

【描述】

flask會檢查{{...}}裏面的內容,而無論在模板中是否被註釋。由於路由有所改動,致使報錯。。

【解決方案】

刪掉,原理請參考源碼

 

16.jinja渲染模板html代碼會產生大量空行(空格),如何解決?

在block中加入"-"符號。例如:------{%- if test -%}{%- endif -%}

相關文章
相關標籤/搜索