使用session.get('name')直接从会话中读取name参数的值。和普通的字典一样,这里使用get()获取字典中键对应的值以避免未找到键的异常情况,因为对于不存在的键,get()会返回默认值None。
2.数据库迁移
使用shell注册新用户,commit()时出错,users表没有“email”列
使用dbinit创建迁移仓库,此命令会创建migrations文件夹
migrate子命令用来自动创建迁移脚本
使用dbupgrade把迁移应用到数据库中
3.新增页面流程:
表单:form.py
显示这个表单的模板:register.html
路由:views.py
具体功能实现:model.py
4.python编码
password=PasswordField('password',validators=[Required(),EqualTo('password2',message='Passwordsmustmatch.')])将‘password’换成‘密码’报错:
Python报错:unicodedecodeerrorasciicodeccantdecodebyte0xe5inposition0ordinalnotinrange128
5.test
test_password_setter(test_user_model.UserModelTestCase)...oktest_password_verification(test_user_model.UserModelTestCase)...oktest_valid_confirmation_token(test_user_model.UserModelTestCase)...FAIL
======================================================================FAIL:test_valid_confirmation_token(test_user_model.UserModelTestCase)----------------------------------------------------------------------Traceback(mostrecentcalllast):File"E:\userdata\PycharmProjects\flask_web\tests\test_user_model.py",line47,intest_valid_confirmation_tokenself.assertTrue(u.confirm(token))AssertionError:Falseisnottrue
----------------------------------------------------------------------Ran9testsin9.055s
FAILED(failures=1)
models.py:
defconfirm(self,token):s=Serializer(current_app.config['SECRET_KEY'])try:data=s.loads(token)#解码令牌except:returnFalseifdata.get('confirm')!=self.id:returnFalseself.confirmed=Truedb.session.add(self)returnTrue错误原因:"s.loads(token)"写成了“s.load(token)”
loads()方法:
defload(self,f,salt=None):"""Like:meth:`loads`butloadsfromafile."""returnself.loads(f.read(),salt)
6.蓝本
blueprint把实现不同功能的module分开.
Factoranapplicationintoasetofblueprints.
RegisterablueprintonanapplicationataURLprefixand/orsubdomain.
RegisterablueprintmultipletimesonanapplicationwithdifferentURLrules.