flask请求与响应、flask的session、flask的闪现、模板渲染、flask-session插件
一、flask请求与响应
1、request

2、make_response

3、设置cookie

结果:

4、删除cookie

结果:

5、设置请求头

结果:

二、flask的session
导入session,设置session值,设置session_cookie的名字

浏览器访问后

设置session源码

例子:
注意要设置session必须要 配置一个秘钥 app.secret_key
注意:在设置cookie中的 response.set_cookie中的 key 是下图的app.config[SESSION_COOKIE_NAME]
在设置cookie中的 response.set_cookie中的 val 是下图的session大字典的值和秘钥 加密后的东西 (看request.cookies)
下图把request.cookie改成request.cookies

三、flask-session ( 第三方插件)
1、安装:pycharm终端
命令:flask-session
2、把session存进redis数据库
方式一:导入 RedisSessionInterface


进 RedisSessionInterface看源码

sid = d88698e9-............
redis 表示 链接数据库的管道
key_prefix表示给 session设置前缀
use_signer 表示签名 默认是False,如果设为True 则需要写app.secret_key
permanent 表示 有效期(如果这个值为True,表示关闭浏览器,不失效,如果为Fasle,表示关闭浏览器,session就失效)
取session

保存session

save_session的结果

方式二 导入Session

看源码
Session源码:::
class Session(object): def __init__(self, app=None): self.app = app if app is not None: self.init_app(app) def init_app(self, app): app.session_interface = self._get_interface(app) def _get_interface(self, app): config = app.config.copy() config.setdefault('SESSION_TYPE', 'null') config.setdefault('SESSION_PERMANENT', True) config.setdefault('SESSION_USE_SIGNER', False) config.setdefault('SESSION_KEY_PREFIX', 'session:') config.setdefault('SESSION_REDIS', None) config.setdefault('SESSION_MEMCACHED', None) config.setdefault('SESSION_FILE_DIR', os.path.join(os.getcwd(), 'flask_session')) config.setdefault('SESSION_FILE_THRESHOLD', 500) config.setdefault('SESSION_FILE_MODE', 384) config.setdefault('SESSION_MONGODB', None) config.setdefault('SESSION_MONGODB_DB', 'flask_session') config.setdefault('SESSION_MONGODB_COLLECT', 'sessions') config.setdefault('SESSION_SQLALCHEMY', None) config.setdefault('SESSION_SQLALCHEMY_TABLE', 'sessions') if config['SESSION_TYPE'] == 'redis': session_interface = RedisSessionInterface( config['SESSION_REDIS'], config['SESSION_KEY_PREFIX'], config['SESSION_USE_SIGNER'], config['SESSION_PERMANENT']) elif config['SESSION_TYPE'] == 'memcached': session_interface = MemcachedSessionInterface( config['SESSION_MEMCACHED'], config['SESSION_KEY_PREFIX'], config['SESSION_USE_SIGNER'], config['SESSION_PERMANENT']) elif config['SESSION_TYPE'] == 'filesystem': session_interface = FileSystemSessionInterface( config['SESSION_FILE_DIR'], config['SESSION_FILE_THRESHOLD'], config['SESSION_FILE_MODE'], config['SESSION_KEY_PREFIX'], config['SESSION_USE_SIGNER'], config['SESSION_PERMANENT']) elif config['SESSION_TYPE'] == 'mongodb': session_interface = MongoDBSessionInterface( config['SESSION_MONGODB'], config['SESSION_MONGODB_DB'], config['SESSION_MONGODB_COLLECT'], config['SESSION_KEY_PREFIX'], config['SESSION_USE_SIGNER'], config['SESSION_PERMANENT']) elif config['SESSION_TYPE'] == 'sqlalchemy': session_interface = SqlAlchemySessionInterface( app, config['SESSION_SQLALCHEMY'], config['SESSION_SQLALCHEMY_TABLE'], config['SESSION_KEY_PREFIX'], config['SESSION_USE_SIGNER'], config['SESSION_PERMANENT']) else: session_interface = NullSessionInterface() return session_interface
方式一和方式二 运行会出错:redis.exceptions.AuthenticationError: Authentication required.
解决:加上密码 redis.Redis(host='localhost',port=6379,password=123)

四、flask的闪现:同一页面,同次请求可以多次
1、什么是闪现
就像seesion一样,也是一个页面。如果另一个页面调用了这个页面,不管在哪个页面调用的,只要调用一次,就清空了
2、闪现的作用
做信息处理
例子:假设,a页面做操作,产生了信息。希望在b页面获取 ,但是不知道用户在什么时候去访问b页面,但是只要用户一旦访问b页面就可以显示出来
注意:秘钥必须 配置。

