flask框架(五)视图相关(FBV,CBV实现,请求和响应)

文章目录

            • FBV和CBV
            • FBV实现及视图使用装饰器
            • FBV实现及视图使用装饰器
            • 请求和响应

 

FBV和CBV

FBV:就是一个 url对应一个函数,使用函数处理请求

CBV:就是一个url对应一个类,使用类处理请求
 

FBV实现及视图使用装饰器
# 装饰器
def auth(func):
    def inner(*args, **kwargs):
    	print('before')
    	result = func(*args, **kwargs)
    	print('after')
    	return result
	return inner

# 视图类,继承了View类,需要自己构建dispatch_requests方法
class IndexView(views.View):
    # 请求方法
    methods = ['GET']
    # 给请求加装饰器
    decorators = [auth, ]

    def dispatch_request(self):
        print('Index')
        return 'Index!'

# name=endpoint,反向生成使用'index'
app.add_url_rule('/index', view_func=IndexView.as_view(name='index'))  

或者

# 装饰器
def auth(func):
    def inner(*args, **kwargs):
    	print('before')
    	result = func(*args, **kwargs)
    	print('after')
    	return result
	return inner

# 视图类,继承了MethodView,已经内置dispatch_requests方法
class IndexView(views.MethodView):
    methods = ['GET']
    decorators = [auth, ]

    # 根据请求来选择方法执行
    def get(self):
        return 'Index.GET'

    def post(self):
        return 'Index.POST'

# name=endpoint,反向生成使用'index'
app.add_url_rule('/index', view_func=IndexView.as_view(name='index'))  

 

FBV实现及视图使用装饰器
# 装饰器
def auth(func):
    def inner(*args, **kwargs):
    	print('before')
    	result = func(*args, **kwargs)
    	print('after')
    	return result
	return inner

@app.route('/index')
@auth
def index():
    return "index"

但是,在使用装饰器时需要注意一个很重要的事情。例如

from flask import url_for
# 装饰器
def auth(func):
    def inner(*args, **kwargs):
    	print('before')
    	result = func(*args, **kwargs)
    	print('after')
    	return result
	return inner

@app.route('/index')
@auth
def index():
    return "index"

@app.route('/order')
@auth
def order():
    return "order"

url_for(inner)

# 当你现在需要反向生成URL时
# 上面的@app.route()装饰的是@auth装饰器,其实也就是inner方法
# 反向生成如果@app.route()中endpoint不进行设置,默认值是它所修饰的方法名,也就是inner
# 这时候两个视图的@app.route()全部修饰的是inner,也就是反向生成url时是url_for(inner)
# 两者冲突报错,这时候就需要进行区分,就用到了装饰器functools。如下

from flask import url_for
import functools
# 装饰器
def auth(func):
    @functools.wraps(func)
    def inner(*args, **kwargs):
    	print('before')
    	result = func(*args, **kwargs)
    	print('after')
    	return result
	return inner

@app.route('/index')
@auth
def index():
    return "index"

@app.route('/order')
@auth
def order():
    return "order"

url_for(index)
url_for(order)

# 这儿在装饰器中使用@functools.wraps()装饰内层函数。目的是让inner方法继承所有的func的原信息
# 也就是说@app.route()所装饰的函数名不再叫inner,而是index和order

 

请求和响应
from flask import request, jsonify, make_response

# 请求相关信息
request.method   					# 获取请求方式
request.args						# 获取get请求值
request.form						# 获取post请求值
request.json                        # 获取json传值数据
request.values						# 获取所有参数(可代替from和args)
request.cookies						# 获取cookie						
request.headers						# 获取请求头
request.path						# 获取请求文件路径
request.full_path					# 获取请求的路径为unicode,包括查询字符串
request.script_root					# 获取不带尾随斜杠的脚本的根路径
request.url							# 获取全部url:http://127.0.0.1:8000/index/
request.base_url					# 获取域名与请求文件路径
request.url_root					# 获取域名
request.host_url					# http://127.0.0.1:5000/
request.host						# 获取主机及端口号
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 json.dump({
     }) # 相当于下面这个
return jsonify({
     })

# 也可以创建一个response对象,返回内容及相关信息
response = make_response("返回的内容,上面return的内容")
# response是flask.wrappers.Response类型
response.delete_cookie('key')
response.set_cookie('key', 'value')
response.headers['X-Something'] = 'A value'
return response

你可能感兴趣的:(flask,python,flask,web,app)