flask之请求与响应、闪现(阅后即焚)、请求扩展(before,after)、中间件、LOCAL对象、偏函数、
1.flask请求与响应
from flask import Flask,request,make_response,render_template
app = Flask(__name__)
@app.route('/login.html', methods=['GET', "POST"])
def login():
# 请求相关信息
# request.method 提交的方法
print(request.method)
# request.args get请求提及的数据
print(request.args)
# request.form post请求提交的数据
print(request.form)
# request.values post和get提交的数据总和
print(request.values)
# request.cookies 客户端所带的cookie
print(request.cookies)
# request.headers 请求头
print(request.headers)
# request.path 不带域名,请求路径
print(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
#返回字符串
#response = make_response("内容")
#response.set_cookie("key","value")
#返回html
response=make_response(render_template("index.html"))
response.headers['X-Something'] = 'sb'
response.delete_cookie('jason')
return response
if __name__ == '__main__':
app.run()
2.闪现
'''
闪现解决的问题:-假设在a页面操作出错,c页面(操作了多少个页面,我不管),跳转到b页面,在b页面显示a页面的错误信息
index页面出现错误,然后在error页面将错误信息抛出,这两个页面之间可以访问多个页面,只要有一次get_flashed_message,那么error就不能打印错误了
'''
from flask import Flask,flash,get_flashed_messages,request
app = Flask(__name__)
#闪现用到session,所以要加上secret_key,否则会报错
app.secret_key = 'dfksdkf'
@app.route('/index')
def index():
flash('超时错误')
flash('价格有误', category='price')
return '这是Index'
@app.route('/error1')
def error1():
return 'ok'
@app.route('/error')
def error():
"""
:return:
"""
data = get_flashed_messages(with_categories=True,category_filter=('price',)) #展示分类名,筛选出分类名叫price的数据
data2 = get_flashed_messages(with_categories=True) #把分类也取出来。
data3 = get_flashed_messages() #分类默认是false
print(data)
print(data2)
print(data3)
#[('price', '价格有误')]
# [('message', '超时错误'), ('price', '价格有误')]
# ['超时错误', '价格有误']
return '这是error'
@app.route('/error2')
def error2():
# 再取一次就取不到了
data = get_flashed_messages()
print('error2', data)
return '这是error2'
if __name__ == '__main__':
app.run()
3.请求扩展
from flask import Flask,request,render_template
app = Flask(__name__)
'''
可以多个请求之前的函数
执行顺序是谁在前面谁先执行
如果前面的before_request有返回值,后面的都不会执行
'''
# @app.before_request
# def sb():
# print(request)
# print("我是请求之前")
# return "我是请求之前1的返回"
#
# #上面有返回值,所以这里就不执行了
# @app.before_request
# def sb1():
# print("我是请求之前2")
# #return "我是请求之前2的返回"
#
#
# '''
# 可以在请求之后添加多个after_request
#
# 执行顺序是谁在前面谁后执行(类似于django中间件的响应顺序,也可以理解为栈,后进先执行)
# before_request对我的after_request没有影响,
# 有没有返回值都会执行
#
#
#
#
# '''
# @app.after_request
# def process_response1(response):
# print('process_response1 走了')
# return response
#
# @app.after_request
# def process_response2(response):
# print('process_response2 走了')
# return response
#
#
# #第一次请求之前打印,之后就不打印了
# @app.before_first_request
# def first():
# print("我的第一次")
'''
无论有没有异常都会执行,有异常会把异常传递进来
'''
@app.teardown_request
def ter(e):
print(e) #响应函数里面的a报错:name 'a' is not defined,会被捕捉出来
print("我是异常")
'''
@app.errorhandler(要捕获的错误码)
'''
@app.errorhandler(500) # 服务器出错,就会传给前台 500错了,可以导一个render_template,渲染一个页面
def error_404(arg):
print(arg)
return "500错误了"
#html页面,不用传值就可以直接传过去
@app.template_global()
def sb(a1, a2):
return a1 + a2
@app.template_filter()
def db(a1, a2, a3):
return a1 + a2 + a3
@app.route("/")
def index():
print("我是真的响应函数")
# a
return render_template("index.html")
if __name__ == '__main__':
# app.__call__()
app.run()
4.中间件
'''
中间件就是在请求来之前和请求走之后加一些东西
在__call__中的self.wsgi_app之前和之后写,不改源码,直接抽出来重写
'''
from flask import Flask,flash,get_flashed_messages,request
app = Flask(__name__)
class MyMiddleware:
def __init__(self,wsgi_app123):
self.wsgi_app123=wsgi_app123
def __call__(self, environ, start_response):
print("123")
res=self.wsgi_app123(environ, start_response)
print("456")
print(res)
return res
@app.route('/index')
def index():
# request.method
# session['sd']
return "ssdsdsdfsd"
if __name__ == '__main__':
#根据__call__里面的 wsgi_app注释部分,写如下模板的中间件,其中,类名(MyMiddleware是可以重命名的,但是与自己重写的类名要一致)
app.wsgi_app = MyMiddleware(app.wsgi_app) #类加括号,执行__call__方法
#app.run()本质就是执行app.__call__()
# run函数里面的run_simple,然后需要传一个参数self对象,这样加括号,就执行了__call__方法
# app.__call__()
app.run()
5.LOCAL对象
# 不用local
from threading import Thread
import time
cxw = -1
def task(arg):
global cxw
cxw = arg
time.sleep(2)
print(cxw) #取出的全是9
for i in range(10):
t = Thread(target=task,args=(i,))
t.start()
#
# flask中的request就是存在local对象中的,这样多线程请求的时候就不会乱掉了。
#
# 导入的local
from threading import Thread
from threading import local
import time
特殊的对象
cxw = local()
def task(arg):
# 对象.val = 1/2/3/4/5
cxw.value = arg
time.sleep(2)
print(cxw.value)#取出的是0-9,且每刷新一次就会重新赋值,不会出现重复数字
for i in range(10):
t = Thread(target=task,args=(i,))
t.start()
#
# 字典的形式
# 模拟上面Local对象中不会乱的线程的现象。
from threading import get_ident,Thread
import time
storage = {}
def set(k,v):
ident = get_ident() #拿到当前线程的线程id
if ident in storage: #在仓库中就改值,以最新的为准
storage[ident][k] = v
else:
storage[ident] = {k:v} #不在仓库就加进去值
def get(k):
ident = get_ident()
return storage[ident][k]
def task(arg):
set('val',arg)
time.sleep(2)
v = get('val')
print(v)
#在t = Thread 和 set('val', arg)两处打断点,可以看到,循环走完之后,才开始执行任务函数
for i in range(10):
t = Thread(target=task,args=(i,))
print(i)
t.start()
# 面向对象的形式(就是把字典的形式封装成local类,这样使用时生成local对象)
from threading import get_ident,Thread
import time
class Local(object):
storage = {}
def set(self, k, v):
ident = get_ident()
if ident in Local.storage:
Local.storage[ident][k] = v
else:
Local.storage[ident] = {k: v}
def get(self, k):
ident = get_ident()
return Local.storage[ident][k]
#
obj = Local()
def task(arg):
obj.set('val',arg)
v = obj.get('val')
print(v)
for i in range(10):
t = Thread(target=task,args=(i,))
t.start()
# 我们目的是推导出和上面local相同的用法,即对象.val这样,所以就想到.拦截,即__setattr__、__getattr__.
# 下面的代码就是把上面面向对象中的set和get换成__setattr__和__getattr__
from threading import get_ident,Thread
import time
class Local(object):
storage = {}
def __setattr__(self, k, v):
ident = get_ident()
if ident in Local.storage:
Local.storage[ident][k] = v
else:
Local.storage[ident] = {k: v}
def __getattr__(self, k):
ident = get_ident()
return Local.storage[ident][k]
obj = Local()
def task(arg):
obj.val = arg
time.sleep(1)
print(obj.val)
for i in range(10):
t = Thread(target=task,args=(i,))
t.start()
每个对象都有自己的storage
try:
from greenlet import getcurrent as get_ident
except Exception as e:
from threading import get_ident
from threading import Thread
from threading import get_ident,Thread
import time
class Local(object):
def __init__(self): #我们重写了__setattr__,所以这里写了self.storage后,就会调用自己的setattr,然后就调用getattr,一直递归,最后崩掉,故需要调用父类的__setattr__。
object.__setattr__(self,'storage',{})
#self.storage={}
# storage={}
def __setattr__(self, k, v):
ident = get_ident()
if ident in self.storage:
self.storage[ident][k] = v
else:
self.storage[ident] = {k: v}
def __getattr__(self, k):
ident = get_ident()
return self.storage[ident][k]
obj = Local()
obj1=Local()
def task(arg):
obj.val = arg
obj.xxx = arg
print(obj.val)
for i in range(10):
t = Thread(target=task,args=(i,))
# t.start()
6.偏函数
from functools import partial
def test(a,b,c,d):
return a+b+c+d
tes=partial(test,a=1,b=2)
print(tes(c=3,d=4))
# print(tes(3,4))
templates
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1> 我爱我的祖国</h1>
{{sb(1,2)}} <!--直接使用函数-->
{{12|db(1,1)}} <!--直接使用过滤器-->
</body>
</html>
flask之请求与响应、闪现(阅后即焚)、请求扩展(before,after)、中间件、LOCAL对象、偏函数、的更多相关文章
- HTTP协议简介详解 HTTP协议发展 原理 请求方法 响应状态码 请求头 请求首部 java模拟浏览器客户端服务端
协议简介 协议,自然语言里面就是契约,也是双方或者多方经过协商达成的一致意见; 契约也即类似于合同,自然有甲方123...,乙方123...,哪些能做,哪些不能做; 通信协议,也即是双方通过网络通信必 ...
- Http请求与响应格式
原文:http://www.cnblogs.com/z941030/p/4699779.html Http协议对浏览器发出的Request格式以及对Web服务器发出的Response格式有具体的规定. ...
- tornado 03 请求与响应
tornado 03 请求与响应 一.请求与响应 浏览器与服务器之间沟通的到底是什么信息 #服务器在后台一直保持运行着 #浏览器通过URL(路由.地址)发送请求 #服务器接收请求了通过tornado处 ...
- Http请求和响应
Http请求和响应 Http协议对浏览器发出的Request格式以及对Web服务器发出的Response格式有具体的规定. 请求部分由三部分组成: Requset line:请求行,位于第一行 Req ...
- URI、URL、请求、响应、常见状态代码
URI:路径(统一资源标识符,包括本地地址和网络地址) URL是URI的一种子路径, URI范围比URL范围广. URL (Uniform Resource Locator,统一全球资源定位符): 通 ...
- web手工项目04-测试报告的核心内容-HTTP请求和响应-fiddler工具进行抓包
回顾 登录功能测试(需求分析(输入分析,处理分析,输出分析),数据构造,编写用例) 测试点设计思路--扩展(相关业务,特殊角度-分支,异常,逆向) 流程图元素与画法(开始/结束,路径,数据,判定,步骤 ...
- HTTP入门(一):在Bash中curl查看请求与响应
HTTP入门(一):在Bash中curl查看请求与响应 本文简单总结HTTP的请求与响应. 本文主要目的是对学习内容进行总结以及方便日后查阅. 详细教程和原理可以参考HTTP文档(MDN). 本文版权 ...
- Salesforce Integration 概览(二) Remote Process Invocation—Request and Reply(远程进程调用--请求和响应)
本篇参考:https://resources.docs.salesforce.com/sfdc/pdf/integration_patterns_and_practices.pdf 我们在项目中,经常 ...
- ASP.NET Core应用针对静态文件请求的处理[2]: 条件请求与区间请求
通过调用ApplicationBuilder的扩展方法UseStaticFiles注册的StaticFileMiddleware中间件帮助我们处理针对文件的请求.对于StaticFileMiddlew ...
- python爬虫---scrapy框架爬取图片,scrapy手动发送请求,发送post请求,提升爬取效率,请求传参(meta),五大核心组件,中间件
# settings 配置 UA USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, l ...
随机推荐
- ES6 解构 destructuring
解构的作用:简化书写长度,提升开发效率. 解构对象 在开发中我们常用到使用ajax请求数据,并且把数据渲染到页面上.可能这个数据返回的对象或数组.例如返回一个obj{name:'zwq',age:18 ...
- vue-better-scroll实现移动端下拉加载组件
1.下载安装better-scroll npm i -S better-scroll 1.1安装完成之后,打开pacaage.json文件查看,是否有(better-scroll) "dep ...
- Android TitleBar推荐
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/206 Android TitleBar推荐 这段时间在帮别 ...
- simple go web application & 二维码生成 & 打包部署
go语言简易web应用 & 二维码生成及解码 & 打包部署 转载请注明出处: https://www.cnblogs.com/funnyzpc/p/10801476.html 前言(闲 ...
- 导入Jar报错An internal error occurred during: "Building workspace". zip END header not found
百度了好久都没有找到答案,后来新建了一个文件夹,再build path就正常了,不知道为什么
- Appium从入门到实战合集
从今天起,持续更新 想要及时获得更新,请关注微信公众号 教程下载 1.连载01-Appium自我介绍和环境搭建 2.连载02-Appium启动参数配置 3.连载03-Appium入门案例 4.连载04 ...
- Python动态网页爬虫-----动态网页真实地址破解原理
参考链接:Python动态网页爬虫-----动态网页真实地址破解原理
- BZOJ2301/LG2522 「HAOI2011」Problem B 莫比乌斯反演 数论分块
问题描述 BZOJ2301 LG2522 积性函数 若函数 \(f(x)\) 满足对于任意两个最大公约数为 \(1\) 的数 \(m,n\) ,有 \(f(mn)=f(m) \times f(n)\) ...
- [译]Vulkan教程(13)图形管道基础之Shader模块
[译]Vulkan教程(13)图形管道基础之Shader模块 Shader modules Unlike earlier APIs, shader code in Vulkan has to be s ...
- laravel实现多模块
一.这里使用Caffienate Modules 网址:modules maintained by caffeinated 二.根据自己的版本选择包的版本 三.在项目composer.json文件中加 ...