三十python之Flask框架视图:返回状态码重定向状态保持请求钩子
Posted 浅弋、璃鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了三十python之Flask框架视图:返回状态码重定向状态保持请求钩子相关的知识,希望对你有一定的参考价值。
一、返回状态码和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模块
四、给URL传递参数<>
1.语法:
<args> // 一般用法.默认是字符串
<数据类型:agrs> // 限制数据类型:默认6种, string、int、float、any、path、uuid(全局唯一的标识符),使用了flask内置的转换器,对应6种
写在route修饰器的地址中
@app.route('/<int:agrs>')
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) // 在每次请求后执行,接受一个参数:错误信息,如果有相关错误抛出
以上是关于三十python之Flask框架视图:返回状态码重定向状态保持请求钩子的主要内容,如果未能解决你的问题,请参考以下文章