重定向笔记:
重定向分为永久性重定向和暂时性重定向,在页面上体现的操作就是浏览器会从一个页面自动跳转到另外一个页面。比如用户访问了一个需要权限的页面,但是该用户当前并没有登录,因此我们应该给他重定向到登录页面。
-
永久性重定向:
http
的状态码是301
,多用于旧网址被废弃了要转到一个新的网址确保用户的访问,最经典的就是京东网站,你输入www.jingdong.com
的时候,会被重定向到www.jd.com
,因为jingdong.com
这个网址已经被废弃了,被改成jd.com
,所以这种情况下应该用永久重定向。 -
暂时性重定向:
http
的状态码是302
,表示页面的暂时性跳转。比如访问一个需要权限的网址,如果当前用户没有登录,应该重定向到登录页面,这种情况下,应该用暂时性重定向。
flask中重定向:
flask
中有一个函数叫做redirect
,可以重定向到指定的页面。示例代码如下:
from flask import Flask,request,redirect,url_for
app = Flask(__name__)
@app.route('/login/')
def login():
return '这是登录页面'
@app.route('/profile/')
def profile():
if request.args.get('name'):
return '个人中心页面'
else:
# redirect 重定向
return redirect(url_for('login'))
Response详解
视图函数中可以返回哪些值:
- 可以返回字符串:返回的字符串其实底层将这个字符串包装成了一个
Response
对象。 - 可以返回元组:元组的形式是(响应体,状态码,头部信息),也不一定三个都要写,写两个也是可以的。返回的元组,其实在底层也是包装成了一个
Response
对象。 - 可以返回
Response
及其子类。
###flask0.12.2版本需要定义一个JsonResponse的类来将非元组、非字符串、非response对象的对象转化为json
###但在flask2.0.3版本中不需要,直接return jsonify(list/dict)
# class JsonResponse(Response):
# @classmethod
# def force_type(cls, response, environ=None):
# if isinstance(response,list): # 列表
# response=jsonify(response)
# return super(JsonResponse, cls).force_type(response,environ)
# elif isinstance(response,dict): # 字典
# response=jsonify(Response)
# return super(JsonResponse, cls).force_type(response,environ)
# app.response_class=JsonResponse
from flask import Flask,Response,jsonify,make_response
app = Flask(__name__)
@app.route('/')
def hello_world(): # put application's code here
return 'Hello World!'
#字符串
@app.route('/ReceiveStr/')
def demo1():
return 'hello yao!!!' # 可返回
#元组 要返回的信息,状态码,请求头
@app.route('/ReceiveTuple/')
def demo2():
return 'receive ok', 200, {'name': 'yao'} # 可返回
#字典
@app.route('/ReceiveDict/')
def demo3():
# 在flask2.0.3版本中可以返回字典,但在flask0.12.2中不能直接返回字典
return {'username':'Yao','password':'2000'} # 可返回
#Response对象
@app.route('/ReceiveRespObj/')
def demo4():
resp = Response('my name is absss')
resp.set_cookie('username', 'absss') # 设置cookie
return resp # 可返回
#列表
@app.route('/ReceiveList/')
def demo5():
return jsonify(['a','b','c'])
if __name__ == '__main__':
app.run()
实现一个自定义的Response
对象:
- 继承自
Response
类。 - 实现方法
force_type(cls,rv,environ=None)
。 - 指定
app.response_class
为你自定义的Response
对象。 - 如果视图函数返回的数据,不是字符串,也不是元组,也不是Response对象,那么就会将返回值传给
force_type
,然后再将force_type
的返回值返回给前端。
from flask import Flask,Response,jsonify,render_template
# flask = werkzeug+sqlalchemy+jinja2
import json
app = Flask(__name__)
# 将视图函数中返回的字典,转换成json对象,然后返回
# restful-api
class JSONResponse(Response):
@classmethod
def force_type(cls, response, environ=None):
"""
这个方法只有视图函数返回非字符、非元组、非Response对象
才会调用
response:视图函数的返回值
"""
if isinstance(response,dict):
# jsonify除了将字典转换成json对象,还将改对象包装成了一个Response对象
response = jsonify(response)
return super(JSONResponse, cls).force_type(response,environ)
app.response_class = JSONResponse
@app.route('/')
def hello_world():
# Response('Hello World!',status=200,mimetype='text/html')
# return 'Hello World!'
return render_template('index.html')
@app.route('/list1/')
def list1():
resp = Response('list1')
resp.set_cookie('country','china')
return resp
@app.route('/list2/')
def list2():
return 'list2',200,{'X-NAME':'zhiliao'}
@app.route('/list3/')
def list3():
return {'username':'zhiliao','age':18}
if __name__ == '__main__':
app.run(debug=True,port=5000)