flask之请求响应、session、闪现及请求拓展等相关内容-141

1 请求响应

from flask import Flask,make_response,jsonify
from flask import request
from flask import render_template
from flask import redirect
from flask import make_response

app = Flask(__name__)
from werkzeug.datastructures import CombinedMultiDict
app.debug=True
@app.route('/login.html', methods=['GET', "POST"])
def login():
   # print(type(request.values['name'])) # post和get提交的数据总和 还是个字典
   # print(request.full_path) # 全路径
   # print(request.url)     # 带数据
   # print(request.base_url) # 带域名
   # print(request.files)   # 等同于django中的request.FILES
   # 请求相关信息
   # request.method 提交的方法
   # request.args get请求提及的数据
   # request.form   post请求提交的数据
   # request.values post和get提交的数据总和
   # request.cookies 客户端所带的cookie
   # request.headers 请求头
   # request.path     不带域名,请求路径
   # request.full_path 不带域名,带参数的请求路径
   # request.script_root
   # request.url           带域名带参数的请求路径
   # request.base_url 带域名请求路径
   # request.url_root     域名
   # request.host_url 域名
   # request.host 127.0.0.1:500
   # request.files
   # obj = request.files['the_file_name']
   # obj.save('/var/www/uploads/' + secure_filename(f.filename))



   # 响应相关信息
   # return "字符串"
   # return render_template('html模板路径',**{})
   # return redirect('/index.html')
   # return jsonify({'k1':'v1'})

   # response = make_response(render_template('index.html'))
   # response是flask.wrappers.Response类型
   # response.delete_cookie('key')
   # response.set_cookie('key', 'value')
   # response.headers['X-Something'] = 'A value'
   # return response

   # res=make_response('内容xxx') # 响应对象
   # res=make_response(render_template('index.html')) # 响应对象
   res=make_response(jsonify({'name':'lqz'})) # 响应对象
   res.set_cookie('name','lqz')
   # 向响应头中加东西
   res.headers['xyt']='qsb'

   return res


if __name__ == '__main__':
   app.run(port='8080')

 

2 session及源码分析

1 第一步必须配置秘钥
2 全局导入session对象
3 赋值:sesion['key']=value
4 取值:session['key']
5 数据加密以后,放到了cookie中----(token)
1 源码分析执行流程
2 请求来了在open_session中取出cookie,反解数据,包装成session---》视图函数中使用session
3 只要session修改了,请求走了---》save_session---》把session加密,放到cookie中,返回给前端
4 不同浏览器,cookie不同(你的淘宝,同一个浏览器只能登陆一个用户)




回想django中的session如何实现的?
-原理一模一样,它在哪写的,在中间件中,process_request和process_response

 

3 闪现

1 一些数据,放在某个位置,下次请求再取出来,取完就没了(flash)
2 访问index--》name=lqz,放在某个位置
3 下次访问order---》把这个数据取出来
4 放到session中可以吗?

5 本质原理:闪现是基于session的

6 使用
-设置 flash('aaa')
 -取值:get_flashed_message()
 
7 分类
-设置:flash('超时错误',category="x1")
-取值:data = get_flashed_messages(category_filter=['x1'])

 

4请求扩展(django中中间件)


# 请求扩展(等同于django中的中间件,在请求进入视图函数之前,和离开视图函数之后执行一些功能)
# before_request:请求来之前执行(可以加多个,从上往下执行,等同于中间件的process_request)
# after_request:请求走之后(可以加多个,从下往上执行,等同于以中间件的process_response)
# before_first_request:项目运行后的第一次会执行它(初始化的工工作)
# @app.teardown_request:出错也会走,记录日志
# @app.errorhandler(404):状态码是响应的,就会触发它的执行
#@app.template_global() # 全局函数,在模板中直接使用
# @app.template_filter() # 全局过滤器,在模板中直接使用
from flask import Flask,request,render_template
from flask.views import MethodView
app = Flask(__name__)
app.debug=False
# @app.before_request
# def before():
#     #取出访问者的ip,记录一下
#     print(request.path)
#     print('我执行了')
#     # return '回去' # 直接回去了,等同于django中return Response对象
# @app.before_request
# def before2():
#     print('我执行了2222')


# @app.after_request
# def after(response):
#     print('我走了')
#
#     print(response)
#     # response.headers['sss']='sss'
#     #设置cookie
#     return response
# @app.after_request
# def after2(response):
#     print('我走了22222')
#     return response



# @app.before_first_request
# def first():
#     print('我的第一次给了这个地址',request.environ.get('REMOTE_ADDR'))

# @app.teardown_request # 响应走的时候,错误也会走,记录错误日志,前提是debug为false
# def ter(e):
#     print('我一直走')
#     print(e)


# @app.errorhandler(404)
# def error_404(arg):
#     return "404错误了"
#     # return render_template('好看的模板')

# @app.errorhandler(500)
# def error_500(arg):
#     return "500错误了"


# 6 template_global 定义全局函数,直接在模板中使用
@app.template_global()
def sb(a1, a2):
   return a1 + a2
#{{sb(1,2)}}



# 7 template_filter 过滤器、
@app.template_filter()
def db(a1,a2,a3,a4):
   return a1 + 100+a2+a3+a4
#{{ 1|db(2,3)}}



@app.route('/')
def hello_world():
   print('我是视图函数')
   return render_template('index.html',a=100)



if __name__ == '__main__':
   app.run(port=8080)

 

 

 

 

原文地址:https://www.cnblogs.com/usherwang/p/14470921.html