Flask视图
视图 函数装饰器问题 from flask import Flask, redirect app = Flask(__name__) def wapper(func): def in

Flask视图

发布时间:2024-03-19 (2024-03-19)

视图

函数装饰器问题

from flask import Flask, redirect

app = Flask(__name__)


def wapper(func):
    def inner(*args, **kwargs):
        print('before')
        return func(*args, **kwargs)

    return inner


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

这样可以正常访问到视图函数

但是如果有两个视图函数用了装饰器就会报错

原因是函数装饰器装饰之后,两个函数的函数名都变成了inner

而路由的别名都是函数,重复就会报错

解决方法

from flask import Flask, redirect

app = Flask(__name__)
import functools


def wapper(func):

    @functools.wraps(func)
    def inner(*args, **kwargs):
        print('before')
        return func(*args, **kwargs)

    return inner


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


@app.route('/index')
@wapper
def home():
    return 'index'

functools:保留原函数信息

CBV和FBV

第一种

from flask import Flask, views
# 第一种CBV
class IndexView1(views.View):
    methods = ['GET']
    decorators = [wapper, ]  # 给所有方法加装饰器,从前往后执行

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


app.add_url_rule('/index', view_func=IndexView1.as_view(name='index1'))

第二种,根据请求方式的不同

# 第二种CBV
class IndexView2(views.MethodView):
    methods = ['GET']
    decorators = [wapper, ]  # 给所有方法加装饰器

    def get(self):
        print('index')
        return 'Index'


app.add_url_rule('/index', view_func=IndexView2.as_view(name='index1'))

写flask用FBV多一点

请求与响应相关

from flask import Flask
from flask import request  # 请求对象
from flask import render_template  # 返回模板
from flask import redirect  # 重定向
from flask import make_response  

app = Flask(__name__)


@app.route('/login.html', methods=['GET', "POST"])
def login():

    # 请求相关信息
    # request.method  请求方式
    # request.args  # get请求参数
    # request.form
    # request.values
    # request.cookies
    # request.headers
    # request.path
    # request.full_path
    # request.script_root
    # request.url
    # request.base_url
    # request.url_root
    # request.host_url
    # 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')

    # 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


    return "内容"

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

上传文件

obj = request.files['the_file_name']
obj.save('/var/www/uploads/' + secure_filename(f.filename))

返回json数据

from flask import Flask, jsonify
import json

app = Flask(__name__)


@app.route('/')
def index():
    # 两种方式
    # return json.dumps({'name': '张三', 'age': 21})
    return jsonify({'name': '张三', 'age': 21})


if __name__ == '__main__':
    app.run(debug=True, port=80)

返回响应头,设置cookie

from flask import Flask, make_response

app = Flask(__name__)


@app.route('/')
def index():
    res = make_response('index')  # 响应对象
    res.set_cookie('xxx', 'yyy', 10)
    res.headers['X-Http'] = 'fengfengzhidao'
    return res