Flask 视图,中间件
视图
FBV
def index(nid):
"""
请求相关信息 request.method # 请求方式
request.args # get 方式的参数获取
request.form # post 方式的参数获取
request.values
request.cookies
request.headers
request.path # 请求资源路径
request.full_path # 请求全部资源漫画
request.script_root
request.url # 全部请求路径 (带协议带域名)
request.files # 请求文件
obj = request.files['the_file_name']
obj.save('/var/www/uploads/' + secure_filename(f.filename))
"""
dic = {"k1":"v1"}
"""
返回响应体的4种形式
字符串
jsonify
模板
跳转 url
""" # return "index"
# return jsonify(dic)
# return render_template("xxx.html",dic=dic) # 可带数据传递
# return redirect(url_for("index")) # 跳转通过 url_for 反向解析
"""
定制响应头的时候构造响应体用到 make_response
"""
# 如果想设置响应头和回显cookie,就需要用到make_response
# response = make_response(render_template('index.html'))
# response = make_response("字符串")
# response是flask.wrappers.Response类型
# response.delete_cookie('key')
# response.set_cookie('key', 'value')
# response.headers['X-Something'] = 'A value'
# return response
    from flask import make_response,headers,set_cookie
    obj = make_response(jsonify(dic))
    obj.headers["xxxxx"] = ""
    obj.set_cookie("key","value")
    return obj
装饰器实现中间件功能
预备处理视图函数初始状态
@app.route('/index')
def index():
    if not session.get('user'):
        return redirect(url_for('login'))
    return render_template('index.html',stu_dic=STUDENT_DICT)
视图级别加装,比较适用于对少量视图进行处理
import functools
def auth(func):
@functools.wraps(func)
def inner(*args,**kwargs):
if not session.get('user'):
return redirect(url_for('login'))
ret = func(*args,**kwargs)
return ret
return inner @app.route('/index')
@auth
def index():
return render_template('index.html',stu_dic=STUDENT_DICT)
全局级别加装
@app.before_request
def xxxxxx():
if request.path == '/login':
return None if session.get('user'):
return None return redirect('/login')
除了 before_request 以外还有其他特殊装饰器:
1. before_request 谁先定义谁先执行
执行多个 before 的时候如果再中间有返回值,对于after 的执行直接执行最后一次定义的那个 2. after_request 谁后定义谁执行 3. before_first_request 4. template_global 5. template_filter 6. errorhandler
from flask import Flask
app = Flask(__name__) @app.before_request
def x1():
print('before:x1')
return '滚' @app.before_request
def xx1():
print('before:xx1') @app.after_request
def x2(response):
print('after:x2')
return response @app.after_request
def xx2(response):
print('after:xx2')
return response @app.route('/index')
def index():
print('index')
return "Index" @app.route('/order')
def order():
print('order')
return "order" if __name__ == '__main__': app.run()
befor/after_request 示例
from flask import Flask
app = Flask(__name__) @app.before_first_request
def x1():
print('') @app.route('/index')
def index():
print('index')
return "Index" @app.route('/order')
def order():
print('order')
return "order" if __name__ == '__main__': app.run()
before_first_request 示例
@app.errorhandler(404)
def not_found(arg):
print(arg)
return "没找到"
errorhandler 示例
CBV
def auth(func):
def inner(*args, **kwargs):
result = func(*args, **kwargs)
return result
return inner # 继承自views.MethodView 采用CBV写法时,为了简单,都是采用继承MethodView的方式写的
class IndexView(views.MethodView):
# methods = ['POST'] #只允许POST请求访问
decorators = [auth,] #如果想给所有的get,post请求加装饰器,就可以这样来写,也可以单个指定 def get(self): #如果是get请求需要执行的代码
v = url_for('index')
print(v)
return "GET" def post(self): #如果是post请求执行的代码
return "POST" app.add_url_rule('/index', view_func=IndexView.as_view(name='index')) #name指定的是别名,会当做endpoint使用
def auth(func):
def inner(*args, **kwargs):
print('before')
result = func(*args, **kwargs)
print('after')
return result
return inner # 也可以再往上继承自View
class IndexView(views.View):
methods = ['GET']
decorators = [auth, ]
# 如果继承自View,就需要dispatch_request
def dispatch_request(self):
print('Index')
return 'Index!' app.add_url_rule('/index', view_func=IndexView.as_view(name='index')) # name=endpoint
文件上传
客户端
- 必须要在表单中上传
 - 提交方式必须是 post
 - enctype 属性必须是 multipart/form-data
 
<form action="/login" method="post" enctype="multipart/form-data">
上传文件: <input type="file">
</form>
服务端
文件会上传到缓存区, 通过 request.files 获取上传文件
拿到返回值可以调用 save , filename 方法
f = request.file['name']
# f.save('路径')
# f.filename # 得到文件原始名称
f.save('static/' + f.filename) # 如果不存在 static 会报错
此方法在上传重名文件的时候会覆盖, 因此需要自己设定绝不会重名的方式,比如用时间戳
中间件
首先要知道我们利用请求扩展里提供的装饰器也能够做一些中间件的事,我们这里说的是根据flask的源码流程进行自定义方法来实现中间件的操作
具体流程:
app.run会执行werkzeug(第三方WSGI模块)中的run_simple方法,继而执行inner方法,继续执行make_server方法,
make_sever方法就会返回一个BaseWSGIServer对象,主要是起socket,
当有请求过来时就会触发flask的call方法,继而执行wsgi_app方法
利用app.run中的wsgi_app方法可以自定义类,定义的_ _call_ _方法里就可以做一些中间件的事
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
    return 'Hello World!'
