按章节顺序来吧 = - =
第二章:
通过app.app_context()激活程序上下文才可以获得g, currrent_app,request,session等……
路由映射保存于app.url_map中,阔以直接开shell查看。
第三章:
url_for(),接收端点名(app.url_map中的字符串端点名),生成链接,_external参数控制绝对地址或相对地址。
第四章:
默认情况下,Flask-WTF能保护所有表单免受跨站请求伪造(Cross-Site Request Forgery,CSRF)的攻击。为了实现CSRF保护,Flask-WTF需要程序设置一个密匙。Flask-WTF使用这个密匙生成加密令牌,再用令牌验证请求中表单数据的真伪。设置密匙的方法app.config['SECRET_KEY'] = ‘you'll never guess'。app.config对象提供了一些方法,可以从文件或环境中导入配置值(看了这么多遍都没有认识到这点……第7章原来就是用app.config对象的方法导入配置的T T),密匙在环境中导入会更安全?
重定向后POST请求数据丢失,所以程序需要保存相关数据,所以可以将数据储存在用户会话session中,在请求之间“记住”数据。“默认情况下,session保存在客户端cookie中,使用SECRET_KEY(进行序列化的加密?)进行加密签名,如果修改了cookie中的内容,签名失效,session失效。
url_for()函数的必须指定参数是端点名,即路由的内部名字。默认情况下是相应师徒函数的名字(不默认情况下呢? =-= !)
第五章:
在Flask-SQLAlchemy中,数据库由URL指定。流行的数据库引擎URL格式如下:
MySQL mysql://username:password@hostname/database
Postgres postgresql://username:password@hostname/database
SQLite(Unix) sqlite:///absolute/path/to/database
SQLite(Windows) sqlite:///c:absolute/path/to/database
按照如上格式配置,不出意外,应该除了SQLite其他应该会配置失败吧= 。=反正劳资配置mysql失败了。其实格式也没有问题,底层原理不清楚,猜测应该还是接口问题。mysql配置(ubuntu的话需要安装一些Pymysql,python mysqldb,什么乱七八糟的东西我都下了,当然还是未能按如上格式配置成功,因为还有一个叫flask-mysql的东西!!!!搞得我都不知道哪个起作用了...总的来说就是flask-mysql最重要....不装不能按如上的mysql格式配置,不过听说有mysql+mysqldb://username:password@hostname/database可以成功的,强迫症表示不试,一定要按原格式来!!也就装了大半天嘛……= - =
记个例子:
class Role(db.Model):
user = db.relationship('User', backref='role)
class User(db.Model):
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
User作为主表被添加了一个外键role.id, 此列接收了两个参数(db.Integer(声明列类型)和 db模块的外键ForeignKey类,接受关联表的主键roles.id做参数值)
Role模型直接就定义了一个user,此属性给出与role相关联的user名单……,relationship函数接收主表的类名User,并backref反击了一个role名单的属性给User???
Role.query_filter_by(name='user')返回一个query查询对象,不是model对象,所以不能使用models的方法,Role.query_filter_by(name='user').first()返回的才是model对象= =。
flask-migrate拓展,很有用,总结用法下来就是,没有初始化迁移仓库的情况(app根目录下无migrations)下,创建一个migrations文件夹(python app.py db init)。有migrations之后models(表模型)有更改的话,python app.py db migrate 会创建一个更新的脚本文件,有了更新的脚本文件之后,执行python app.py db upgrade就等于使用migrate生成的更新脚本了。简述:(生成安装包:migrations——>创建更新文件 migrate——>更新 upgrade)
第六章:
呵呵。
通过flask-mail拓展发送邮件。使用的端口为:25,使用的是smtp.qq.com(需要到qq邮箱中开启相关服务,需要声明的是,开启服务后用拓展发邮箱变成——> qq账号 + 授权码。 ————授权码在开服务后会给出,忘记了可以申请重新给出。
为了保护账号信息,让脚本从环境中导入敏感信息(os.environ.get('敏感信息’))比较好。
ubuntu下为 sudo vim /etc/profile ,然后将需要导入的变量以: export mail_username=我的qq账号 export mail_password=我的qq授权码, 然后 source /etc/profile即可。需要声明的是以上表达式需要严格遵守,不要发生 export mail_username = 我的qq账号,等号左右有空格的良好编程习惯,不然你会导入了一个寂寞。
第七章:
config中的init_app方法不知道咋整的,直接就调用完成初始化了……
这个app.config对象也是很给劲,直接app.config.from_object(config[config_name])就导入配置了。
app程序包中的构造文件建立一个create_app工厂函数,封印了需要初始化拓展的过程。
各程序包子包构造文件中创建了一个蓝图用来修饰路由,将蓝图注册到create_app工厂函数中可以将蓝图关联到app。a
第八章:
将werkzeug.security提供的生成散列值与验证的函数写入模型类方法中。
@property装饰password将其设置为只写属性,@property.setter装饰函数确保将写入的password直接转换为password_hash。
更新模型属性,属性大概都是登陆表单所需的吧……
登陆视图功能:1.生成表单,2.验证表单数据(符合验证函数与否),3.根据表单数据获得数据库模型,4.判断模型是否存在and验证密码,5.登入用户——>redirect(request.args.get('next') or url_for('main.index').5.分支 错误用户名 or 密码
注册表单:1.生成带验证函数与符合正则表达式的表单。2.定义了两个validate_开头的方法验证时候有已存在的email和username,会和常规的验证函数一起被调用。
注册视图:1.生成注册表单,2.验证输入(此时就验证了email与username的合法还有重复与否所以下一步可以直接生成模型),3.根据表单提交数据生成user模型,4.db.session.add(user)然后flash状态变化最后重定向。
用户验证:给User模型定义生成与验证token的方法:将app.config['SECERT_KEY']条件填入itsdangerous模快TimedJSONWebSignatureSerializer类生成类实例,调用实例方法dumps({'confirm':self.id})字典序列之后的乱七八糟的长token。
有了生成token的方法之后,在根据注册表单数据生成user模型后就调用模型已定义的generate_confirmation_token方法生成token写入邮件中。一个confirm/<乱七八糟的序列>的链接就包含在发送的邮件中了,点击该链接就会触发匹配路由confirm/<token>映射的视图函数,视图函数判断current_user的confirmed值,验证token是否与自身id一致等。
request.endpoint什么鬼