前半部分架构已经实现了 后半部分
Filebeat装在nginx存在的机器里面
所用版本:
Nginx网站只是为了模拟环境 产生日志
flask:是python里面比较出名的web框架
主要是看数据包的走向
浏览器开发者工具
Web服务都是基于http协议的
http(超文本传输协议)(hyper text transfer protocol)传输的是超文本(这里的超文本就是源代码) 传输的是源代码 本地拿到了之后当地运行
http协议:
1991发布第一个版本0.9版本 只有一个git命令
1996年,发布了http1.0版本 引入了post head等命令
1997年 发布了http1.1 引入了持久连接(目前还是主流版本)
2015年http/2.0发布 引入了(多路复用,引入了二进制 帧和流的形式)--传输速率会快很多
Web应用的处理流程:
- 浏览器发送http请求
- 服务器收到请求,生成一个HTML文档
- 服务器把HTML文档作为HTTP响应body数据发送给浏览器
- 浏览器收到HTTP响应,从HTTP body里面取出HTML文档并显示
服务器 接受请求 发送响应
Nginx只能提供静态页面 所以只是常常用来作为反向代理
wsgi:web server gateway interface
是python语言定义的web服务器和程序框架之间一种简单而通用的接口规范
gunicorn uwsgi (这两个跟nginx平级的)
有专门的python web服务器来帮你处理原始的tcp连接,http原始请求和响应
底层的代码有专门的服务器实现
写完flask用来给gunicorn去运行(gunicorn带动flask运行 )
用户直接请求访问gunicorn
这里面的nginx集群专门做反向代理 负载均衡
flask基于jinja模块和werkzeug WSGI套件开发的
flask的特性:
flask很“轻”,“微框架”
flask比较灵活 自由 可扩展性强
flask入门简单
flask非常适合api(应用程序接口)开发
flask和django的不一样:
django是比较重量级的框架,会自动配好东西,但是得按照它的来(甚至于前端都有大体框架 不需要自己编写前端了)
Django很多写好了,但是定制自己想要功能很麻烦,太冗余了,容易出错,但是操作很方便,flask可以定制自己想要的功能,很灵活,Django可以渲染模板,前端省的写
组装的台式机(Flask)跟笔记本电脑(Django)的区别
Django饭喂到嘴边 flask从买菜开始自己做
Python常见的web框架:
Tornado,flask,twisted,django(用的比较多的是flask和django)
前端:能看到的页面内容 跟用户交互的
浏览器的架构是B(brower 浏览器)/S(服务器)架构:用浏览器带动页面展示
为了方便 我们一般前后端分离:
所以我们这个项目主要是应用的前后端分离
pip和pip3无区别
path只是其中一个环境变量 有很多环境变量
虚拟环境:
虚拟环境一个项目一个房间
保持项目的环境纯净 互不影响
创建一个新的虚拟环境:
代码行创建虚拟环境
1.(python调用venv模块去创建虚拟环境)python -m venv 虚拟环境名字
- Script是脚本
里面包含了虚拟环境的pip和python 而我们用的是系统的pip 以后需要用虚拟环境的pip和python
3.加载虚拟环境
每次进入虚拟环境都要输入这条命令 才能使用pip和python
(source命令也称为“点命令”,也就是一个点符号(.),是bash的内部命令)
虚拟环境作用?
项目依赖库版本环境隔离,保持项目纯净
pip freeze:显示这个程序安装过的库和版本
requirements.txt文件(约定俗称叫这个名字):
一般存放当前项目正常运行需要安装的哪些库 以及对应的库版本
这样 项目迁移的时候 直接按照requirements.txt文件里指定的版本和库去安装就行了
生成reqirements.txt:
每个项目都有requirements.txt 把安装了的库放入这个文件
按照requirements.txt文件进行安装:
当我们项目移动到一个新的环境的时候 就可以直接安装这个依赖文件里面的东西
如果这个不是在一个虚拟环境,而是在一个全局环境,那requirements.txt里就会多出很多无用的库,所以虚拟环境就是保证纯净性
创建第一个flask项目:
from flask import Flask
#作为直接运行的程序 __name__==‘__main__’
#实例化对象需要给一个字符串,通常用__name__的值
#这个名字将作为flask核心对象的标识
#核心对象就是通过flask实例出来的app
app=Flask(__name__) (Flask是个类,这一步是在实例化)
app.run() (flask自带一个小型的web服务器,这只用在测试开发环境,不要用在生产环境)
在pycharm运行是可以的 但是这是自带的小型的web server环境 不能用于生产环境(所以得用gunicate替代)
Flask定义里面:
形参名字:(希望得到的类型)
#第一个功能页面(写了一个接口)
from flask import Flask
app=Flask(__name__)
#需要用到装饰器添加功能
@app.route("/index/") (若是访问的是/index/路径 就交给下面这个被装饰的函数处理)
def index():
return '{"key1":1,"key2":2}'
app.run()
直接访问没有 加个index有
我们输入127.0.0.1:5000默认访问的是根(/)
127.0.0.1 - - [19/Jan/2022 17:10:25] "GET / HTTP/1.1" 404 –
http://127.0.0.1:5000/index/ 这个就相当于写了一个接口,接口一般会返回json格式的字符串,这个返回的是一个字典一样的json接口
也可以不用装饰器为它添加路由,下面可以达到一样的效果
def index2():
return "gogogo"
app.add_url_rule("/",view_func=index2)
app.add_url_rule():
在flask内部,每个核心对象都会维护两张表 一张为url_map 一张为view_functions
url_map:维护的是url和endpoint的映射关系
view_functions:维护的是endpoint和function的映射关系
endpoint没有明显的定义的话,就会使用被装饰的函数名字作为endpoint
endpoint就是把url和function解耦的中间层
endpoint在view_function表需要全局唯一(也就是对应唯一一个function),函数名可以重复 因为它所对应的endpoint唯一
一个函数也可以对应多个endpoint
但是endpoint可以对应不同的路由
@app.route("/index/")这个的底层其实就是调用的app.add_url_rule()
引入endpoint url和function解耦
文件的拆分
设置成debug调试模式之后,
代码修改不需要重启应用,它会重新加载
出现错误,日志输出会更加详细
127.0.0.1 本地回环地址,每台机器上都有
不设置host的时候 默认是127.0.0.1 别人不能访问
而host=127.168.0.25 代表只要能跟127.168.0.25通信的都能访问这个我写的网站
端口也是可以改变的 若是没有设置 则默认为5000
项目拆分:构建大型项目
模型一般跟数据库相关
视图:就是返回给用户的数据
配置文件:允许用户修改的部分 给予用户可以选择的余地
配置文件就是存放变量的文件 里面的配置项(变量)大写(因为源码里面定义的就是判断是否为大写 如果是大写才能被读取出来)
一般源程序启动都会打包成脚本的 所以直接修改配置文件 就可以直接启动
配置文件要和app核心对象相结合
#加载配置文件 里面传python的模块路径
app.config.from_object('config.setting') (这里会导入这个模块)
app.config本质上就是一个字典
from_object()就是在此基础上添加的新功能
这一行代码就是把setting模块里面的属性放入app.config这个字典里面
这样就不要再import setting了
代码写好后:
这里面加载的配置全部都放在了app.config字典里面了
测试产生的数据是脏数据 不能同步到线上去 所以测试环境和线上环境的配置是不一样的
无论测试环境还是线上环境都有/opt/config
于是我们把每个环境的opt里的config都赋值给环境变量FLASK_CONF
所有程序都先从主程序开始看
server里面的app是整个程序的核心对象
所以我们视图需要的app就是server里面的app
所以需要再view程序里面导入app
在server里面(这里的上下文代表app内存在哪里 )
在app里面
而再server.py里面要引入router里的view(必须推送到栈里面之后才能导入view)
上下文表示在cpu运行的时候保存的状态就是上文 出来之后的状态叫做下文
Flask的核心对象就是app 就是最主要的内容
蓝图:blueprint (让路由管理更加模块化)(这相当于路由视图和app之间的中间件)
绑到蓝图上面 不再需要一直写全部路径 且不用再管endpoint了
然后蓝图要与app结合:
于是在router里面新增__init__.py
(init_app的括号里面不一定要是app 也可以是current_app 只要表示当前app就好)
与app相关的放在app.py里面
这样server里面的导入study.py 等就不需要了
导入就代表执行
蓝图会帮你修改endpoint
#蓝图与endpoint
#通过蓝图注册之后 study_bp==>endpoint就变成了study.index
postman:模拟客户端接口请求的工具 是用来做测试的软件
看preview:是以网页的形式展现出来
request对象:
告诉后端我给了你username和passwd
然后上面url会自动帮忙填充我们填入的信息 这是url传参:
url传参信息:url ?参数1&参数2&参数3
得到的界面
跟请求相关的全部都放在flask.request里面
request对象:请求里的所有东西都在request对象里,比如说你请求的url 参数 cookies http头部字段
request几个常用的属性:
request.path 获取请求的资源路径 -str类型
request.args 获取url里的参数 – 字典类型
request.form获取body里携带的表单参数 –字典类型
request.json 获取传递过来的json格式数据,并转化为对象
request.method 获取请求过来的方法
request.url 获取请求过来的url
我们参数可以放在url里面 也可以放在body数据里面(form有个form表单)
放在url里面获取数据是用request.args[]
通过表单参数传递:
获取数据为request.form[]
设定用post请求 而默认是get请求 所以我们要设定方法
http的方法:
methods:
增 post
删 delete
改 put
查 get get这个方法浏览器是不允许有body
很多都是约定俗成的东西
也可以用jison格式(request对象会对字符串进行json处理,转成对象)
也可以构造动态url来获取参数:视图函数需要定义相关形参
现在没有定义方法的话 用的就是get方法
我们也可以用put方法,甚至支持多种方法
构造动态url是直接把参数放在url里面 通过url传参要用?把参数和url隔开
Flask也可以返回网页
怎么样编辑页面呢?
static放图片
返回页面需要一个渲染函数render_template
页面渲染就是动态的生成网页
渲染就是动态的生成html
Jinja的语法:
两个打括号里面一个变量名代表需要传递一个这样的变量或者表达式
反向解析出url: 这里的static表示的是endpoint,并不是目录里面的static
url_for():(逆向解析)视图函数 通过endpoint去找url
这些东西都是基于核心对象app,才能生效(因为运行的时候运行的是app.run())
而且flask底层指定了静态图片文件夹叫“static” html文件夹叫“templates”
模板和数据结合在一起成为页面