视图
函数装饰器问题
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