三十、python之Flask框架(二)视图:返回状态码、重定向、状态保持、请求钩子

版权声明:浅弋、璃鱼的原创 https://blog.csdn.net/qq_35709559/article/details/83063057

一、返回状态码和abort函数

1.return直接返回状态码:

return可以返回自定义的不符合http协议的状态码。
作用:实现前后端的数据交互。
代码:

from flask import Flask
app = Flask(__name__)


@app.route("/")
def index():
    return "hello world!!", 600	# 返回自定的600状态码

if __name__ == '__main__':
    app.run(host="0.0.0.", debug=True)

2.abort函数:

2.1 abort函数:

abort函数:flask中的异常处理语句,功能类似于python中raise语句,只要触发abort后面的代码不会执行。
结论:abort只能抛出符合http协议的异常状态码。
作用:abort函数一般用来实现自定义的错误信息,让代码的扩展性更好,提高用户体验。

2.2 errorhandler函数:

errorhandler函数接受的参数是abort函数抛出的错误状态,用来自定义错误页面或者信息

#!/usr/bin/env python3
# coding=utf-8
from flask import Flask,abort

app = Flask(__name__)

@app.route("/")
def index():
    abort(404)	# 抛出404状态码,但是不会终止程序的继续运行
    return "Hello World!!"

@app.errorhandler(404)
def error_handler(e):
    print(type(e)) # <class 'werkzeug.exceptions.NotFound'>
    # e的底层是werkzeug.exceptions的实例对象,用来处理相应的状态码
    print(e)
    # 404 Not Found: The requested URL was not found on the server.  If you entered the URL manually please check your spelling and try again.
    
    return "页面错误..."

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

二、重定向(302):

1.重定向:

from flask import Flask, redirect
app = Flask(__name__)

@app.route("/")
def index():
    url = "https://www.baidu.com"
    return redirect(url)

2.什么是重定向:

访问当前url,重新请求一个新的url
作用:当网站页面页面或者文章发生变化的时候,可以使用重定向,提高用户体验。

3.反向解析:url_for

3.1 url_for:

from flask import url_for

@app.route("/demo")
def demo_url_for():
    # url_for接收的参数名为视图函数名
    return redirect(url_for("index"))

3.2 作用:

建议使用url_for实现页面的重定向,可以rag重定向定位到具体的视图函数,让代码不冗余.

3.3 什么是反向解析:

正向解析:从url找到视图函数;
反向解析:从视图函数找到对象的url;

三、JSON:

1.概念:

基于键值对的字符串,本质是字符串。

2.作用:

轻量级的数据交互方式,用于数据传输。

3. 如何实现数据交互:

  • 在json之前的前后端数据传输是使用xml格式进行传输,
  • xml是一种偏重的数据交互格式,是因为需要打包;
  • json是一种数据格式,不是一种数据类型;

4. python中如何传输json:

python中有json模块,dumps和loads

import json
json.dumps(): 把字典(变量)转换成json字符串;
json.loads(): 把json字符串转换成字典(变量);
json.dump():把字典(文件对象)转换成json字符串
json.load(): 把json字符串转换成字典(文件对象);

5.flask中如何返回json:

5.1 实例

from flask import Falsk, jsonfiy

@app.route("/")
def index():
    data = {
        'name':'python32',
        'age':18
    }
    # return json.dumps(data)   # Content-Type:text/html
    return jsonfiy(data)    # Content-Type:application/json

5.2 作用:

jsonify的作用:就是把字典转成json字符串,底层封装了python的json模块

扫描二维码关注公众号,回复: 3863632 查看本文章

四、给URL传递参数<>

1.语法:

<args> // 一般用法.默认是字符串
<数据类型:agrs> // 限制数据类型:默认6种, string、int、float、any、path、uuid(全局唯一的标识符),使用了flask内置的转换器,对应6种

写在route修饰器的地址中

@app.route('/&lt;int:agrs&gt;')
def index(args):
	return "hello World %s" % args

2.实现:

werkzeug.routing Baseconvert
通过werkzeug内置的转换器内实现(Converter)

3.代码:

# !/usr/bin python3
# coding: utf-8
from flask import Flask
from werkzeug.routing import BaseConverter

app = Flask(__name__)

@app.route("/<int:args>")
def index_int(args):
    return "你好世界,%s" %args

@app.route("/<float:args>")
def index_float(args):
    return "你好世界,%s" %args


if __name__ == '__main__':
    app.run(host="0.0.0.0", debug=True)

五、正则URL:

1.需求分析:

内置的转换器只能限制数据类型,现在我们需要限制参数的参数

2.自定义转换器:

需要继承werkzeug.routing包的BaseConverter模块

2.1 自定义转换器一(固定正则):

先来参考一下werkzeug.routing中,官方的转化器的写法:

class FloatConverter(NumberConverter):
    regex = r'\d+\.\d+'
    num_convert = float

    def __init__(self, map, min=None, max=None):
        NumberConverter.__init__(self, map, 0, min, max)

参照源码可知,转换器是继承于BaseConverter类的

# 自定义转化器一:正则表达式固定写死
class RegexConverter1(BaseConverter):
    regex = "[a-z]{6,20}"   # 正则小写字母6-20个

# 将自定义的转换器添加到werkzeug.routing的DEFAULT_CONVERTERS关系中
app.url_map.converters['re1'] = RegexConverter1

@app.route("/<re1:args>")
def index(args):
    return "传入的参数是:%s" %args

