flask_三、重定向、session、cookie简单说明
上节遗留问题:
视图函数可以返回最多由三个元素组成的元祖:响应主体、状态码、首部字段。其中首部字段可以为字典,或是两元素元祖组成的列表,如:
return '', 302, {'Location': 'http://127.0.0.1:5000/redirect'}
return '', 302, [('lcoation', 'http://localhost:5000/A'), ('contentType', 'application/json')]
app.py实例如下:
from flask import Flask from flask import make_response app=Flask(__name__) @app.route('/hello/', endpoint = 'greeting') def hello(): d=('1','2',{'server':'gloryroad'}) # 传参需要注意的地方 d1 = ('about page', 200, {'server':'heboan'}) #response = make_response('about page', 200, {'server':'heboan'}) #response = make_response('about page', 200, [('server','gloryroad'),('username','sam')]) response = make_response(d) #response = make_response(d1) return response
运行结果:

重定向、session、cookie简单说明
一、重定向
1.1第一种方式
from flask import Flask app=Flask(__name__) @app.route('/redirect') def redirectfunc(): return("<p>This is a redirect page</p>") @app.route('/hello1') def hello1(): print("redirect...") return '', 302, {'Location': 'http://127.0.0.1:5000/redirect'} if __name__ == '__main__': app.run(debug=True)
运行结果:

1.2第二种方式
from flask import Flask,redirect,url_for app=Flask(__name__) @app.route('/hello3/',endpoint='world') def hello3(): print(url_for('redirectfun')) # url_for(端点名)--》返回端点对应的url规则 return redirect(url_for('redirectfun'))#重定向到/redirect @app.route('/redirect') def redirectfun(): return "<p>This is a redirect page</p>" if __name__ == '__main__': app.run(debug=True)
运行结果:

1.2.1断点说明
断点名默认为视图函数名,除非设置了endpoint(在路由装饰器里,设置endpoint=helloendpoint)
效果如下

都指定endpoint的话,记得设置下,否则会报错

二、返回指定状态码
from flask import Flask from flask import abort app=Flask(__name__) @app.route('/404') def not_found(): abort(404) if __name__ == '__main__': app.run(debug = True)
运行结果:

三、手动设置环境配置
管理环境变量
用来管理环境变量:pipenv install python-dotenv

1、手动新增.flask.env文件和.env文件

在.flaskenv下增加如下内容(.env的优先级比.flask.env的优先级要高)
FLASK_ENV=development
指定是开发环境
此时重新加载app.py启动
app.run()即使没声明debug=true,也会默认把debug模式打开
加上环境变量之后 ,线上环境要改成production!!!
if __name__ == '__main__': app.run(debug = True) # 增加上述环境变量后就不需要手动指定debug=True
app.py文件内容
from flask import Flask app=Flask(__name__) @app.route('/hello') def not_found(): d={'user1':"asdf",'user2':"xiaogang"} return d[3] if __name__ == '__main__': app.run()
Debug模式开启后,如果报错会出现下面的情况


输入如上的PIN码,即可查看到错误日志内容
可以在线进行调试,所有用户都可以

四、响应返回格式设置(媒体类型)
from flask import Flask,make_response,json app=Flask(__name__) @app.route('/foo1') def foo1(): data={'name':'Sam Xia','gender':'male'} response = make_response(json.dumps(data)) # 将json格式转换为python字典 response.mimetype = 'application/json' # 这句话的含义是样式不同 return response from flask import jsonify @app.route('/foo3') def foo3(): return jsonify(name = 'Sam Xia',gender = 'make') # 返回json格式的 if __name__ == '__main__': app.run(debug = True)
运行结果如下:


五、cookie相关
Session:在服务器端存储用户信息返回给浏览器(理解为一个加密的cookie)
Cookie:客户请求到服务器的客户信息,浏览器就搞出来一些东西,存储在客户端
5.1、第一种形式
from flask import Flask,make_response,json,redirect,url_for app=Flask(__name__) @app.route('/hello1') def hello1(): data = {'name': 'Sam Xia', 'gender': 'male'} response = make_response(json.dumps(data)) response.mimetype = 'application/json' print("dir(response): %s" % dir(response)) print("respones.json: %s" % response.json) print("response.get_json(): %s" % response.get_json()) print("response.is_json: %s" % response.is_json) return response @app.route('/hello/<name>') def hello(name): return '<h1>Hello, %s !</hi>' %name @app.route('/set/<name>') def set_cookie(name): """执行这个请求的时候是服务器Set-Cookie 后返回给客户端,体现在response headers里; 然后重定向了一次,体现在request headers里""" #url_for()方法的第一个参数是端点,视图函数名;第二个参数是该函数需要的参数 response = make_response(redirect(url_for('hello', name = 'gloryroad'))) #把url中name变量的值添加到cookie中name属性中 response.set_cookie('username',name) return response if __name__ == '__main__': app.run(debug = True)
运行结果如下:



5.1.1查看对应的cookie

5.2、第二种形式
from flask import Flask,make_response,redirect,url_for,request app=Flask(__name__) @app.route('/') # 两个都可以访问,直接访问时不带参数,故username为None @app.route('/hello') def hello(): username = request.args.get('username') print("username: %s" % username) if username is None: username = request.cookies.get('username','Human')#从cookie中获取username值,没有则返回‘Human’ return '<h1>Hello, %s</hi>' % username @app.route('/set/<name>') def set_cookie(name): #url_for()方法的第一个参数是视图函数名,第二个参数是该函数需要的参数 response = make_response(redirect(url_for('hello',username = '李白'))) #把url中name变量的值添加到cookie中name属性中 response.set_cookie('username',name) return response if __name__ == '__main__': app.run(debug = True)
运行结果如下


浙公网安备 33010602011771号