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相关推荐

  1. 如何评价python知乎_如何评价《Python Web开发实战》?

    我先说一个「为什么给人没有太多实战的感觉」的问题吧.我这本书借着「豆瓣」这个title出版,相信很多人对其中豆瓣相关的内容都很关注,最后可能会比较失望,因为比较少的介绍到豆瓣自己造的轮子.另外我给其他 ...

  2. 《Python Web开发实战》踩地雷记17/3/25

    写东西一定要随时保存,昨天晚上又被自己给坑了,悲伤脸. 1.vim 设置vim中Tab的缩进 cd ~vim .vimrc 在文件中输入下面的内容并保存 set tabstop=4 set shift ...

  3. 《Python Web开发实战》踩地雷记17/3/22

    1.包管理 使用pip > sudo apt-get install python-pip -yq 系统自带的pip版本较低,可使用pip的自更新来升级 > sudo pip instal ...

  4. 《Python Web开发实战》踩地雷记17/3/26

    Linux修改文件名:mv [文件名1] [文件名2] 1.Flask-WTF Flask-WTF扩展可以把处理Web表单的过程编程一种愉快的体验.这个扩展对独立的WTForms包进行了包装,方便集成 ...

  5. 《Python Web开发实战》踩地雷记17/3/23

    遇到了配置VagrantFile的问题,详见VagrantFile config.vm.network 问题已经被解决了,所以说有问题多去stack overflow一下.但还是被vagrant搞的烦 ...

  6. 《Python Web开发实战》踩地雷记17/3/24

    今天在创建虚拟环境的时候,执行> virtualenv venv 脚本目录一直被创建在/home/shitfly/venv这个目录下面,折腾半天,发现是在virtualenv定制化的时候EXTR ...

  7. 《Python Web开发实战》踩地雷记17/3/21

    1.安装VirtualBox 直接在官网下载 2.使用Vagrant安装 直接在官网下载安装 下载使用笔者打包好的Box,名字后缀加.box,克隆笔者的Vagrantfile. 创建一个SSH密钥用于 ...

  8. pythonweb开发-手把手教你写网站:Python WEB开发技术实战

    摘要:本文详细介绍了Python WEB开发的基础入门.以一个博客站点的开发为例讲解了基于Django框架开发WEB站点的全过程.通过本文的学习可以快速掌握基于Django的Python WEB的开发 ...

  9. python web-手把手教你写网站:Python WEB开发技术实战

    摘要:本文详细介绍了Python WEB开发的基础入门.以一个博客站点的开发为例讲解了基于Django框架开发WEB站点的全过程.通过本文的学习可以快速掌握基于Django的Python WEB的开发 ...

最新文章

  1. 学建筑要学哪些计算机绘图,建筑学专业学CAD买什么书好?
  2. 2018.11.09 codeforces487E. Tourists(tarjan+树链剖分)
  3. 前端学习(1298):gulp使用
  4. DataTable类(MSDN)
  5. 第二期!团队开发spring会议~day8
  6. 虚拟机开机时出现Press ESC in 5 seconds to skip startup.nsh, any other key to continue问题的解决办法
  7. 成功通过PMP认证考试的七大要点
  8. 逆向破解crackme简要分析
  9. Excel Video Game Sales视频游戏销售分析
  10. matlab伴随矩阵怎么表示,怎样用Matlab求矩阵的伴随矩阵
  11. CS229 Lecture 20
  12. 石墨文档网页视频链接批量保存到百度网盘
  13. React中setState的怪异行为 ——setState没有即时生效
  14. codeforce 1395总结
  15. 数学知识复习:三重积分
  16. 替换数据库某个字段中部分字符串
  17. Python 3.X 用Thinker做任意多边形的缩放图(一)
  18. 鸿蒙圣墟如何升级快,鸿蒙圣墟华为版
  19. 做网站时域名应该怎么选择
  20. 全面解密阿里新零售供应链

热门文章

  1. 【C#设计模式】8.装饰模式(Decorator Pattern)【结构型】
  2. 罗斯蒙特温度变送器的分析
  3. 基于opencv+python实现数独
  4. 做一个支持图形界面的操作系统(zz)
  5. 基于Lua框架下Air103使用U8g2库驱动I2C OLED图像显示
  6. 自媒体人必备的4个素材网站,再也不用担心找不到素材
  7. PostgreSQL数据库共享内存——概览
  8. 疫情之下移动办公成刚需,移动办公工具要“出圈”?
  9. IOS(iphone手机操作系统)
  10. 将反斜杠形式的日期转换为横线格式的日期格式