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. copy一下面试题目
  2. Linux Shell脚本攻略学习总结:一
  3. ZOJ 3822 Known Notation(2014牡丹江Regional K题)
  4. 零基础自学python的建议-python 零基础建议学习吗 学习后工作稳定吗?
  5. 设计模式学习笔记-观察者模式(转)
  6. 如何查看cplex的help文档_用摹客,写出更好的产品文档
  7. SSH原理与运用(一):远程登录
  8. Halcon学习笔记:Halcon标定步骤-3d_coordinates.hdev示例
  9. java判断是否空值
  10. html 给照片添加圆角属性,CSS3新增属性(背景图、边框背景、圆角)
  11. 解决CentOS中无法使用setup命令 -bash:setup: command
  12. c++中*是什么意思_int在python中什么意思
  13. DEV控件ASPxTextBox设置ClientEnabled=false之后出现的问题
  14. LiveCharts 设计使用
  15. kubernetes配置kubeconfig访问集群
  16. 微软新搜索引擎Bing探秘(组图)
  17. 0725(016天 多态复习 java中级-抽象类01)
  18. 帧率(FPS)计算的六种方法总结
  19. emoji表情符号编码大全
  20. 电脑重装系统失败无法开机怎么办如何解决

热门文章

  1. 用python实现skip-gram算法:AAAI-14 accepted papers(NLP)分类任务
  2. Derivation of Doubly Stochastic clustering
  3. 蔚来汽车赴美上市,是自愿还是被逼的?
  4. 淘宝超级钻展怎么做?大神导航,一个神奇的网站,从此开启大神之路!
  5. c语言建筑工地管理系统,C语言课设之建筑工地信息管理系统.doc
  6. allegro无法进行动态覆铜_allegro铺铜不成功
  7. [34期] 一路向北
  8. 在image2lcd图片取模软件使用中遇到的小问题,和解决方法
  9. 什么是编码,什么是解码。原理解读
  10. (完本)成绩处理之大结局~