一, HTTP从请求到响应的过程
1- 域名解析。
一个域名(www.baidu.com)对应这一个IP地址。 使用DNS域名解析其对应的IP
2- TCP三次握手
(1) 客户端向指定服务器发送报文(报文分两段: 请求连接服务器数据+验证信息),客户端进入同步发送状态(SYN_Send)
(2) 服务器接收到报文后, 处理客户端验证信息后也向客户端发送报文(报文同样分两段, 请求连接客户端数据+处理后的验证信息),此时服务器进入同步接收状态(SYN_RECV)
(3) 客户端接收到服务器的报文后校验正确,发送确认包给服务器。 此时服务器和客户端均转为为确认连接状态(ESTABLISHED)。
…三次握手成功
3- TCP连接建立后, 客户端开始发起HTTP请求。
4- 服务器收到HTTP请求后,返回响应(json, html页面 或者 字符串)。
5- 浏览器解析html页面, 并获取html中的资源(图片或者一些js请求)。
6- 浏览器渲染html, 之后呈现给客户
7- TCP断开
NOTE: http的特点有简单快速, 其连接为短连接或者叫做无连接。是由客户端向服务器发送请求,服务器返回响应后就断开连接。
二,响应状态码
状态码详情查看以下链接
状态码详解
三, Flask框架介绍
1- Flask框架是一个基于python的微型框架。
2- Flask依赖两个外部库:
(1)Jinja2 模板引擎{% %}. 模板:静态html+模板语言{%%}
(2)Werzeug WSGI工具集
3- Flask是一个基于MVC设计模式的Web后端框架
M 指 Model 数据模型
V 指 View 界面
C 指 Controller 控制器
四, 第一个Flask项目
1- 创建虚拟环境。 进入cmd输入
mkviertualenv flask_env
2- 在虚拟环境中安装flask
pip install flask
3- 创建helloFlask.py文件, 并写入以下代码:
from flask import Flask
# 创建一个Flask对象
app = Flask(__name__)
@app.route('/')
def index():
"""
视图函数
:return:
"""
return "hello flask"
if __name__ == '__main__':
# 启动Flask应用
"""
host: 主机(ip), 如果'0'或者'0.0.0.0'。 则其他机器可以使用IP能访问。
port: 端口, 不要与其他端口冲突。
debug: 调试, 如果状态为True,页面异常后修复可以自动刷新
"""
app.run(host="0.0.0.0", port=6666, debug=True)
具体如下
4-run的说明
run中有3个参数
五, Flask拆分
0- 目的
当需要开发一个Flask项目时, 功能不会太少,所以一个正常的flask项目是需要足够的规范来避免项目维护困难
1- 拆分目录
2- 各个文件的功能
1- static:存放css活着js文件
h3 {color: red}
2- template: 存放html文件
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Flask</title>
<link rel="stylesheet" href="../static/index.css">
</head>
<body>
<h1>博客首页</h1>
<br>
<h3>欢迎登录</h3>
</body>
</html>
3- init.py: 创建app对象并串联各个部分
from flask import Flask
from App.views import blue
def create_app():
app = Flask(__name__)
# 注册蓝图
app.register_blueprint(blueprint=blue)
return app
4- views.py: Flask的启动项
from flask import Blueprint
from flask import render_template
blue = Blueprint('user', __name__)
@blue.route('/')
def hello_world():
return 'Hello World!'
@blue.route('/index/')
def index():
return render_template('index.html')
5- manage.py: Flask的启动项
from App import create_app
app = create_app()
if __name__ == '__main__':
app.run(debug=True)
六, 路由的参数
1- 路由路径参数大致分为 str, int, float, path, uuid, any
这些类型限制了路由的传参格式,也是对路由的一种管控
from flask import Blueprint
from flask import render_template
blue = Blueprint('user', __name__)
@blue.route('/')
def hello_world():
return 'Hello World!'
@blue.route('/index/')
def index():
return render_template('index.html')
# 传入 str, int, float, path, uuid
@blue.route('/book/<string:bookname>/')
def book(bookname):
return f"获取到的书籍名称为: {bookname}"
# 传入几个选项
@blue.route('/animal/<any(cat,dog,pig,mouse):animal>/')
def animal(animal):
return f"抓到了: {animal}"
2-路有中的请求参数
请求参数有很多, 最常用的为以下四种 GET, POST, DELETE, PUT
# GET, POST, DELETE, PUT
@blue.route('/blogpost/<blog_name>', method=['GET', 'POST'])
def blog_post(blog_name): # put application's code here
return f"文章内容: {blog_name}"
七, Request请求
1- Flask中内置了request包, 使用以下代码进行导入
from flask import request
2- Request的属性和方法
url: 完整的请求地址
base_url: 去掉GET参数的URL
host_url: 只有主机和端口号的URL
path: 路由中的路径
method: 请求方法
remote_addr: 请求的客户端地址
args: GET请求参数
form: POST请求参数
files: 文件上传
headers: 请求头
cookies: 请求中的cookie
八, Response响应
Flask中的4种响应方式
1- 直接返回字符串, 可以返回文本内容
return 'Hello World!'
2- render_template渲染模板
return render_template('index.html')
3- 通过make_response(data, code)返回
res = make_response('<h3>红楼梦</h3>')
return res
4- 返回Response对象
html = render_template('index.html')
res = Response(html)
return res
重定向
url = 'https://www.baidu.com'
# return redirect(url)
return redirect('/price/')
定制异常页面
@blue.route('/abort/')
def make_abort():
abort(502)
return "error"
@blue.errorhandler(502)
def error_handler(e):
print("e", e)
return "捕获到了异常"
九, Flask中使用Cookie
1- cookie是一种会话保持技术
2- 数据全部存储在客户端本地
3- 存储使用的键值对结构进行存储
1)设置cookie
response.set_cookie(key, value)
2)获取cookie
request.cookie.get(key)
2)删除cookie
response.delete_cookie()
具体使用见详情
https://editor.csdn.net/md/?articleId=127818418
十, Template页面展示
Template是使用Jinja2的模板引擎
1- 结构标签
block操作–挖坑
{% block xxx %}
{% endblock %}
extends操作–继承
继承指定的模板
{% extends xxx %}
保留块中的内容
{% super() %}
include操作–包含
{% include xxx %}
marco操作–宏操作
{% from xxx import xxx %}
{% marco hello(name) %}
{{name}}
{% endmarco %}
2- 语法
1- for循环的使用和参数:
loop.first
loop.last
loop.index
loop.revindex
{% for item in items %}
AA
{% else %}
BB
{% endfor %}
2- 过滤器
capitalize
lower
upper
title
trim
safe
reverse
first
last
sum
,…
对一些变量进行简单的过滤操作
{{ val | lower}}