class Md(object):
    def __init__(self,old_wsgi_app):
        self.old_wsgi_app = old_wsgi_app
    def __call__(self,  environ, start_response):
        print('开始之前')
        ret = self.old_wsgi_app(environ, start_response)
        print('结束之后')
        return ret
if __name__ == '__main__':
    app.wsgi_app = Md(app.wsgi_app)
    app.run()
Flask 视图,中间件的更多相关文章
- Flask视图函数报fmalformed url rule错误的原因
		
Flask视图函数报fmalformed url rule错误,原因可能是包含中文字符了 把标点符号都重新写一遍英文格式的,可能就不会报这个了
 - Flask的“中间件”
		
特殊装饰器 from flask import Flask,render_template,request app = Flask(__name__) @app.before_request def ...
 - Flask 视图
		
写个验证用户登录的装饰器:在调用函数前,先检查session里有没有用户 from functools import wraps from flask import session, abort de ...
 - flask 视图函数的使用
		
flask框架 视图函数当中 各种实用情况简单配置 1 建立连接 2 路由参数 3 返回网络状态码 4 自定义错误页面 5 重定向 6 正则url限制 和 url 优化 7 设置和获取cookie # ...
 - Flask视图函数与普通函数的区别,响应对象Response
		
视图函数与普通函数看似没什么区别,其实他们的返回值上有着很大的区别. from flask import Flask app = Flask(__name__) @app.route('/hello' ...
 - Flask 视图,模板,蓝图.
		
https://www.cnblogs.com/wupeiqi/articles/7552008.html 1. 配置文件 from flask import Flask app =Flask(__n ...
 - Flask视图函数与模板语法
		
1.Django中的CBV模式  2.Flask中的CBV和FBV def auth(func): def inner(*args, **kwargs): result = ...
 - 3.flask视图进阶
		
1.add_url_rule和app.route原理剖析 from flask import Flask app = Flask(__name__) # 下面是我们定义一个路由和对应视图的常用方法 ' ...
 - 1.flask视图和URL
		
1.第一个flask程序 from flask import Flask ''' Flask这个类是项目的核心,以后很多操作都是基于这个类的对象 注册URL等等,都是基于这个类 ''' app = F ...
 
随机推荐
- WLST Hangs Up Because of Java VM ClassLoader Deadlock
			
APPLIES TO: Oracle WebLogic Server - Version 10.0 to 10.3.6Information in this document applies to a ...
 - 【图解】FlexGrid Explorer 全功能问世
			
前言 在去年的时候,我们推出了FlexGrid Demo,包含了FlexGrid的常用功能,如分组.滚动.冻结.自定义单元格类型.搜索面板.表格过滤器.树形结构.合并单元等,目前我们又在里面添加很多了 ...
 - Bitmap上下合成图片
			
合成两张图片,上下叠加的效果: /** * 把两个位图覆盖合成为一个位图,以底层位图的长宽为基准 * * @param backBitmap 在底部的位图 * @param frontBitmap 盖 ...
 - VMware+centos7克隆多个虚拟机
			
最近在学习Hadoop,需要搭建分布式集群,自己在电脑上安装的VMware+centos7.前期我已经安装好了一个虚拟机,并把apache,jdk等的环境都配置好了,现在需要搭建集群了,所以需要克隆三 ...
 - 通过Visual Studio 2012 比较SQL Server 数据库的架构变更
			
一 需求 随着公司业务的发展,数据库实例也逐渐增多,数据库也会越来越多,有时候我们会发现正式生产数据库也测试数据库数据不一致,也有可能是预发布环境下的数据库与其他数据库架构不一致,或者,分布式数据库上 ...
 - Ubuntu下crontab启动、重启、关闭命令
			
在Ubuntu14.04环境下,利用crontab编写shell脚本程序,定时执行php相关程序.在这个过程中,经常使用到的crontab命令如下: (root权限下) crontab启动:/etc/ ...
 - LeetCode算法题-Second Minimum Node In a Binary Tree(Java实现)
			
这是悦乐书的第285次更新,第302篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第153题(顺位题号是671).给定非空的特殊二叉树,其由具有非负值的节点组成,其中该树 ...
 - OKR源自德鲁克和格鲁夫,跟谷歌是天作之合:4星|《这就是OKR》
			
这就是OKR,[美]约翰杜尔(John Doerr),中信出版社,9787508696881 作者以实习生的身份加入英特尔,跟格鲁夫有交集,见证了格鲁夫在英特尔创立OKR的过程和英特尔使用OKR作为管 ...
 - Python总结(一)
			
从大学开始,就对python有了兴趣,毕业设计就是用python做的一个新闻爬取和关键字提取的程序.然而,毕业之后由于一直没有从事python相关的开发,所以就一直没有再使用,一直停留在偶尔看一些资料 ...
 - springboot操作mongodb
			
springboot操作mongodb 采用MongoRepository操作mongodb springboot版本2.1.2.RELEASE 注意的是:在运行应用程序时,会报错OSS Algori ...