前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Flask(重定向和错误响应 六)

Flask(重定向和错误响应 六)

作者头像
zx钟
发布于 2020-06-28 03:58:13
发布于 2020-06-28 03:58:13
2.1K00
代码可运行
举报
文章被收录于专栏:测试游记测试游记
运行总次数:0
代码可运行

redirect(重定向)实现方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from flask imports redirect

@app.route('/')
def index():
    if request.args.get('username') is None:
        return redirect('login')
    return 'hello'

源码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def redirect(location, code=302, Response=None):
    if Response is None:
        from .wrappers import Response

    display_location = escape(location)
    if isinstance(location, text_type):
        from .urls import iri_to_uri

        location = iri_to_uri(location, safe_conversion=True)
    response = Response(
        '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">\n'
        "<title>Redirecting...</title>\n"
        "<h1>Redirecting...</h1>\n"
        "<p>You should be redirected automatically to target URL: "
        '<a href="%s">%s</a>.  If not click the link.'
        % (escape(location), display_location),
        code,
        mimetype="text/html",
    )
    response.headers["Location"] = location
    return response
  • 重定向的code默认为302
  • 我们传入的第一个参数location被放入到了response.headers["Location"]

浏览器处理工作:

  1. 先判断返回状态码是否为「30x」
  2. 查看返回的头信息中是否有Location字段,如果有则访问新的网址

重定向的两种方式

redirect('/new/url')

不建议使用:url地址可能会发生变更,函数名变更比较少

redirect(url_for('endpoint'))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.route('/')
def index():
    if request.args.get('username') is None:
        return redirect(url_for('login'))
    return 'hello'


@app.route('/login')
def login():
    return 'login'

url_for

  1. 生成静态文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
url_for('static',filename='style.css')

例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from flask import Flask, render_template

app = Flask(__name__, static_url_path='/src')


@app.route('/')
def index():
    return render_template('index.html')


if __name__ == '__main__':
    app.run()

templates/index.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="{{ url_for('static',filename='css/demo.css') }}">
    <title>Title</title>
</head>
<body>
<p>hello</p>
</body>
</html>

static/css/demo.css

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.p {
    color: red;
}

css_url

http://127.0.0.1:5000/src/css/demo.css可以看出,这个url变成了static_url_path替换部分

  1. 跳转的时候添加参数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.route('/')
def index():
    if request.args.get('username') is None:
        return redirect(url_for('login', username='zhongxin'))
    return 'hello'


@app.route('/login', endpoint='login')
def login():
    return 'login'

访问:http://127.0.0.1:5000/

会跳转到:http://127.0.0.1:5000/login?username=zhongxin

url_for带参数跳转

错误响应

没有任何处理的错误返回

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from flask import Flask, render_template

app = Flask(__name__, static_url_path='/src')


@app.route('/')
def index():
    1 / 0
    return render_template('index.html')


if __name__ == '__main__':
    app.run()

未处理

处理500错误

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.errorhandler(500)
def server_error(error):
    return '我们正在升级'

错误返回

使用官网定义的错误返回

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from flask import Flask, render_template, request, abort

app = Flask(__name__, static_url_path='/src')


@app.route('/')
def index():
    if not request.args.get('username'):
        abort(401)
    return render_template('index.html')


if __name__ == '__main__':
    app.run()

官网定义的401

使用自己的html定义错误返回

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from flask import Flask, render_template, request, abort, make_response

app = Flask(__name__, static_url_path='/src')


@app.route('/')
def index():
    if not request.args.get('username'):
        abort(make_response(render_template('user_error_404.html'), 404))
    return render_template('index.html')


if __name__ == '__main__':
    app.run()

自己的html定义错误返回

重写官方的404错误

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from flask import Flask, render_template, request, abort, make_response

app = Flask(__name__, static_url_path='/src')


@app.errorhandler(404)
def server_error(error):
    return render_template('user_error_404.html')


@app.route('/')
def index():
    if not request.args.get('username'):
        abort(404)
    return render_template('index.html')


if __name__ == '__main__':
    app.run()

abort源码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def abort(status, *args, **kwargs):
    return _aborter(status, *args, **kwargs)


_aborter = Aborter()

其实就是调用Aborter

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Aborter(object):
    def __init__(self, mapping=None, extra=None):
        if mapping is None:
            mapping = default_exceptions
        self.mapping = dict(mapping)
        if extra is not None:
            self.mapping.update(extra)

    def __call__(self, code, *args, **kwargs):
        if not args and not kwargs and not isinstance(code, integer_types):
            raise HTTPException(response=code)
        if code not in self.mapping:
            raise LookupError("no exception for %r" % code)
        raise self.mapping[code](*args, **kwargs)

执行的时候就是__call__会抛出异常

其实,它就是抛出一个异常而已

自己创建错误信息类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from flask import Flask, render_template, request

app = Flask(__name__, static_url_path='/src')


class UserError(Exception):
    pass


@app.errorhandler(UserError)
def server_error(error):
    return render_template('user_error_404.html', error=error)


@app.route('/')
def index():
    if not request.args.get('username'):
        raise UserError()
    return render_template('index.html')