结果

进flash看源码

进get_flashed_messages看源码

get_flashed_messages()方法中的 参数
flash() 中的参数

message 表示设置消息的,
category 表示给消息分类,如果不传默写用”message“
with_categories=True 表示 消息是否要带上分类信息
category_filter=["渣男"] 表示 对消息进行过滤,取指定的分类消息

五、模板渲染

index.html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1> 我是html</h1> <table> {% for k,v in user.items() %} user 是从后端传过来的 <tr> <td>{{ k }}</td> <td>{{ v.name }}</td> <td>{{ v['name'] }}</td> <td>{{ v.get('name') }}</td> <td>{{url_for("index")}}</td> url_for 是反向解析拿到路由 </tr> {% endfor %} </table> <div>{{name}}</div> {{ }} 是模板语法,name是从后端传过来的 {% if name == "jason" %} <h1>is sb</h1> {% else %} <h1>水哥</h1> {% endif %} {{ ht|safe}} safe 是告诉前端 后端的html是安全的,可以渲染 ht是后端传的html原生语言 {{ht1("jason","tank")}} ht1 是后端传的函数 jason、tank 是实参 </body> </html>
Markup 表示 把后端的html语言做处理。注意:下面的arg、tank 是形参。只是把函数方法传到了index.html文件中。实参在index.html文件中设置的

1 如何启动flask
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
pass
if __name__ == "main":
app.run()
2 flask的四剑客
2.1 直接返回字符串
2.2 render_template("html页面")
2.3 redirect 页面跳转
2.4 jsonify 返回json
3 配置文件
3.1 直接给app属性赋值 只能给app.debug和app.secret_key配置
3.2 给app.config["DEBUG"]等设置属性
3.3 文件的形式给flask作配置,app.config.from_pyfile("settings.py"),这个和django一样
3.4 以类的形式给flask作配置,app.config.from_object("setting.Test"),表示setting文件中Test为配置。推荐使用这样
4 路由本质
4.1 我们可以有两种方式配置路由,第一种是装饰器的形式@app.route("/"),第二种,app.add_url_rule("/",view_func=响应函数函数对象)
4.2 路由种的参数之rule:就是路由,他作有名分组,@app.route("/<int:nid>"),响应函数的接收这个参数必须和nid一致
4.3 路由参数之endpoint,用于反向解析的,和以不传,如果不传就是用响应的函数名,做为反向的。
4.4 如何做反向解析,url_for(endpoint),如果用"/<int:nid>"那我们写url_for("index",nid=111)
4.5 路由参数之view_func:表示的是响应函数的函数对象
4.6 路由参数之methods,该路由可以允许哪些请求方法请求
5 请求与响应
5.1 请求,所有的请求都要从flask种导入request.所有请求的东西都在request
5.2 响应相关,把flask的四剑客传到make_response(四剑客),得到一个response对象,我们就可以对response设置请求头,设置cookie。
6 模板渲染
渲染模板语言和django很像,都是用{{}},{%%},
注意点:1 flask给模板传值,render_template("index.htm",user=user,name=name)
2 flask的模板语言支持对函数的调用。for 循环的循环对象,再py中要加括号的,模板语言中也要加括号。
3 显示原生的html 如果是管道符 html|safe,如果是后端处理,就是用Markup
7 session
7.1 全局导入session,把session,当字典存值,取就当字典取值
7.2 原理之存session
当响应要返回给客户端时候,会调用sesssion_interface中的save_session方法。把全局session字典做加密得到val,然后将这个val设置到cookie中。cookie的键为配置文件中的session_cookie_name,值就是我们session字典加密得到的结果。
7.3 原理之取session
当flask接收到请求的时候,会调用sesssion_interface中的open_session方法,该方法中从cookie中取键为配置文件中session_cookie_name的cookie值,得到这个值以后呢,做解密。然后赋值给全局的session字典。这样我们就可以取到之前flask设置session。
7.4 注意。用session必须配置app.secret_key="随便"
8 闪现
8.1 要用必须导入flash,get_flashed_messages,
8.2 flash 用于存闪现的值。他有两个参数,1 messsage,用来存储信息 2 category ,用于给信息分类,该参数可以不传,不传就是分类为”messsage“
8.3 get_flashed_messages 用是用来取闪现的值,他也有两个参数:1 with_category,拿到的结果是否需要带上分类名称,2 category_filter 是用来过滤我要取哪个分类下的信息。当然这个两个都是可选的。
注意点:
1 设置flash,必须设置app.secret_key="随便",因为flash是基于session的。
2 闪现的值,不同的请求中只能取一次,当然再同一请求内是可以获取多次的。
```

浙公网安备 33010602011771号