《Flask Web开发》中实现例程中遇到的问题及解决方法记录。
1、python3.5虚拟环境:
1)从Git上克隆源代码:
E:\python3.5>git clone http://github.com/miguelgrinberg/flasky.git **克隆源代码到flasky
E:\python3.5>cd flasky **进入文件夹flasky
E:\python3.5>git checkout 1a **签出1a版本
2)在flasky文件夹中创建虚拟环境:
E:\python3.5\flasky>python –m venv venv ** venv是虚拟环境的名字
3)激活虚拟环境:
E:\python3.5\flasky>venv\Scripts\activate
如果出现表明虚拟环境已激活
4)退出虚拟环境:
<venv>E:\python3.5\flasky>deactivate
2、安装flask:
1)安装flask:
<venv> E:\python3.5\flasky>pip install flask
2)测试是否安装成功:
<venv> E:\python3.5\flasky>python
>>>import flask
>>>exit() **退出python命令行
如果没看到错误提示则成功安装flask。
3、发送邮件的修改:
app.config['MAIL_SERVER'] = 'smtp.163.com'
app.config['MAIL_PORT'] = 25
app.config['MAIL_USERNAME'] = os.environ.get('MAIL_USERNAME')
app.config['MAIL_PASSWORD'] = os.environ.get('MAIL_PASSWORD')
app.config['FLASKY_ADMIN'] = os.environ.get('FLASKY_ADMIN')
设置环境变量:
<venv> E:\python3.5\flasky>set MAIL_USERNAME=*******
<venv> E:\python3.5\flasky>set MAIL_PASSWORD=*******
<venv> E:\python3.5\flasky>set FLASKY_ADMIN=*******@163.com
4、数据库迁移:
1)首先要安装Flask-Migrate:
<venv> E:\python3.5\flasky>pip install flask-migrate
2)将MigrateCommand类使用db命令附加:
修改hello.py:
from flask_migrate import Migrate, MigrateCommand
…
migrate = Migrate(app, db)
manager.add_command(‘db’, MigrateCommand)
3)在迁移数据库之前要用init子命令创建迁移仓库:
<venv> E:\python3.5\flasky>python hello.py db init
4)migrate子命令来自动创建迁移脚本:
<venv> E:\python3.5\flasky>python hello.py db migrate –m “initial migration”
5)更新数据库:
<venv> E:\python3.5\flasky>python hello.py db upgrade
如果第一次执行第4、5两步,其作用和调用db.create_all()方法一样。
6)如果在某个场景中要在User表中增加phone字段,过程如下:
1>修改hello.py中的User表模型,增加phone字段:
Class User(db.Model):
…
id = …
username = …
role_id = …
phone = db.Column(db.String(64)) #这是新增的字段
2>创建迁移脚本:
<venv> E:\python3.5\flasky>python hello.py db migrate –m “add column phone”
可以进migrations/version/XXXXXadd column phone.py这个文件,看到upgrade函数里有了增加字段的sql语句,说明迁移脚本创建成功。
3>更新数据库:
<venv> E:\python3.5\flasky>python hello.py db upgrade
4>查看User表结构,字段是否被增加进去了:
进入shell:
<venv> E:\python3.5\flasky>python hello.py shell
>>>User.phone
如果没有报错说明迁移成功。
5、将Role写入数据库:
在运行第11章的程序之前,至少要在命令行将Role写如数据库一次,否则数据库中的角色表单为空,就不能根据角色得到不同的权限。
使用shell会话将角色写入数据库:
<venv> E:\python3.5\flasky>python hello.py shell
>>>Role.insert_roles()
>>>Role.query.all()
[<Role u’Administrator’>, <Role u’User’>, <Role u’Moderator’>]
写入之后就可以正常执行11章的程序了。还要注意设置环境变量:
MAIL_USERNAME、MAIL_PASSWORD、FLASKY_ADMIN
6、区分开发环境与生产环境的依赖包:
ForgeryPy是一个可以自动生成虚拟信息的Python包,可以用pip进行安装:
<venv> E:\python3.5\flasky>pip install forgerypy
ForgeryPy在这里只是为了在开发过程中进行调试,所以并不是这个程序的依赖,为了区分生产环境的依赖与开发环境的依赖,可以把文件requirements.txt换成requirements文件夹,他们分别保存不同环境中的依赖,在这个文件夹中我们可以创建一个dev.txt文件,列出开发过程中所需的依赖,再创建一个prod.txt 文件,列出生产环境所需的依赖。由于两个环境所需的依赖大部分是相同的,因此可以创建一个common.txt 文件,在dev.txt和prod.txt 中使用-r 参数导入。如dev.txt中的内容如下:
-r common.txt
ForgeryPy==0.1
7、生成虚拟用户和博客文章:
在安装了ForgeryPy包之后,就可以生成虚拟用户和虚拟博客文章了。
首先,需要在User模型和Post模型中增加类方法,用来产生虚拟用户和文章:
在app/models.py文件中增加如下代码:
class User(UserMixin, db.Model):
#...
@staticmethod
Def generate_fake(count=100)
from sqlalchemy.exc import IntegrityErro
from random import seed
import forgery_py
seed()
for i in range(count):
u=User(email=forgery_py.internet.email_address(),
username= forgery_py.internet.user_name(True),
password= forgery_py.lorem_ipsum.word(),
confirmed=True,
name= forgery_py.name.full_name(),
location= forgery_py.lorem_ipsum.sentence(),
member_since= forgery_py.date.date(True))
db.session.add(u)
try:
db.session.commit()
except IntegrityError:
db.session.rollback()
class Post(db.Model):
#...
@staticmethod
def generate_fake(count=100):
from random import seed, randint
import forgery_py
seed()
user_count=User.query.count()
for i in range(count):
u=User.query.offset(randint(0, user_count - 1)).first()
p=Post(body=forgery_py.lorem_ipsum.sentences(randint(1, 3)),
timestamp=forgery_py.date.date(True),
author=u)
db.session.add(p)
db.session.commit()
在python shell中利用新添加的方法可以轻易生成大量虚拟用户和文章:
<venv> E:\python3.5\flasky>python manage.py shell
>>>User.generate_fake(100)
>>>Post.generate_fake(100)
8、支持富文本文章:
PageDown:使用JavaScript实现的客户端Markdown到HTML的转换。
Flask-PageDown:为Flask包装的PageDown,把PageDown集成到Flask-WTF表单中。
Markdown:使用Python实现的服务器端Markdown到HTML的转换程序。
Bleach:使用Python实现的HTML清理器。