flaskweb遇到的问题总结(持续更新)

来源:互联网 发布:美术教程视频软件 编辑:程序博客网 时间:2024/05/29 02:30

1. 添加mysql的支持

1.在书本的基础上添加pip install PyMySQL
2.修改Config

mysql://username:password@hostname/database
SQLALCHEMY_DATABASE_URI = 'mysql://root:123456@127.0.0.1/hello'

改为

 SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@127.0.0.1/hello'

就可以使用mysql了

2. 邮箱

邮箱不支持Google,可用QQ邮箱替换。
邮箱服务器改为

MAIL_SERVER = 'smtp.qq.com'

同时要QQ邮箱要开启smtp服务
MAIL_USERNAME为开启的QQ邮箱
MAIL_PASSWORD为开启SMTP服务提供的字符串密码
私密问题可用环境变量来替换。

3.数据库操作时无法赋予用户角色

无法赋予用户角色导致一直没有管理员甚至没有一般角色,查看数据库发现用户角色显示NULL:
mysql> select id,username,role_id,email from users;
+—-+———-+———+——————-+
| id | username | role_id | email |
+—-+———-+———+——————-+
| 1 | a | NULL | 11111@qq.com |
| 2 | b | NULL | 22222@qq.com |
+—-+———-+———+——————-+
再次查看models.py里的init(self, **kwargs)函数创建角色的代码

self.role = Role.query.filter_by(permissions=0xff).first()

发现Role.query.filter_by()函数只是查询permissions=0xff的用户,返回的是查询结果。书上说可以加载,有疑问又查看官方文档:

下面这个例子发起了一个查询,加载名为”User” 的用户角色:

user_role = Role.query.filter_by(name=’User’).first()

加载了用户角色,可实际上并没有生成用户角色,直到再暴力添加#2后就可以生成管理员角色:

 self.role = Role.query.filter_by(permissions=0xff).first()#1 self.role = Role(permissions=0xff)#2

书上添加查询,是为了确保role里有permissions=0xff也就是管理员,如果里面没有那就返回NULL。这样子程序更加严谨。想到既然查询的是roles表,里面没有数据那不就是一直返回NULL吗,一查询果然没有添加角色数据到表里。添加后再删掉暴力赋值#2,果然又可以生成管理员权限了,同时也验证了first()函数返回查询的第一个结果!
问题解决!最大的问题是查询结果可以用作角色,SQLAlchemy默认处理了数据库的主键!这样就串起来了。
SQLAlchemy 为查询生成的原生SQL 查询语句:

>>> str(User.query.filter_by(role=user_role))'SELECT users.id AS users_id, users.username AS users_username,users.role_id AS users_role_id FROM users WHERE :param_1 = users.role_id'

4. 数据库操作问题小坑

每次开机都会出现数据库无法写入,发现是数据库迁移的问题。这方面没有仔细研究,于是重新开始。
1.删除原来的迁移仓库和迁移脚本
2.重新初始化迁移仓库:

python manage.py db init

切记要删除原来数据库,再create一个新数据库(重新创建时,之后更新不必)
3.创建迁移脚本:

python manage.py db migrate -m " "

检查迁移脚步细节
4.最后提交迁移脚本:

python manage.py db upgrade

之后每次修改数据库后执行3 4
然后在shell环境下写入一些数据。刚开始更改环境后没有退出shell再进入shell导入环境,导致写入数据不成功,觉得还是数据库写入问题!所以改变环境后一定要退出shell再进入。

在遇到问题,解决问题时,切记不能想着一步到位,要想到会有其他因素导致这个问题,要是一直出现问题,最好先停下来想想。确定哪一步是正确的,验证好后就要考虑是否是其他原因。

0 0
原创粉丝点击