缺点:

  • 每一个规则都需要对应一个自定义转换器,且每一个自定义转换器都需要添加到werkzeug.routing的DEFAULT_CONVERTERS关系中,不方便。

2.2 自定义转换器二(通过传参动态正则)

# 自定义转换器二:动态的传入好.正则规则
class RegexConverter2(BaseConverter):
    def __init__(self, map, *args):
        super(RegexConverter2, self).__init__(map)
        print(map)
        self.regex = args[0]
        print("接受到的正则规则是:" + args[0])

app.url_map.converters['re2'] = RegexConverter2

@app.route("/<re2('[\d]{4,6}'):args>")  # 动态的规定正则:0-9接受4-6个
def demo(args):
    return "传入的参数是:%s" %args

六、状态保持:

1.状态保持:

客户端和服务器交互,服务器需要记录客户端是谁。

2.cookie和session:

2.1概念:

cookie和session:都是基于键值对的字符串,用来记录用户信息。

2.2 cookie:

是存出来客户端浏览器;不安全;(同源策略:谁写的cookie谁能拿到)

2.3 session:

  • 是基于cookie实现的,存储在服务器中;和框架和语言无关
  • key存储在浏览器中, 且是经过加密的字符串;
  • value存储到服务器中

3.设置/获取cookie

# !/usr/bin python3
# coding:utf-8
from flask import Flask, make_response, request

app = Flask(__name__)

# 设置cookie
@app.route("/set_cookie")
def set_cokkie():
    # 使用flask内置的相应对象
    response = make_response('set cookie')
    # 使用响应来设置cookie, 在客户端浏览器中设置cookie, max_age表示cookie的保持时间,单位是秒
    response.set_cookie('itcast', 'python32', max_age = 3600)
    # 返回响应对象
    return response

# 获取cookie
@app.route("/get_cookie")
def get_cookie():
    # request是flask内置的请求上写文对象,cookie是对象的属性,get表示获取方法
    itcast = request.cookies.get('itcast')
    return itcast


if __name__ == "__main__":
    app.run(host="0.0.0.0", debug=True)

4.设置/获取session:

# !/usr/bin python
# coding:utf-8

from flask import Flask, session

app = Flask(__name__)

# session需要设置密钥用来进行哈希编码
app.config['SECRET_KEY'] = "abcdefgh"

# 设置session
@app.route('/set_session')
def set_session():
    # session是flask内置的上下文对象,用来实现状态保持中的sesion
    # session会对键值对进行编码,让状态保持的session信息更安全
    session['itcast'] = "python32"
    return 'set session success ...'

# 获取session
@app.route("/get_session")
def get_session():
    itcast = session.get('itcast')
    return itcast
    

if __name__ == '__main__':
    app.run(host="0.0.0.0", debug=True)

七、加载配置文件:

1.实现形式有三种:

1.使用配置对象(from_object);建议使用此方法,扩展性更强
2.使用初始化文件from_pyfile;
3.使用环境变量from_envvar

2.代码实现:

2.1 使用配置模块:

配置模块代码实例:

config.py

# 基础配置
class Config:
    DEBUG = None
    SECRET_KEY = “20181015”  # 设置秘钥

# 开发模式
class DevelopmentConfig(Config):
    DEBUG = True

# 生产模式
class ProductionConfig(Config):
    DEBUG = False

# 定义字典映射
config_dict = {
    'development': DevelopmentConfig,
    'production': ProductionConfig
}
实现代码实例:

hello.py

from flask import Flask
from config import config_dict
# 将配置模块加载进来
...
# 使用配置对象
app.config.from_object(config_dict['development'])
...

2.2 使用使用初始化文件:

使用初始化文件代码实例:

config.ini

SECRET_KEY = '2018'
DEBUG = True
实现代码实例:
from flask import Flask
...
# 使用配置对象
app.config.from_pyfile("config.ini")
...

2.3 使用环境变量:

实现代码实例:
from flask import Flask
...
# 使用环境变量
app.config.from_envvar("SETTINGS")
# 参数是设置好的环境变量名
...

八、请求钩子:

1.什么是请求钩子:

相当于python中的初始化函数__init__和析构函数__del__

2.flask中的四种请求钩子:

# !/usr/bin python
# coding:utf-8
from flask import Flask,abort

app = Flask(__name__)

@app.route("/")
def index():
    return "hello  world"

# 在请求前执行, 只执行一次
@app.before_first_request
def before_first_request():
    print("before_first_request")

# 在请求之前执行,可重复执行
@app.before_request
def before_request():
    abort(404)
    print("before_request")

# 在请求之后执行
@app.after_request
def after_request(response):
    # 没有异常的情况下在请求后执行,必须接受响应作对象为参数,并返回响应,如果有web服务器内部异常不会执行
    print("after_request")
    return response

# 在请求之后,出现异常时执行
@app.teardown_request
def teardown_request(e):
    # 在请求之后,必须接受异常作为参数
    print("teardown_request" + "异常:" + str(e))

if __name__ == '__main__':
    app.run(host="0.0.0.0", debug=True)

3.运行顺序:

  • before_first_request // 在请求前执行,只执行一次
  • before_request // 在请求前执行,每次都执行
  • 请求
  • after_request(response) // 在请求后执行, 必须接受响应作为对象,并且有- 返回值;如果服务器内部错误,则不会执行
  • teardown_request(error) // 在每次请求后执行,接受一个参数:错误信息,如果有相关错误抛出

猜你喜欢

转载自blog.csdn.net/qq_35709559/article/details/83063057