重定向 响应 会话 扩展

本文介绍了在Python Flask框架下如何进行重定向和错误处理,包括自定义错误页面。接着讲解了响应的生成逻辑以及如何获取响应对象。此外,还详细阐述了会话管理,包括设置会话密钥和使用消息闪现系统提供用户反馈。最后提到了日志记录和如何整合WSGI中间件以增强应用功能。
摘要由CSDN通过智能技术生成

我要认认真真写啦

实验环境

  • Python 3.4
  • Flask 1.0.2

首先在环境中安装 flask1.0.2:

sudo apt-get update
sudo pip3 install flask==1.0.2

重定向和错误:

redirect()函数重定向用户到其它地方。用abort()函数提前中断一个请求并带有一个错误代码。

from flask import Flask
from flask import abort, redirect, url_for

app = Flask(__name__)

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

@app.route('/login')
def login():
    abort(401)
    this_is_never_executed()

 在浏览器输入http://127.0.0.1:5000/

浏览器会自动跳转到http://127.0.0.1:5000/login

默认情况下,每个错误代码会显示一个黑白错误页面。比如上面的页面会显示 401 Unauthorized。如果你想定制错误页面,可以使用errorhandler()装饰器,添加代码

from flask import render_template

@app.errorhandler(401)
def page_not_found(error):
    return render_template('page_not_found.html'), 404
mkdir templates && cd templates
touch page_not_found.html
<h1>page not found, this is an error page.</h1>

响应:

一个视图函数的返回值会被自动转换为一个响应对象。如果返回值是一个字符串,它被转换成一个响应主体是该字符串,错误代码为 200 OK ,媒体类型为text/html的响应对象。Flask 把返回值转换成响应对象的逻辑如下:

  1. 如果返回的是一个合法的响应对象,它会直接从视图返回。
  2. 如果返回的是一个字符串,响应对象会用字符串数据和默认参数创建。
  3. 如果返回的是一个元组而且元组中元素能够提供额外的信息。这样的元组必须是(response, status, headers) 形式且至少含有其中的一个元素。status值将会覆盖状态代码,headers可以是一个列表或额外的消息头值字典。
  4. 如果上述条件均不满足,Flask 会假设返回值是一个合法的 WSGI 应用程序,并转换为一个请求对象。

如果你想要获取在视图中得到的响应对象,你可以用函数make_response()

@app.errorhandler(404)
def not_found(error):
    resp = make_response(render_template('error.html'), 404)
    resp.headers['X-Something'] = 'A value'
    return resp

除了请求对象,还有第二个称为session对象允许你在不同请求间存储特定用户的信息。这是在 cookies 的基础上实现的,并且在 cookies 中使用加密的签名。这意味着用户可以查看 cookie 的内容,但是不能修改它,除非知道签名的密钥。

要使用会话,你需要设置一个密钥

from flask import Flask, session, redirect, url_for, escape, request

app = Flask(__name__)

# 设置密钥,保证会话安全
app.secret_key = '_5#y2L"F4Q8z\n\xec]/'

@app.route('/')
def index():
    if 'username' in session:
        return 'Logged in as %s' % escape(session['username'])
    return 'You are not logged in'

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        session['username'] = request.form['username']
        return redirect(url_for('index'))
    return '''
        <form method="post">
            <p><input type=text name=username>
            <p><input type=submit value=Login>
        </form>
    '''

@app.route('/logout')
def logout():
    # 如果用户名存在,则从会话中移除该用户名
    session.pop('username', None)
    return redirect(url_for('index'))

 

 

消息闪烁 :

好的应用和用户界面全部是关于反馈。如果用户得不到足够的反馈,他们可能会变得讨厌这个应用。Flask 提供了一个真正的简单的方式来通过消息闪现系统给用户反馈。消息闪现系统基本上使得在请求结束时记录信息并在下一个 (且仅在下一个)请求中访问。通常结合模板布局来显示消息。

使用flash()方法来闪现一个消息,使用get_flashed_messages()能够获取消息,get_flashed_messages()也能用于模板中

flashText.py

from flask import Flask, flash, redirect, render_template, request,url_for

app = Flask(__name__)
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'

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

@app.route('/login', methods=['GET', 'POST'])
def login():
    error = None
    if request.method == 'POST':
        if request.form['username'] != 'admin' or \
                request.form['password'] != 'secret':
            error = 'Invalid credentials'
        else:
            flash('You were successfully logged in')
            return redirect(url_for('index'))
    return render_template('login.html', error=error)

base.html

<!doctype html>
<title>My Application</title>
{% with messages = get_flashed_messages() %}
  {% if messages %}
    <ul class=flashes>
    {% for message in messages %}
      <li>{{ message }}</li>
    {% endfor %}
    </ul>
  {% endif %}
{% endwith %}
{% block body %}{% endblock %}

index.html

{% extends "base.html" %}
{% block body %}
  <h1>Overview</h1>
  <p>Do you want to <a href="{{ url_for('login') }}">log in?</a>
{% endblock %}

login.htnl

{% extends "base.html" %}
{% block body %}
  <h1>Login</h1>
  {% if error %}
    <p class=error><strong>Error:</strong> {{ error }}
  {% endif %}
  <form method=post>
    <dl>
      <dt>Username:
      <dd><input type=text name=username value="{{
          request.form.username }}">
      <dt>Password:
      <dd><input type=password name=password>
    </dl>
    <p><input type=submit value=Login>
  </form>
{% endblock %}

 username password Apple

admin secret

日志和整合 WSGI 中间件:

日志

有时候你会遇到一种情况:理论上来说你处理的数据应该是正确的,然而实际上并不正确的状况。比如你可能有一些客户端代码,代码向服务器发送一个 HTTP 请求但是显然它是错误的。这可能是由于用户篡改数据,或客户端代码失败。大部分时候针对这一情况返回400 Bad Request就可以了,但是有时候不能这样做,代码必须继续工作。

你也有可能想要记录一些发生的不正常事情。这时候日志就派上用处。从 Flask 0.3 开始日志记录是预先配置好的。

app.logger.debug('A value for debugging')
app.logger.warning('A warning occurred (%d apples)', 42)
app.logger.error('An error occurred')

附带的 logger 是一个标准的日志类 Logger ,因此更多的信息请查阅官方文档logging documentation

整合 WSGI 中间件

如果你想给你的应用添加 WSGI 中间件,你可以封装内部 WSGI 应用。例如如果你想使用 Werkzeug 包中的某个中间件来应付 lighttpd 中的 bugs,你可以这样做:

from werkzeug.contrib.fixers import LighttpdCGIRootFix
app.wsgi_app = LighttpdCGIRootFix(app.wsgi_app)

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值