一 模板:
1 重定向:重新定位到新的位置.
使用一: 暂时重定向
from flask import Flask,redirect
@app.route('/user_info/')
def user_info():
name = request.args.get('name')
pwd = request.args.get('pwd')
if name=='mark' and pwd == '123':
return '{}的信息'.format(name)
return redirect('/login/') # 可以换成 return redirect(url_for('login'))
@app.route('/login/')
def login():
return '这是登录页面'
使用二 : 永久重定向(比暂时多了: code=301 )
from flask import Flask,redirect
@app.route('/user_info/')
def user_info():
name = request.args.get('name')
pwd = request.args.get('pwd')
if name=='mark' and pwd == '123':
return '{}的信息'.format(name)
return redirect('/login/', code=301) # 会返回301状态码给浏览器
@app.route('/login/')
def login():
return '这是登录页面'
二 jinja2模板引擎
和之前django的基本一致如:for if 等
处理xss攻击:
1 模板层 要渲染的字符串|safe
2 后端:Markup('<input type="text">')
Markup等价django的mark_safe ,
传参方式一:
@app.route('/')
def index():
return render_template('index.html',name="mark",age=18)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板传参</title>
</head>
<body>
{{name}}
{{age}}
</body>
</html>
传参方式二:
@app.route('/demo1/')
def demo1():
context_dict = {"name":"mark",
"age":"mark",
"sex":"girl"}
return render_template('index.html',context_dict = context_dict)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板传参</title>
</head>
<body>
{{context_dict.name}}
{{context_dict.age}}
{{context_dict.sex}}
</body>
</html>
传参方式三:
def demo2():
context_dict = {"name": "mark",
"age": "mark",
"sex": "girl",
"other_info":{"tel":1365,
"qq":565656}}
return render_template('index.html',**context_dict)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>模板传参</title>
</head>
<body>
{{name}}
{{age}}
{{sex}}
{{other_info.tel}}
{{other_info["qq"]}}
</body>
</html>
二 请求和响应
request对象的属性和方法
request.method 提交的方法
request.args get请求提及的数据
request.form post请求提交的数据
request.values post和get提交的数据总和
request.cookies 客户端所带的cookie
request.headers 请求头
request.path 不带域名,请求路径
request.full_path 不带域名,带参数的请求路径
request.url 带域名带参数的请求路径
request.base_url 带域名请求路径
request.url_root 域名
request.host_url 域名
request.host 127.0.0.1:500
request.files 文件
响应对象方法:
响应对象
响应相关信息
return "字符串"
return render_template('html模板路径',**{})
return redirect('/index.html')
对应着: django,JsonResponse
return jsonify({'k1':'v1'})
aa='hello world'
res=make_response(aa)
res.set_cookie('xxx','lqz')
# 往响应头中放东西
res.headers['X-Something'] = 'A value'
print(type(res))
from flask.wrappers import Response
return res
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 'hello'
三 闪现:
仅仅在下一个请求中访问这个数据
实例:
from flask import Flask,request,jsonify,make_response,session,flash,get_flashed_messages
app=Flask(__name__)
app.debug=True
app.secret_key='sdafasdfasdf'
@app.route('/',methods=['GET','POST'])
def index():
flash('lqz',category='error1') # 往某个位置放值
return 'hello'
@app.route('/order',methods=['GET','POST'])
def order():
res=get_flashed_messages(category_filter=['error1'])
print(res)
return 'cccc' # 从某个位置取出来
@app.route('/order2',methods=['GET','POST'])
def order2():
# res=get_flashed_messages()
# res=get_flashed_messages(category_filter=['error1'])
res=get_flashed_messages(category_filter=['error1'])
print(res)
return 'dsadfsda' # 从某个位置取出来
if __name__ == '__main__':
app.run()
四 session的使用
全局导入:
from flask import session
视图函数中:
session['key']=value
删除:
session.pop('key')
取:
session['key']
五 请求扩展
类似于django的中间件,请求来了,请求走了,什么操作
1 请求来了就会触发,类似于django的process_request,如果有多个,顺序是从上往下
@app.before_request
def before(*args,**kwargs):
if request.path=='/login':
return None
else:
name=session.get('user')
if not name:
return redirect('/login')
else:
return None
2 请求走了就会触发,类似于django的process_response,如果有多个,顺序是从下往上执行
@app.after_request
def after(response):
print('我走了')
return response
@app.after_request
def after2(response):
print('我走了2222')
return response
3 before_first_request 项目启动起来第一次会走,以后都不会走了,也可以配多个(项目启动初始化的一些操作)
@app.before_first_request
def first():
print('我的第一次')
4 每次视图函数执行完了都会走它,# 用来记录出错日志
@app.teardown_request # 用来记录出错日志
def ter(e):
print(e)
print('我是teardown_request ')
5 errorhandler绑定错误的状态码,只要码匹配,就走它
@app.errorhandler(404)
def error_404(arg):
return render_template('error.html',message='404错误')
6 全局标签
@app.template_global()
def sb(a1, a2):
return a1 + a2
在模板中:{{ sb(3,4) }}
7 全局过滤器
@app.template_filter()
def db(a1, a2, a3):
return a1 + a2 + a3
在模板中{{ 1|db(2,3)}}