客户端 服务端 数据交互过程:
客户端通过http协议(基于tcp)发送请求报文到服务器端,服务端解析请求request,进行路由分发,执行具体的业务逻辑代码生成响应数据,发送响应报文回客户端response
真正网络访问流程,web网络拓扑情况
服务端包含服务器和web程序(框架) 由wsgi连接服务器web程序
web程序:处理业务逻辑
web框架:协助开发者快速开发web应用程序的一套功能代码,就是做了一个封装,可以直接调用已经封装好的代码,简化流程
flask相当于一个内核,其他几乎所有功能都要用扩展;wsgi工具箱采用werkzeug(路由模块),模版引擎使用Jinja2这个两个也是Flask框架核心
模版相当于预先写好的html代码
所有外部的软件在/usr/local/lib下
如果再一台电脑上,想开发多个不同的项目,用到同一个包不同版本,就不行了,因为包会覆盖;所以我们需要虚拟环境,搭建独立的python运行环境,为每一个项目创建独立的环境;
所有虚拟环境都位于/home/下隐藏目录 .virtualenvs下
安装:
sudo pip install virtualenv
sudo pip install virtualenvwrapper
安装完虚拟环境后,如果提示找不到mkvirtualenv命令,须配置环境变量:
# 1、创建目录用来存放虚拟环境
mkdir
$HOME/.virtualenvs
# 2、打开~/.bashrc文件,并添加如下:
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh
# 3、运行
source ~/.bashrc
创建虚拟环境的命令 :
在python2中,创建虚拟环境
mkvirtualenv 虚拟环境名称
例 :
mkvirtualenv py_flask
在python3中,创建虚拟环境
mkvirtualenv -p python3 虚拟环境名称
例 :
mkvirtualenv -p python3 py3_flask
退出虚拟环境的命令 :
deactivate
使用虚拟环境的命令 :
workon 虚拟环境名称
删除虚拟环境的命令 :
rmvirtualenv 虚拟环境名称
或者删除.virtualenv目录下相应环境
导入Flask类
from flask import Flask
创建Flask应用程序
app = Flask(__name__)
装饰器分配路由,与视图函数关联
@app.route('/')
运行程序
app.run()
视图函数View 给用户提供数据
包和文件夹不一样,包里有__init__.py,先把要用的包导入init。py,导包就导init.py
Flask是类的实例化,首字母大写是类,类的实例化app对象
Flask(__name__)
__name__指代Flask对应模块,模块名称 默认需要
command+p提示
static_path 静态文件访问路径
static_url_path = static_path 上面的被弃用了
static_folder 静态文件所在目录 默认static
template_folder 表示模版文件目录
判断是否为空 is内存地址 = 判断值
所以判断None 用is
有配置项,配置值
调试模式运行:
改完代码不用重启服务器
把服务器的错误输出到浏览器,控制台
加载配置app.config是个对象
app.config.from_object()
从对象中加载配置
class Config(object):
DEBUG = True
app.config.from_object(Config)
从文件中加载配置
app.config.from_pyfile(‘config.ini’)
从环境变量中加载配置
app.config.from_envvar(‘ENVCONFIG’)
editconfig Environment Config 环境变量指代的是文件
变量全大写是约定常量,python中常量不是真常量!
其他的配置,例如连数据库SQL_IP=’’ SQL_PORT=’’
常用的配置可以直接通过app.的形式配置
app.debug = True
app.config[‘DEBUG’] = True
app.test …
host 主机地址 port端口 debug是否开启调试
@app.route(’/user/
def demo2(user_id):
get用路由的方式传递数据,在地址栏传
既支持get,又支持post方式:
@app.route(’’,methods=[‘GET’,‘POST’])
PostMan工具使用Post请求
还有两个请求方式option head
json字符串是传数据用的数据格式 与字典有点像
补充:
字典的key可以是字符串,可以是数字,可以是元组
不可是字典,不可以是集合,不可是列表
unhashable:元组字典集合列表 值会变化
hashable 可以进行hash 值不会变化
nginx可以读写分离,实现数据库主从复制,可以实现读写分离,可以负载均衡
json.dumps将字典转为json字符串
json实质是字符串,在传递过程中用字符串的格式传输!
json.loads 将json字符串转为字典
jsonify可以把字典转为字符串,而且以json的分行格式显示 打开network可以看到响应头Content-Type是application/json,所以尽量用jsonify
@app.route('/demo5')
def demo5{
return redirect('http://www.baidu.com')
#还可以写成
return redirect('/user/123')
}
#还可以写成
return redirect(url_for('函数, get传输数据))
return ‘demo6’,666
return返回多个元素,组包,把其组为元组
限制用于访问场景,自定义路由转化器
步骤:导入转换器积累,
from werkzeug
自定义转换器,
class RegexConverter(BaseConverter)
regex = “[0-9]{6}”
添加转化器到默认转换器字典,
app.url_map.converters[‘re’] = RegexConverter
实现自定义匹配规则
app.route(‘user/re:
继承于自定义转换器之后,还可以实现 to_python 和 to_url 这两个函数去对匹配参数做进一步处理:
to_python:
该函数参数中的 value 值代表匹配到的值,可输出进行查看
to_url:
在使用 url_for 去获取视图函数所对应的 url 的时候,会调用此方法对 url_for 后面传入的视图函数参数做进一步处理
访问视图函数抛出指定错误码,全局捕获错误码
主动抛出错误码:abort(status) 404之类的
@app.errorhandler(self,code or code_or_exception) 错误处理 参数里写错误码或者异常
客户端服务端交互过程中,有些准备扫尾工作需要处理,例如请求开始前连接数据库,权限校验,请求结束时指定数据交互格式,也是通过装饰器实现请求钩子:
before_frist_request 处理第一个请求前
before_request 每次请求前执行,如果在某修饰的函数中返回了一个响应,视图函数不再被调用
可以在这里监控黑名单,对非法请求阻止
after_request(response) 每次请求之后调用,函数里接收一个参数:响应,还需要将响应进行返回
teardown_request() 请求之后执行,如果请求函数有一场没回吧具体异常传入这个函数