《Python Web开发实战》踩地雷记17/3/27
1.Flask-SQLAlchemy
Flask-SQLAlchemy是一个Flask扩展,简化了Flask程序中使用SQLAlchemy的操作。SQLAlchemy是一个很强大的关系型数据库框架,支持多种数据库后台,提供了高层ORM,也提供了使用数据库原生SQL的低层功能。
安装:
pip install flask-sqlalchemy
数据库URL必须保存到Flask配置对象的SQLALCHEMY_DATABASE_URI键中。
hello.py:配置数据库
basedir=os.path.abspath(os.path.dirname(__file__))app.config['SQLALCHEMY_DATABASE_URI']=\'sqlite:///'+os.path.join(basedir,'data.sqlite')
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN']=True #每次请求结束后都会自动提交数据库中的变化db=SQLAlchemy(app)
2.定义模型
ORM中,模型一般是一个Python类,类中的属性对应数据库表中的列。
hello.py:定义Role和User模型
class Role(db.Model):__tablename__='roles'id=db.Column(db.Integer,primary_key=True)name=db.Column(db.String(64),unique=True)def __repr__(self):return '<Role %r>' % self.name
class User(db.Model):__tablename__='users'id=db.Column(db.Integer,primary_key=True)username=db.Column(db.String(64),unique=True,index=True)def __repr__(self):return '<User %r>' % self.username
3.关系
角色到用户的一对多关系,因为一个角色可属于多个用户,而每个用户都只能有一个角色。
class Role(db.Model):#...users=db.relationship('User',backref='role') #backref参数向User模型中添加一个role属性,从而定义反向关系,这一属性可替代role_id访问Role模型,此时获取的是模型对象,而不是外键的值。如果无法决定外键,就要为db.relationship()提供额外参数,从而确定所用外键。class User(db.Model):#...role_id=db.Column(db.Integer,db.ForeignKey('roles.id'))
4.在视图函数中操作数据库
hello.py
user=User.query.filter_by(username=form.name.data).first()if user is None:user=User(username=form.name.data)db.session.add(user)session['known']=Falseelse:session['known']=True#...
return render_template('index.html',form=form,name=session.get('name'),known=session.get('known',False),current_time=datetime.utcnow())
index.html
{%if not known%}
<p>Pleased to meet you!</p>
{%else%}
<p>Happy to see you again!</p>
{%endif%}
5.Flask-Migrate实现数据库迁移
pip install flask-migrate
hello.py:配置Flask-Migrate
from flask_migrate import Migrate,MigrateCommand
#...
migrate=Migrate(app,db)
manager.add_command('db',MigrateCommand)
在维护数据库迁移之前,要使用init子命令创建迁移仓库:
python hello.py db init
upgrade()函数把迁移中的改动应用到数据库中,downgrade()函数则将改动删除。
python hello.py db upgrade
运行应用程序使用Flask-SQLAlchemy时得到一下警告:
SADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by default in the future. Set it to True or False to suppress this warning.
‘SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and ‘
改正:
app.config[‘SQLALCHEMY_TRACK_MODIFICATIONS’] = False
6.Flask-Mail
pip install flask-mail
hello.py:配置Flask-Mail使用Gmail
import os
#...
app.config['MAIL_SERVER']='smtp.googlemail.com'
app.config['MAIL_PORT']=587
app.config['MAIL_USE_TLS']=True
app.config['MAIL_USERNAME']=os.environ.get('MAIL_USERNAME')
app.config['MAIL_PASSWORD']=os.environ.get('MAIL_PASSWORD')
千万不要把账户密令直接写入脚本,特别是当你计划开源自己的作品时,为了保护账户信息,要让脚本从环境中导入敏感信息。
hello.py:初始化Flask-Mail
from flask_mail import Mail
#...
mail=Mail(app)
在环境中设定用户名和密码两个环境变量
export MAIL_USERNAME=’username’
export MAIL_PASSWORD=’password’
发送电子邮件时遇到错误:
python通过SMTP发送邮件失败:
错误1:smtplib.SMTPAuthenticationError: (550, b’User has no permission’)
我们使用python发送邮件时相当于自定义客户端根据用户名和密码登录,然后使用SMTP服务发送邮件,新注册的163邮箱是默认不开启客户端授权的(对指定的邮箱大师客户端默认开启),因此登录总是被拒绝,解决办法(以163邮箱为例):进入163邮箱-设置-客户端授权密码-开启(授权码是用于登录第三方邮件客户端的专用密码)
Gmail:
If you have activated two-step verification, you need to turn that off. Also ,you can try another thing. Go to https://www.google.com/settings/security/lesssecureapps and https://myaccount.google.com/security?pli=1#connectedapps, allow access for the less secure app. Google might consider your server’s sign-in process as less secure sign-in technology, which makes your account more vulnerable. So allowing access might help you.
《Python Web开发实战》踩地雷记17/3/27相关推荐
- 如何评价python知乎_如何评价《Python Web开发实战》?
我先说一个「为什么给人没有太多实战的感觉」的问题吧.我这本书借着「豆瓣」这个title出版,相信很多人对其中豆瓣相关的内容都很关注,最后可能会比较失望,因为比较少的介绍到豆瓣自己造的轮子.另外我给其他 ...
- 《Python Web开发实战》踩地雷记17/3/25
写东西一定要随时保存,昨天晚上又被自己给坑了,悲伤脸. 1.vim 设置vim中Tab的缩进 cd ~vim .vimrc 在文件中输入下面的内容并保存 set tabstop=4 set shift ...
- 《Python Web开发实战》踩地雷记17/3/22
1.包管理 使用pip > sudo apt-get install python-pip -yq 系统自带的pip版本较低,可使用pip的自更新来升级 > sudo pip instal ...
- 《Python Web开发实战》踩地雷记17/3/26
Linux修改文件名:mv [文件名1] [文件名2] 1.Flask-WTF Flask-WTF扩展可以把处理Web表单的过程编程一种愉快的体验.这个扩展对独立的WTForms包进行了包装,方便集成 ...
- 《Python Web开发实战》踩地雷记17/3/23
遇到了配置VagrantFile的问题,详见VagrantFile config.vm.network 问题已经被解决了,所以说有问题多去stack overflow一下.但还是被vagrant搞的烦 ...
- 《Python Web开发实战》踩地雷记17/3/24
今天在创建虚拟环境的时候,执行> virtualenv venv 脚本目录一直被创建在/home/shitfly/venv这个目录下面,折腾半天,发现是在virtualenv定制化的时候EXTR ...
- 《Python Web开发实战》踩地雷记17/3/21
1.安装VirtualBox 直接在官网下载 2.使用Vagrant安装 直接在官网下载安装 下载使用笔者打包好的Box,名字后缀加.box,克隆笔者的Vagrantfile. 创建一个SSH密钥用于 ...
- pythonweb开发-手把手教你写网站:Python WEB开发技术实战
摘要:本文详细介绍了Python WEB开发的基础入门.以一个博客站点的开发为例讲解了基于Django框架开发WEB站点的全过程.通过本文的学习可以快速掌握基于Django的Python WEB的开发 ...
- python web-手把手教你写网站:Python WEB开发技术实战
摘要:本文详细介绍了Python WEB开发的基础入门.以一个博客站点的开发为例讲解了基于Django框架开发WEB站点的全过程.通过本文的学习可以快速掌握基于Django的Python WEB的开发 ...
最新文章
- 学建筑要学哪些计算机绘图,建筑学专业学CAD买什么书好?
- 2018.11.09 codeforces487E. Tourists(tarjan+树链剖分)
- 前端学习(1298):gulp使用
- DataTable类(MSDN)
- 第二期!团队开发spring会议~day8
- 虚拟机开机时出现Press ESC in 5 seconds to skip startup.nsh, any other key to continue问题的解决办法
- 成功通过PMP认证考试的七大要点
- 逆向破解crackme简要分析
- Excel Video Game Sales视频游戏销售分析
- matlab伴随矩阵怎么表示,怎样用Matlab求矩阵的伴随矩阵
- CS229 Lecture 20
- 石墨文档网页视频链接批量保存到百度网盘
- React中setState的怪异行为 ——setState没有即时生效
- codeforce 1395总结
- 数学知识复习:三重积分
- 替换数据库某个字段中部分字符串
- Python 3.X 用Thinker做任意多边形的缩放图(一)
- 鸿蒙圣墟如何升级快,鸿蒙圣墟华为版
- 做网站时域名应该怎么选择
- 全面解密阿里新零售供应链