Python, Flask, Jinja, SQLite 里的坑

- 分享

上完 CS50,决定按照课程进度完成最后的 Final Project。于是开发了 Project SFLS ♫,途中遇到了许多坑,记载如下。

400 Bad Request

问题:表单与后台程序不匹配(后台调用了表单里没有的项) 坑:手动用不可见文本框传递id,但是误将readOnly设置成了disabled,id读取不能,于是报错。重新改回来即可解决,亦可使用session中转。

Bootstrap 框架不对劲

问题:本来是10-2的排布,但是却变成上面2 下面10 坑:最后发现上面的<table>没有写</table>,造成10继续向下继承。手动修正即可。

SQLite 新建字段出错

问题:建立表后再追加字段,选择NOT NULL属性报错 坑:SQLite就是这样设定的。

SQLite 多层 SQL 嵌套

问题:部分请求中一个 SQL 套一个 SQL,难以判断。 解决:SQLite 支持视图属性,可用其作为临时表。

SQLite count(*) 不能在 Python 中调用

问题:在 Python 中引用 db.execute 出来的 count(*),总是提示失败 坑:似乎*是 Python 中的特殊字符,不能乱用 解决:用 as 将count(*)改写为 c 即可。

SQLAlchemy 获取出来的是 Proxy 对象,不能判断存在

解决:用自带的 .scalar() 方法,在不存在时能返回None

SQLAlchemy 获取出的 Proxy 对象,其中的值难以操作

坑:试图对lang进行转换,但是提示 Proxy对象不可用。 解决:用 CS50 函数库中中的 SQL解决,本质上就是对 SQLAlchemy 的二次封装,获取出来的直接就是dict格式,更好用了。

SQL 返回单条结果,读取信息报错

坑:虽然返回的是单条结果,但是还是要用for elem in dict处理得到真正的单条数据。

Validator.js 字段匹配总是出错

坑:#指定的是id而不是name,要再设定一次id

Python 3 编码报错

坑:代码中有中文,提示not an ASCII character 解决:文件头加上#coding UTF-8

Excel 导出的 CSV 无法在 SQLite 上导入

坑:Excel 导出 CSV 的默认文件编码是 ASCI 解决:用记事本打开,另存为 UTF-8

Flask 的消息闪现不显示

解决:检查 layout.html 中页面逻辑,先用with获取,再用for得到具体的闪现消息。

页面多次重载结果不同

解决:清空 gunicorn 缓存,重启服务器。

Jinja 2 渲染出的文本框露出下一参数

解决:看看引号是否完全加上了

Python 提示变量定义前使用

解决:global