if __name__ == '__main__':
    app.run()
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试游记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
大白话说Python+Flask入门(二)
笔者技术真的很一般,也许是只靠着笨鸟先飞的这种傻瓜坚持,才能侥幸的在互联网行业生存下来吧!
软件测试君
2023/11/22
2440
大白话说Python+Flask入门(二)
flask 教程_python flask快速入门与进阶
Flask是一个轻量级的可定制框架,使用Python语言编写,较其他同类型框架更为灵活、轻便、安全且容易上手。它可以很好地结合MVC模式进行开发,开发人员分工合作,小型团队在短时间内就可以完成功能丰富的中小型网站或Web服务的实现。另外,Flask还有很强的定制性,用户可以根据自己的需求来添加相应的功能,在保持核心功能简单的同时实现功能的丰富与扩展,其强大的插件库可以让用户实现个性化的网站定制,开发出功能强大的网站。
全栈程序员站长
2022/09/20
2.1K0
Flask 学习-11.redirect() 重定向
前言 使用 redirect() 函数可以重定向请求 redirect() 函数 当我们访问一个需要用户先登录才能访问的地址时,比如获取用户信息,如果用户没登录,需重定向到登录页。 from flask import Flask, url_for, request, redirect, render_template app = Flask(__name__) @app.route('/user/info') def user_info(): user = request.args.get('u
上海-悠悠
2022/08/29
4210
Flask 学习-11.redirect() 重定向
web开发框架Flask学习一
flask框架 用Python做Web开发的三大框架特点 Django 主要特点是大而全,集成了很多的组件,例如:Admin Form Model等,不管你用不用的到,他都会为 你提供,通常用于大型Web应用,由于内部组件足够强大,所以使用Django可以做到一气呵成,    Django的优点是大而全,缺点也就露出来,这么多的资源一次性全部加载,肯定会造成cpu资源的浪费 flask
py3study
2020/01/19
7490
Flask之视图函数
如果按照正常的写法直接在视图函数上加装饰器@wrapper,则会报错,这是因为加完装饰器之后,原函数名就改变了。
人生不如戏
2018/08/01
4350
Flask快速入门,知识整理
一、Flask介绍(轻量级的框架,非常快速的就能把程序搭建起来)   Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。 “微”(mic
用户1214487
2018/01/24
2K0
Flask快速入门,知识整理
Flask框架(一)
Flask是一个python编写的web微框架,使用flask我们可以使用python快速实现一个网站或web服务。
GH
2020/03/19
6740
后端框架flask学习小记[通俗易懂]
最近在和几个伙伴尝试搭建一个新闻推荐系统, 算是一个推荐算法的实战项目, 里面涉及到了前后端交互, 该项目里面,使用了Flask作为后台框架, 为了理清楚整个系统的交互,所以就快速参考着资料学习了下flask, 主要还是参考伙伴们写的flask简介和基础的内容, 加上了一些其他理解和实验辅助, 整理一篇心得文章, 算是flask初步入门。
全栈程序员站长
2022/09/08
2.1K0
后端框架flask学习小记[通俗易懂]
Flask 框架基础知识笔记
内置过滤器: tojson配合js使用,注意这里要避免HTML自动转义,所以加上safe过滤器
王瑞MVP
2022/12/28
2.4K0
关于flask入门教程-app代码
Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2。
python与大数据分析
2022/03/11
7700
关于flask入门教程-app代码
Flask框架教程汇总(1)---视图/重定向/传参
本教程的flask环境都是在ubuntu 16.04下 —python3.5—IDE为pycharm 如果有任何问题可以留言哦 !
半岛铁盒子
2020/09/23
1.2K0
Flask框架教程汇总(1)---视图/重定向/传参
Python Web - Flask笔记2
导入config.py后app.config.from_object(config)
YingJoy_
2018/08/02
1.8K0
flask基础之一
如果页面想要做SEO优化的话,那么推荐使用path的形式,反之就是查询字符串的形式 练习
py3study
2020/01/06
7620
Python 系列文章 —— flask 表单案例
app.py from flask import Flask, render_template, redirect, url_for, request from flask_wtf import FlaskForm from wtforms import StringField, PasswordField from wtforms.validators import DataRequired, EqualTo from werkzeug.security import generate_passwor
玩转编程
2022/01/13
5800
day115-Flask的session&路由参数&实例化配置&对象配置&蓝图&特殊装饰器(中间件)
1.基于Flask的session的认证校验简单实例 1.秘钥 2.登录写进session 3.装饰器&视图校验 4.路由中定义 endpoint 参数 from flask import Flask, render_template, redirect, request, session app = Flask(__name__) # step1:给一个秘钥 app.secret_key = 'Leon \' s secret_key' @app.route('/', methods=['GET'
少年包青菜
2020/04/20
6140
看完这篇文章还能不懂Flask这种Web框架吗?
Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。
IT派
2018/07/30
5150
Flask基础入门学习笔记-1
描述:Flask 官方介绍Web Develoment one drop at a time,实际上它是一个基于Python开发的Web轻量级框架; 通过Flask和各种插件的配合使用,以新的框架实现Web前后端联合开发。
全栈工程师修炼指南
2020/10/23
1.6K0
Flask基础入门学习笔记-1
flask web开发实战 入门 pdf_常用的web开发框架
Flask是一个用Python编写的Web应用程序框架。Flask基于Werkzeug(WSGI工具包)和Jinja2模板引擎。
全栈程序员站长
2022/09/27
7.4K0
flask web开发实战 入门 pdf_常用的web开发框架
测试开发:10分钟Flask快速入门!
Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后触发Flask框架,开发人员基于Flask框架提供的功能对请求进行相应的处理,并返回给用户,如果要返回给用户复杂的内容时,需要借助jinja2模板来实现对模板的处理,即:将模板和数据进行渲染,将渲染后的字符串返回给用户浏览器。
测试开发技术
2022/09/28
5110
Flask
1.Flask实例配置 app.config.form_object("setting.FlaskSetting") app.DEBUG = True 开启Debug模式,该完代码不用手动重启 app.SECRET_KEY = "xxxxx" 开启session必备参数
py3study
2020/01/19
1.8K0
Flask
相关推荐
大白话说Python+Flask入门(二)
更多 >
LV.1
浙江宇视科技有限公司自动化测试
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验