目录
如何动态生成html?如何接受http请求,解析http请求,发送http响应?
专门的 WSGI 服务器 -- python web服务器 -- gunicorn , uwsgi
动态url -- 使用methods指定http访问方法,如果方法不被允许会返回405异常
构造url - url_for -- 根据endpoint得到对应的url
返回html页面 -- 使用 render_template函数
web开发知识
1、web开发 网站 工具平台
2、基于http协议
3、web服务器 nginx只支持 -- 静态服务器 -- 展示静态页面
4、后端api开发 (前端-- 用户看到的界面(html,css,js) 后端 -- 业务逻辑 -- flask)
如何动态生成html?如何接受http请求,解析http请求,发送http响应?
这些tcp,http原始请求和响应应该有专门的的服务器软件实现,我们只需要关心业务逻辑就可以了需要统一的接口规则,去让python应用的web服务器与python编写web业务之间做一个统一
这个接口就是 : WSGI(Python Web Server Gateway Interface) 它是python语言定义的web服务器和web应用程序或框架之间一种简单而通用的接口规范
专门的 WSGI 服务器 -- python web服务器 -- gunicorn , uwsgi
gunicorn -- 跑整个逻辑 配置简单,能做到高并发
uwsgi -- 配置复杂点
web开发 模式
1、mvc 设计模式
模型(Model):数据保存
视图(View):用户界面展示
控制器(Controller):业务逻辑处理
2、前后端分离 api(用户程序接口) 前后端分离 -- 提高效率
Flask框架
flask 和 Django 是python中常用web框架之一 flask vs django 轻量级(需要什么就装什么) 重(有很多东西都已经集成好,不管需不需要) 自由、灵活、扩展性强 笨重,不灵活 适合web服务 api开发
##########################################################################
虚拟环境
它是一个虚拟化,从电脑独立开辟出来的环境。python虚拟环境可以理解为真实环境的一个副本,在这个虚拟环境下安装的模块不会影响全局环境,
反过来,如果开启python虚拟环境的话,全局环境也不会对虚拟环境产生影响,相当于一个独立的空间。
好处:当我们同时开发多个项目的时候,如果没有使用虚拟环境,不同的项目会将第三方的包存放在相同的路径下,如果有两个工程依赖同一个包,但是所需要的版本却不一样
就会发生冲突,Python虚拟环境的主要目的是为了给不同的工程创建互相独立的运行环境。在虚拟环境下,每一个项目都有自己的依赖包,而与其它的项目无关。不同的虚拟环境中同一个包可以有不同的版本,可以使用pycharm,git来创建虚拟环境
使用gitee来创建虚拟环境
在Pycharm里面设置刚才虚拟环境的解释器
因为我们在git里面已经生成了虚拟环境,所以可以直接在pycharm里面修改全局解释器为虚拟环境里面的解释器
##########################################################################
使用app.run方式进行测试
from flask import Flask
# 通常实例化的时候要传入一个import_name,通常使用__name__
# 生成flask核心对象,app就是核心对象
app = Flask(__name__)
# 有专门的服务器来运行flask,app.run只能测试用的,不能用作生产环境
# app.run()
#
#
# # 路由也是要绑定到app核心对象
@app.route("/")
def index():
return "this is index"
app.run()
测试结果
##########################################################################
使用gunicorn测试
注意:gunicorn要放到linux环境下运行,在windows会报错。
1、安装 flask 和 gunicorn
[root@wangsh python_test]# pip3 install flask
[root@wangsh python_test]# pip3 install gunicorn
2、在linux下测试gunicorn
gunicorn -w 4 -b 0.0.0.0:8000 server:app
-w 4 :开启4个进程
-b 0.0.0.0:8000 绑定本机0.0.0.0的8000端口
server:app : server文件的app核心对象
[root@wangsh python_test]# gunicorn -w 4 -b 0.0.0.0:8000 server:app
[2022-08-15 14:59:53 +0800] [7374] [INFO] Starting gunicorn 20.1.0
[2022-08-15 14:59:53 +0800] [7374] [INFO] Listening at: http://0.0.0.0:8000 (7374)
[2022-08-15 14:59:53 +0800] [7374] [INFO] Using worker: sync
[2022-08-15 14:59:53 +0800] [7377] [INFO] Booting worker with pid: 7377
[2022-08-15 14:59:53 +0800] [7378] [INFO] Booting worker with pid: 7378
[2022-08-15 14:59:53 +0800] [7379] [INFO] Booting worker with pid: 7379
[2022-08-15 14:59:53 +0800] [7380] [INFO] Booting worker with pid: 7380
##########################################################################
Flask路由查找
当用户访问时,先在url_map里面找有没有请求的url,如果没有就会抛出404错误
找到对应的url后,再找对应的endpoint
然后再在view_function字典里面找对应endpoint的视图函数
# #############################flask路由
# 路由表示为用户请求的url找出其对应的处理函数的意思
from flask import Flask
# 通常实例化的时候要传入一个import_name,通常使用__name__
# 生成flask核心对象,
htapp = Flask(__name__)
@htapp.route("/")
def index():
return "this is index"
@htapp.route("/sc/xx/yy", endpoint="sc_index")
def index():
return "this is index"
htapp.run()
##########################################################################
动态url -- 使用methods指定http访问方法,如果方法不被允许会返回405异常
@htapp.route('/v1/user/<int:user_id>', methods=["POST", "GET"])
def show_userid(user_id): # 如果是动态url 这里需要接受参数
return f"user_id is {user_id}"
##########################################################################
构造url - url_for -- 根据endpoint得到对应的url
from flask import url_for
@htapp.route("/urlfor")
def geturl():
result = url_for('show_userid', user_id=10)
return f"index2 endpoint route is {result}"
返回html页面 -- 使用 render_template函数
新建两个文件夹 static 和 templates
先编写html页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试</title>
</head>
<body>
<h1>图片展示</h1>
<img src="{{ url_for('static', filename='images/1.jpg')}}">
<h1>文本展示</h1>
<p>姓名:{{ content.name}}</p>
<p>年龄:{{ content.age}}</p>
</body>
</html>
然后编写返回页面函数
# 返回页面 -- render_template -- 渲染函数,生成动态页面的。
from flask import url_for,render_template
@htapp.route("/img")
def getimg():
user = {"name":"sc","age":18}
result = render_template('index.html', content = user)
return result
开启debug功能 -- 开启后修改代码就不用再重新执行。
# 内置小型web服务器配置
htapp.debug = True # 开启debug模式,只用作测试环境
# 或者还可以指定 ip和端口
htapp.run(debug=True, host='0.0.0.0', port=8000)
# htapp.run()