文章目录
Flask
在用户使用浏览器访问网页的过程中,浏览器首先会发送一个请求到服务器,服务器接收到请求之后,会将请求转交给Flask进行处理。Flask会对用户所访问的URL进行解析,然后找到相应的响应内容,将其返回到浏览器。
开发环境搭建
参考文档:【SH】Ubuntu Server 24搭建Web服务器访问Python程序研发笔记
保持Flask运行
开启Ubuntu服务器,切换到项目目录,激活虚拟环境,运行app.py文件。如果开启了debug=True
参数,只需要启动一次,后续更改了app.py文件后会自动重启,挺方便的,当然如果修改后运行失败,重启也会失败的。😄
bash
sh@sheephero:~$ cd dip_project/
sh@sheephero:~/dip_project$ source dipenv/bin/activate
(dipenv) sh@sheephero:~/dip_project$ python app.py
app.py
文件:
python
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "<h1>Hello World!</h1>"
if __name__=='__main__':
# 运行Flask应用,监听默认端口5000
app.run(debug=True, host='0.0.0.0')
运行情况:
Debug调试
当Python程序运行出现出错的时候,就会出现如下界面,非常方便开发者进行调试!
路由和视图
仔细观察app.py
中的代码,hello
函数被 @app.route("/")
装饰器装饰,该装饰器用于定义路由,确定URL与Python函数之间的映射。而被装饰的hello函数便是视图函数,用于返回用户请求URL的响应内容。
可变路由
装饰器这部分,可以用<>
定义一个可变参数,同时在视图函数()
中添加这个参数,便可以设置动态路由,动态响应。
python
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "<h1>Hello World!</h1>"
@app.route("/user/<name>")
def user(name):
return "<h1>Hello, {}!</h1>".format(name)
if __name__=='__main__':
# 运行Flask应用,监听默认端口5000
app.run(debug=True, host='0.0.0.0')
请求和响应
HTTP的核心就是【请求】和【响应】,其性质为无状态协议,对事务处理没有记忆能力。这意味着每一次交互都是完全独立的。
获取请求信息
路由和视图函数部分代码:
python
@app.route("/info")
def info():
# 从request对象中获取用户请求信息
info_str = f"""
用户IP:{request.remote_addr} <br/>
请求方式:{request.method} <br/>
请求表单:{request.form} <br/>
用户浏览器:{request.user_agent} <br/>
用户Cookie:{request.cookies} <br/>
"""
return info_str
Request属性
属性名称 | 数据类型 | 说明 |
---|---|---|
method | str | 请求的提交方式 |
path | str | URL中的访问路径 |
full_path | str | URL中的访问路径,包含数据 |
remote_addr | str | 浏览器的IP地址 |
url | str | 请求的完整URL |
base_url | str | 请求的URL,不含数据 |
url_root | str | 请求的根URL,不含路径 |
user _ agent | str | 浏览器及操作系统信息 |
args | dict | 请求中提交表单的GET参数 |
form | dict | 请求中提交表单的POST参数 |
files | dict | 请求提交所上传的文件 |
cookies | dict | 浏览器Cookie数据 |
响应状态码
每次的HTTP交互中,都会响应状态码。通过浏览器的F12可以查看响应状态码。
路由和视图函数部分代码:
python
@app.route("/user/<name>")
def user(name):
if name in ['世界','羊大侠','SheepHero']:
return "<h3>Hello, {}!</h3>".format(name) # 正常响应默认200
else:
return f'用户 {name} 不存在!', 404
常见状态码
状态码 | 信息 | 说明 |
---|---|---|
200 | OK | 一切正常 |
301 | Moved Permanently | 重定向 |
400 | Bad Request | 客户端请求错误 |
403 | Forbidden | 无权限访问 |
404 | Not Found | 找不到页面 |
405 | Method Not Allowed | 客户端使用了不支持的提交方法 |
500 | Internal Server Error | 服务器端出错 |
502 | Bad Gateway | 代理与服务器之间访问出错 |
Cookie
HTTP每次的交互都是独立的,无法存储状态数据,Cookie就是为了解决这个问题。
Cookie的存储容量有限,一般不会超过4KB。因此,Cookie只能存储少量数据,如用户的一些偏好设置、临时信息等。当用户访问需要记录状态数据的网页时,服务器会在HTTP响应包头部加入设置Cookie的指令,浏览器接收到响应包后,将Cookie存储到本地,当用户再次访问页面时,浏览器会将Cookie数据加入HTTP请求包头部,从而使服务器获取到状态信息。
由于Cookie是存放在本地的,可以被查看及修改,安全性较低,所以一般不用来存储敏感数据。
python
from flask import Flask, request, make_response
import time
app = Flask(__name__)
@app.route('/visit')
def visit():
# 从Cookie获取最后访问时间
last_visit_time = request.cookies.get('last_visit_time', '首次访问')
resp = make_response(f'最后访问的时间:{last_visit_time}')
# 获取服务器当前时间并设置Cookie
last_visit_time = time.strftime('%Y-%m-%d %H:%M:%S')
# max_age用户设置Cookie的有效期(秒)
resp.set_cookie('last_visit_time', last_visit_time, max_age=86400)
return resp
if __name__=='__main__':
# 运行Flask应用,监听默认端口5000
app.run(debug=True, host='0.0.0.0')
同样的,在浏览器里面按【F12】点击Network,点击Cookies就可以查看Cookies信息。
在没有设置Cookie过期时间的情况下,当用户关闭浏览器(Chrome)时,Cookie将会被自动清除。
Session
Session与Cookie的作用相似,都用于存储状态数据。不同的是,Session只能在服务器端进行管理,用户在本地无法对其进行修改,因而安全性较高。Session一般用于存储用户登录状态等对安全性要求较高的信息。
为了保证数据的安全性,Session一般有以下两种存储方式。
(1). 使用Cookie记录一个随机生成的session_id,session_id用于记录Session与用户的映射关系,所有数据存储于服务器端,用户无法修改数据。
(2). 所有Session数据都在服务器端加密,然后存储在浏览器的Cookie中,若用户拥有加密算法及密钥,则Session数据可以被用户修改。(Flask默认以这种方式存储Session)
python
from flask import Flask, session
import time
app = Flask(__name__)
# 在使用Session之前,需要初始化 SECRET_KEY
app.config['SECRET_KEY'] = 'SheepHero' # 自定义
@app.route('/sign_in')
def sign_in():
# 设置Session持久性存储数据,关闭浏览器记录还会保存在服务器中
session.permanent = True
# 从Session获取最后的签到时间及签到次数
sign_in_time = session.get('sign_in_time','首次访问')
sign_in_count = session.get('sign_in_count', 0)
# 设置Session字典
session['sign_in_time'] = time.strftime('%Y-%m-%d %H:%M:%S')
session['sign_in_count'] = sign_in_count + 1
ret_str = f'上次签到时间:{sign_in_time} <br/> 这是第 {sign_in_count} 次签到'
return ret_str
if __name__=='__main__':
# 运行Flask应用,监听默认端口5000
app.run(debug=True, host='0.0.0.0')
有了Session,便可以实现安全的用户状态数据保存,从而实现登录功能。
表单
通过表单让用户和服务器进行数据交互。
python
from flask import Flask, request
import time
app = Flask(__name__)
# 在使用表单前,需要初始化 SECRET_KEY
app.config['SECRET_KEY'] = 'SheepHero' # 自定义
# 可以通过GET和POST两种方式获取表单数据
@app.route('/form', methods=['GET', 'POST'])
def form():
# args用户获取GET方式提交的数据
msg_get = request.args.get('msg_get')
# form用户获取POST方式提交的数据
msg_post = request.form.get('msg_post')
return f'GET数据:{msg_get} <br/> POST数据:{msg_post}'
if __name__=='__main__':
# 运行Flask应用,监听默认端口5000
app.run(debug=True, host='0.0.0.0')
GET请求
测试GET请求,浏览器输入http://172.16.37.37:5000/form?msg_get=你好!
即可
POST请求
测试POST请求,可以编写一个Python脚本,模拟POST请求
python
# 保存为post.py文件
import requests
url = 'http://172.16.37.37:5000/form'
payload = {
'name':'羊大侠',
'alias':'SheepHero',
'msg_post':'Py羊大侠'
}
response = requests.post(url, data=payload)
print(response)
print(response.text)