URL与视图函数的映射(三)

重定向笔记:

重定向分为永久性重定向和暂时性重定向,在页面上体现的操作就是浏览器会从一个页面自动跳转到另外一个页面。比如用户访问了一个需要权限的页面,但是该用户当前并没有登录,因此我们应该给他重定向到登录页面。

  • 永久性重定向: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详解

视图函数中可以返回哪些值:
  1. 可以返回字符串:返回的字符串其实底层将这个字符串包装成了一个Response对象。
  2. 可以返回元组:元组的形式是(响应体,状态码,头部信息),也不一定三个都要写,写两个也是可以的。返回的元组,其实在底层也是包装成了一个Response对象。
  3. 可以返回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对象:
  1. 继承自Response类。
  2. 实现方法force_type(cls,rv,environ=None)
  3. 指定app.response_class为你自定义的Response对象。
  4. 如果视图函数返回的数据,不是字符串,也不是元组,也不是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)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值