flask框架视图及路由-1

flask框架

1.web请求流程

客户端 服务端 数据交互过程:
客户端通过http协议(基于tcp)发送请求报文到服务器端,服务端解析请求request,进行路由分发,执行具体的业务逻辑代码生成响应数据,发送响应报文回客户端response

真正网络访问流程,web网络拓扑情况

2.web应用程序

服务端包含服务器和web程序(框架) 由wsgi连接服务器web程序

web程序:处理业务逻辑

web框架:协助开发者快速开发web应用程序的一套功能代码,就是做了一个封装,可以直接调用已经封装好的代码,简化流程

flask相当于一个内核,其他几乎所有功能都要用扩展;wsgi工具箱采用werkzeug(路由模块),模版引擎使用Jinja2这个两个也是Flask框架核心

模版相当于预先写好的html代码

3.搭建虚拟环境virtualenv

所有外部的软件在/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目录下相应环境

4.hello world

导入Flask类
from flask import Flask
创建Flask应用程序
app = Flask(__name__)
装饰器分配路由,与视图函数关联
@app.route('/')
运行程序
app.run()

视图函数View 给用户提供数据

包和文件夹不一样,包里有__init__.py,先把要用的包导入init。py,导包就导init.py

Flask是类的实例化,首字母大写是类,类的实例化app对象

5.创建flask可选参数

Flask(__name__) __name__指代Flask对应模块,模块名称 默认需要
command+p提示

static_path 静态文件访问路径
static_url_path = static_path 上面的被弃用了
static_folder 静态文件所在目录 默认static
template_folder 表示模版文件目录

判断是否为空 is内存地址 = 判断值
所以判断None 用is

6.Flask程序的加载配置

有配置项,配置值

调试模式运行:
改完代码不用重启服务器
把服务器的错误输出到浏览器,控制台
加载配置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 …

7.app.run 设置参数

host 主机地址 port端口 debug是否开启调试

8.路由的定义

  • 路由定义的参数,请求方式
  • PostMan

表示动态变化的内容 里面指定用什么参数接收,并且视图函数需要接收这个参数!

@app.route(’/user/’)
def demo2(user_id):

get用路由的方式传递数据,在地址栏传

既支持get,又支持post方式:
@app.route(’’,methods=[‘GET’,‘POST’])

PostMan工具使用Post请求

还有两个请求方式option head

9.PostMan模拟发送请求Chrome插件

10.json数据格式 返回json

json字符串是传数据用的数据格式 与字典有点像
补充:
字典的key可以是字符串,可以是数字,可以是元组
不可是字典,不可以是集合,不可是列表
unhashable:元组字典集合列表 值会变化
hashable 可以进行hash 值不会变化

nginx可以读写分离,实现数据库主从复制,可以实现读写分离,可以负载均衡

json.dumps将字典转为json字符串
json实质是字符串,在传递过程中用字符串的格式传输!
json.loads 将json字符串转为字典

jsonify可以把字典转为字符串,而且以json的分行格式显示 打开network可以看到响应头Content-Type是application/json,所以尽量用jsonify

11.重定向redirect

@app.route('/demo5')
def demo5{
	return redirect('http://www.baidu.com')
	#还可以写成
	return redirect('/user/123')
	}
	#还可以写成
	return redirect(url_for('函数, get传输数据))

12.自定义状态码

return ‘demo6’,666

return返回多个元素,组包,把其组为元组

13.正则匹配路由

限制用于访问场景,自定义路由转化器

代码实现

步骤:导入转换器积累,
from werkzeug
自定义转换器,
class RegexConverter(BaseConverter)
regex = “[0-9]{6}”
添加转化器到默认转换器字典,
app.url_map.converters[‘re’] = RegexConverter
实现自定义匹配规则
app.route(‘user/re:’)

自定义重转化器,以及系统提供的转换器

Converters其他两个函数实现to_python to_url

继承于自定义转换器之后,还可以实现 to_python 和 to_url 这两个函数去对匹配参数做进一步处理:

to_python:
该函数参数中的 value 值代表匹配到的值,可输出进行查看

to_url:
在使用 url_for 去获取视图函数所对应的 url 的时候,会调用此方法对 url_for 后面传入的视图函数参数做进一步处理

12.异常捕获

访问视图函数抛出指定错误码,全局捕获错误码

主动抛出错误码:abort(status) 404之类的

@app.errorhandler(self,code or code_or_exception) 错误处理 参数里写错误码或者异常

13.请求钩子

客户端服务端交互过程中,有些准备扫尾工作需要处理,例如请求开始前连接数据库,权限校验,请求结束时指定数据交互格式,也是通过装饰器实现请求钩子:

before_frist_request 处理第一个请求前

before_request 每次请求前执行,如果在某修饰的函数中返回了一个响应,视图函数不再被调用
可以在这里监控黑名单,对非法请求阻止

after_request(response) 每次请求之后调用,函数里接收一个参数:响应,还需要将响应进行返回

teardown_request() 请求之后执行,如果请求函数有一场没回吧具体异常传入这个函数

你可能感兴趣的:(flask,后端)