【SH】在Ubuntu Server 24中基于Python Web应用的Flask Web开发(实现POST请求)学习笔记

文章目录

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 代理与服务器之间访问出错

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)
相关推荐
zhy295635 分钟前
【UBUNTU 20】环境变量
linux·运维·ubuntu
Adellle11 分钟前
判题机的开发(代码沙箱、三种模式、工厂模式、策略模式优化、代理模式)
java·后端·代理模式·策略模式
金金金__20 分钟前
探索:为什么数组数据后端确要求前端传递,拼接的字符呢
后端
Takoony22 分钟前
理解 Python ProcessPoolExecutor 的序列化问题:为什么线程锁(threading.Lock)会导致异常?
linux·开发语言·python
只恨天高23 分钟前
SpringBoot整合JDBC
java·spring boot·后端
道友老李23 分钟前
【Python基础】入门(运算、输出、数据类型)
开发语言·python
Crime_man34 分钟前
Ubuntu系统安装MySQL
mysql·ubuntu·adb
汝即来归40 分钟前
如何实现序列化和反序列化?如何处理对象的生命周期管理?
开发语言·python
豆本-豆豆奶1 小时前
Python 图像处理领域的十一个基础操作
开发语言·图像处理·python
vvw&1 小时前
如何在 Ubuntu 22.04 上安装 JupyterLab 环境教程
linux·运维·服务器·ubuntu·jupyter·开源·python3.11