web开发项目设计:
立项-需求分析-设计(原型图、数据库、api设计)-技术选型-写代码-测试-上线
web开发的本质上就是生成超文本。
前端负责展示,后端负责逻辑处理:后逻辑请求(接收请求、响应请求)
概念:
Flask是一个由python语言编写开发而成的轻量级web开发框架,基于 Werkzeug 和 jinjia2 这两个库
特点:(和Django对比着讲)
灵活、轻量、适合api开发、简单
三行启动一个简单flask程序
from flask import Flask
#
app = Flask(__name__)
#内置小型服务器启动app应用,只适用在开发时候。线上生成环境使用专门的wsgi server
app.run()
我们用python专注于HTML文档,不希望接触到TCP连接,HTTP原始请求和响应格式。
python中有专门的web服务器 – gunicorn、uwsgi
ps:nginx只负责静态页面的展示,不能互动的,带不起我们的python程序(app),(Java-tomcat)。
WSGI 是为python语言定义的web服务器和web应用程序之间一种简单而通用的接口规范
flask是响应html内容的,不用管连接,交给服务器。
推荐使用gunicorn启动flask程序(如linux中)
pip3 install flask
pip3 install gunicorn
[root@nfs ~]# cat flask_init_test.py
from flask import Flask
app = Flask(__name__)
[root@nfs ~]# gunicorn -b 0.0.0.0 flask_init_test:app
[2023-08-31 20:42:53 +0800] [1821] [INFO] Starting gunicorn 21.2.0
[2023-08-31 20:42:53 +0800] [1821] [INFO] Listening at: http://0.0.0.0:8000 (1821)
[2023-08-31 20:42:53 +0800] [1821] [INFO] Using worker: sync
[2023-08-31 20:42:53 +0800] [1824] [INFO] Booting worker with pid: 1824
路由页面(传参)示例:
from flask import Flask
app = Flask(__name__)
#使用装饰器做
@app.route("/")
def index():
return "hello world!"
#不使用装饰器做:路由和函数绑定
def secondindex():
return "second index"
app.add_url_rule("/index2", view_func=secondindex)
#通过url传递参数:使用一对尖括号声明变量
@app.route("/login2/<username>/<passwd>")
def login2(username, passwd):
if username == "root" and passwd == "123456":
return f"login success"
else:
return f"login false"
@app.route("/stu/<age>")
def stu(age):
if int(age) >=18:
return "已经成年,可以上网"
else:
return "未成年不能上网噢"
app.run() #开发环境,内置web服务器
ps:出现重新启动flask程序,页面不刷新的问题
解决方法:
在终端下
(venv) D:\sq-flask>netstat -aon|findstr 5000
TCP 127.0.0.1:5000 0.0.0.0:0 LISTENING 16164
(venv) D:\sq-flask>taskkill /t /f /pid 16164
成功: 已终止 PID 16164 (属于 PID 1544 子进程)的进程。
重新启动flask程序即可。
开启debug模式:
举例:
app.run(debug=True, host=“0.0.0.0”, port=8000)
Debug后的一些讲解flask路由管理原理:
url_map:保存的是url和endpoint的映射关系
Map([<Rule ‘/static/’ (OPTIONS, HEAD, GET) -> static>,
<Rule ‘/’ (OPTIONS, HEAD, GET) -> index>,
<Rule ‘/index2’ (OPTIONS, HEAD, GET) -> secindex>,
<Rule ‘/login//’ (OP
TIONS, HEAD, GET) -> login>,
<Rule ‘/stu/’ (OPTIONS, HEAD, GET) -> stu>])
view_functions:保存的是endpoint和视图函数的映射关系
{‘static’: <function Flask.init.. at 0x0000020BD2600790>, ‘index’: <function index at 0x0000020BD2617040>, ‘secindex’: <function secindex at 0x0000020BD260CEE0>, ‘login’: <function login at 0x0000020BD2617280>, ‘stu’: <function stu at 0x0000020BD2617310>}
引入中间层:解耦,后续扩展
面试题:讲讲flask的路由管理原理
回答:1.首先flask的路由管理由两张表管理,一张url_map表,一张view_functions表,其中url_map中保存url和endpoint的映射关系,view_functions中保存endpoint和视图函数的映射关系。 2.接收到请求之后,先解析http头部,拿到请求的url路径在url_map表里找,如果没有没有找到,直接返回"404 NOT FOUND",如果找到对应的endpoint,则在view_functions表里找到对应的function,然后交给它处理返回。3.endpoint在整个生命周期是全局唯一的。
http(超文本传输协议):
1991年,0.9版本,命令GET
1996年,1.0版本,引入POST和HEAD等命令
1997年,1.1版本,引入持久连接(背景:http是无状态协议即这次请求和下次请求是完全独立的)
2015年,2.0版本(二进制分帧实现低延迟和高吞吐量;多路复用;)
http方法:
增POST、删DELETE、改PUT、查GET、HEAD获得头部信息、OPTIONS查询接口支持什么方法。(不强迫但最好遵守规范)
接受客户端请求:
1.客户端所有请求都封装在一个对象中(request对象)
2.客户端请求过来的数据包中 – 携带的数据、http包头
from flask import Flask, request
app = Flask(__name__)
@app.route("/login")
def login():
print(request.args)
return "login html"
app.run(debug=True, host="0.0.0.0", port=9000)
3.request常用属性:
args 接收传递过来的url携带的参数
服务端获取:
print(request.args.get(“username”)) —jd
print(request.args.get(“passwd”)) —123456