当前位置: 首页 > article >正文

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

文章目录

  • Flask
  • 开发环境搭建
    • 保持Flask运行
    • Debug调试
  • 路由和视图
    • 可变路由
  • 请求和响应
    • 获取请求信息
    • Request属性
    • 响应状态码
    • 常见状态码
    • Cookie
    • Session
  • 表单
    • GET请求
    • POST请求

Flask

在用户使用浏览器访问网页的过程中,浏览器首先会发送一个请求到服务器,服务器接收到请求之后,会将请求转交给Flask进行处理。Flask会对用户所访问的URL进行解析,然后找到相应的响应内容,将其返回到浏览器。

开发环境搭建

参考文档:【SH】Ubuntu Server 24搭建Web服务器访问Python程序研发笔记

保持Flask运行

开启Ubuntu服务器,切换到项目目录,激活虚拟环境,运行app.py文件。如果开启了debug=True参数,只需要启动一次,后续更改了app.py文件后会自动重启,挺方便的,当然如果修改后运行失败,重启也会失败的。😄

sh@sheephero:~$ cd dip_project/
sh@sheephero:~/dip_project$ source dipenv/bin/activate
(dipenv) sh@sheephero:~/dip_project$ python app.py

app.py文件:

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')

运行情况:

保持Flask运行

Debug调试

当Python程序运行出现出错的时候,就会出现如下界面,非常方便开发者进行调试!
调试

Debug调试

路由和视图

仔细观察app.py 中的代码,hello 函数被 @app.route("/") 装饰器装饰,该装饰器用于定义路由,确定URL与Python函数之间的映射。而被装饰的hello函数便是视图函数,用于返回用户请求URL的响应内容。

可变路由

装饰器这部分,可以用<>定义一个可变参数,同时在视图函数()中添加这个参数,便可以设置动态路由,动态响应。

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的核心就是【请求】和【响应】,其性质为无状态协议,对事务处理没有记忆能力。这意味着每一次交互都是完全独立的。

获取请求信息

路由和视图函数部分代码:

@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属性

属性名称数据类型说明
methodstr请求的提交方式
pathstrURL中的访问路径
full_pathstrURL中的访问路径,包含数据
remote_addrstr浏览器的IP地址
urlstr请求的完整URL
base_urlstr请求的URL,不含数据
url_rootstr请求的根URL,不含路径
user _ agentstr浏览器及操作系统信息
argsdict请求中提交表单的GET参数
formdict请求中提交表单的POST参数
filesdict请求提交所上传的文件
cookiesdict浏览器Cookie数据

响应状态码

每次的HTTP交互中,都会响应状态码。通过浏览器的F12可以查看响应状态码。

路由和视图函数部分代码:

@app.route("/user/<name>")
def user(name):
    if name in ['世界','羊大侠','SheepHero']:
        return "<h3>Hello, {}!</h3>".format(name) # 正常响应默认200
    else:
        return f'用户 {name} 不存在!', 404

运行情况

常见状态码

状态码信息说明
200OK一切正常
301Moved Permanently重定向
400Bad Request客户端请求错误
403Forbidden无权限访问
404Not Found找不到页面
405Method Not Allowed客户端使用了不支持的提交方法
500Internal Server Error服务器端出错
502Bad Gateway代理与服务器之间访问出错

Cookie

HTTP每次的交互都是独立的,无法存储状态数据,Cookie就是为了解决这个问题。

Cookie的存储容量有限,一般不会超过4KB。因此,Cookie只能存储少量数据,如用户的一些偏好设置、临时信息等。当用户访问需要记录状态数据的网页时,服务器会在HTTP响应包头部加入设置Cookie的指令,浏览器接收到响应包后,将Cookie存储到本地,当用户再次访问页面时,浏览器会将Cookie数据加入HTTP请求包头部,从而使服务器获取到状态信息。

由于Cookie是存放在本地的,可以被查看及修改,安全性较低,所以一般不用来存储敏感数据。

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')

Cookie运行情况

同样的,在浏览器里面按【F12】点击Network,点击Cookies就可以查看Cookies信息。
没有设置Cookie过期时间的情况下,当用户关闭浏览器(Chrome)时,Cookie将会被自动清除。

Cookie信息

Session

Session与Cookie的作用相似,都用于存储状态数据。不同的是,Session只能在服务器端进行管理,用户在本地无法对其进行修改,因而安全性较高。Session一般用于存储用户登录状态等对安全性要求较高的信息。
为了保证数据的安全性,Session一般有以下两种存储方式。
(1). 使用Cookie记录一个随机生成的session_id,session_id用于记录Session与用户的映射关系,所有数据存储于服务器端,用户无法修改数据。
(2). 所有Session数据都在服务器端加密,然后存储在浏览器的Cookie中,若用户拥有加密算法及密钥,则Session数据可以被用户修改。​(Flask默认以这种方式存储Session​)

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,便可以实现安全的用户状态数据保存,从而实现登录功能。

在这里插入图片描述

表单

通过表单让用户和服务器进行数据交互。

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=你好!即可

get测试情况

POST请求

测试POST请求,可以编写一个Python脚本,模拟POST请求

# 保存为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)

post测试情况


http://www.kler.cn/a/447927.html

相关文章:

  • python面试篇-多并发详解(多线程,多进程,协成整理)---一篇搞定
  • 如何实现单例模式?
  • 图形学笔记 - 5. 光线追踪2 - 加速结构
  • lpips使用笔记
  • apache-tomcat-6.0.44.exe Win10
  • Restaurants WebAPI(三)——Serilog/
  • 基于Spring Boot的动漫交流与推荐平台
  • Cadence学习笔记 8 添加分页符
  • Vue CLI 脚手架创建项目流程详解 (2)
  • 【git】git命令
  • 《Java源力物语》-2.异常训练场
  • 易语言OCR银行卡文字识别
  • 【Java基础面试题030】Java和Go的区别?
  • EGO Swarm翻译
  • SPL06 基于stm32F103 HAL库驱动(软件模拟IIC)
  • 设计模式之 abstract factory
  • Ubuntu 20.04下Kinect2驱动环境配置与测试【稳定无坑版】
  • 国标GB28181平台EasyGBS在安防视频监控中的信号传输(电源/视频/音频)特性及差异
  • 本地Push Git失败
  • QtCreator配置github copilot实现AI辅助编程
  • Django中注册模型到Admin界面
  • 动手学深度学习-多层感知机-7前向传播、反向传播和计算图
  • labelme标签批量转换数据集json_to_dataset
  • oracle dblink 的创建及使用
  • 在Java虚拟机(JVM)中,方法可以分为虚方法和非虚方法。
  • Dijkstra(迪杰斯特拉)最短路径算法可视化演示