[Flask] Flask问题集(后端模板渲染项目)
阅读原文时间:2023年07月09日阅读:1

redirect:重定向,会改变url

render_template:模板渲染,用模板来渲染当前页,不会改变url

【描述】

博客项目,在login请求中设置g对象,在register请求中取得g对象,取得None

@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

【分析】

文档中说道:To share data that is valid for one request only from one function to another …

注意是一次请求,一次!

要实现跨request需要用到session

【描述】

最终需要的效果图:

我的数据库:

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位之后的字符串,并以…表示

{{ post\['body'\]|truncatechars:100 }}

【描述】

【解决方案】

看了一下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

【描述】

博客表:

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_

原因是我用了sqlite manager打开了数据库观察,导致删除文章失败。。。呕

【描述】

模板: 

{{ post['body'] }}

显示如下:

【解决方案】

正则去掉标签

估计是ajax

【解决方案】redirect

【解决方案】ajax

【解决方案】

用隐藏输入框

【方法一】

利用外键完整性约束,在外键加入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

【描述】

一个简单的路由:

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

前端传来一个form想由后端处理,只需要逻辑处理后update一下数据库就行,不用返回新页面,如何实现呢?

【解决方案】ajax

【描述】

flask会检查{{…}}里面的内容,而不管在模板中是否被注释。因为路由有所改动,导致报错。。

【解决方案】

删掉,原理请参考源码

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