flaskweb遇到的问题总结(持续更新)
2016-03-15 17:15
615 查看
1. 添加mysql的支持
1.在书本的基础上添加pip install PyMySQL2.修改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再进入。
在遇到问题,解决问题时,切记不能想着一步到位,要想到会有其他因素导致这个问题,要是一直出现问题,最好先停下来想想。确定哪一步是正确的,验证好后就要考虑是否是其他原因。
相关文章推荐
- MySQL中的integer 数据类型
- MySQL存储过程
- mysql中int、bigint、smallint 和 tinyint的区别与长度
- mysql load data 导出、导入 csv
- source命令执行SQL脚本文件
- 如何使用 Flask 编写 Python Web API
- MySQL创建用户及权限控制
- MySQL管理数据表
- linux下mysql添加用户
- mysql procedure
- mysql触发器
- MySQL 备份和恢复策略
- mac下安装mysql(转载)
- mysql 修改编码 Linux/Mac/Unix/通用(杜绝修改后无法启动的情况!)
- MySQL数据的导出、导入(mysql内部命令:mysqldump、mysql)
- mysql数据行转列
- Linux下修改MySQL编码的方法
- MySQL Server 日志
- MySQL 安全事宜