由fliter引发的思考
对于Python内置的一些函数例如:filter
,map
,reduce
这些在代码中使用较少。这些高效的函数有时可以简化很多代码,以后注意要多使用。
关于SQLAlchemy
的一个基类问题
我们可以创建一个基类,里面定义一些需要所有模型都要有的一些字段
1 | class Base(db.Model): |
这样其他的模型创建只要继承该基类就好了。‘
一个由字典创建对象的快速方法。
1 | for key, value in attrs.items(): |
这里要求字典的key和模型类的属性是相同的
1. Python属性描述符实现getter和setter
通过属性描述符我们可以对模型的属性进行读写操作,以及读写操作前的预处理。
例如我们在数据库中保存用户密码的时候,并不是希望保存用户输入的明文密码,而是希望加密后的密码,这样我们可以使用属性描述符操作。
1 | class User(UserMixin, Base): |
如上面代码中,我们将用户的原始输出密码raw
加密后保存到用户模型中。
利用属性描述符我们可以实现属性的预处理,将属性设置为只读或者只写等。
2. WTForms的自定义验证器
我们之前学过WTForms,但是没写一个自定义字段验证器,下面就是一个自定义的验证器
1 | class RegisterForm(Form): |
自定义验证器以validate
开头,传入的参数就是对应的属性,使用field.data
获得具体的值。自定义验证器无需传入到validators
中,会自动生效。
3. 在视图函数之间使用redirect进行路由跳转
我们在不同视图函数之间想要实现路由跳转,需要使用redirect。
比如我们在注册成功之后跳转到登录页面。
1 | redirect(url_for('web.login')) |
4. 什么是cookie
我们的服务器会生成很多键值对的值,这些值包含在response
中返回到浏览器,浏览器会存储起来。被浏览器存储起来的这些键值对就是cookie
.我们可以给cookie
设置有效期等特性。
cookie
失效一般有两种原因:有效期过期,浏览器关闭。
在flask
中如何在响应中加入cookie
呢?
1 | response = make_response('Hello') |
既然浏览器可以保存服务器返回的一些数据,我们可以在服务器生成一些票据,返回给浏览器,这样浏览器就能在票据没有过期的情况下,免登陆访问服务器。
在flask中我们可以使用check_password_hash
比较加密的密码和原生密码。
1 | check_password_hash(数据库密码,用户输入密码) |
5. 使用Flask-Login插件管理登录
在flask中如果我们手动去管理cookie
会很麻烦,我们可以使用flask-login
实现登录管理
如何使用呢?
1. 实例化
如同其他插件一样,我们新的插件都要进行实例化操作
1 | from flask_login import LoginManager |
2. 使用login_user登录
登录的实际是生成令牌保存到cookie
中,我们使用login_user
是先登录
1 | from flask_login import login_user |
这里我们传入的参数是我们定义的用户模型的实例化,实际保存到cookie
中做用户表示的是用户的id
,那flask-login
是如何知道哪个字段属性代表id
呢?
这就需要我们在用户模型中创建一个函数,在这个函数中我们需要返回表示用户身份的字段
1 | def get_id(self): |
除了这一个方法,flask-login
还需要我们定义其他几个方法,我们可以通过用户模型继承UserMixin
来简化继承,这样我们就可以不用再定义这些方法了。
1 | from flask_login import UserMixin |
注意:当标识用户身份的主键不是
id
字段的时候,同样需要重写get_id
方法,然后返回唯一标识
完成上面配置后,再登录的话就会生成令牌键值对(用户的id)保存到浏览器的cookie
中。
3. 访问权限控制
我们上面已经完成了flask-login
的配置,对于一些需要登录才能访问的页面,我们可以使用login_required
装饰器来完成。
在使用login_required
之前我们还需要为插件编写一个函数
在用户模型模块
1 | from . import login_manager |
上面的函数是在我们调用current_user
的时候,确保是当前用户模型的实例化。
1 | from flask_login import current_user |
完成后直接是视图函数上加上装饰器
1 |
|
我们可以告诉flask-login
插件我们的登录页面是哪个,可以在用户未登录的情况下,直接重定向到登录页面。
我们在实例化flask-login
插件的时候加入下面的配置。
1 | # 注册login模块 |
当用户在某个页面未登录跳转到登录跳转到登录页面,然后登录成功后,可以使用下面代码返回到之前的页面。
1 | # flask_login插件会记录为登录页面的url 登录后直接重定向到之前的页面 |
判断一个用户是否登录
1 | current_user.is_authenticated |
登出
1 | from flask_login import logout_user |