「Python 基础」Web 应用编程

  • CS,Client/Server 客户端升级麻烦;
  • BS,Browser/Server;

除了重量级软件如OfficePS等,大部分软件都以Web形式提供,如新浪新闻、博客、微博等;

Web开发的几个阶段

  1. 静态 Web 页面,每次修改页面都直接通过手动修改 HTML 源文件保存,无法处理交互;
  2. CGI,Common Gateway Interface,用于处理用户发送的动态数据(C/C++编写);
  3. ASP/JSP/PHP,脚本语言开发效率高,与 HTML 结合紧密,迅速取代低级语言的 CGI;
  4. MVC,为了解决直接用脚本语言签入 HTML 导致的可维护性差的问题,Web 应用引入了 Model-View-Controller的模式,简化 Web 开发;
  5. 目前异步开发,MVVM 前端技术层出不穷;

文章目录

    • 1. HTTP 协议简介
      • 1. HTTP 请求
      • 2. HTTP 格式
    • 2. HTML 简介
      • 1. CSS
      • 2. JavaScript
    • 3. WSGI 接口
      • 1. 实现 WSGI 接口
      • 2. 运行 WSGI
    • 4. 使用 Web 框架
      • 1. Flask
      • 2. 其他 Web 框架
    • 5. 使用模板
      • 1. MVC
      • 2. Jinja2
      • 3. 其他模板

1. HTTP 协议简介

HTTP/1.1 版本允许多个 HTTP 请求复用一个TCP连接;

1. HTTP 请求

请求-响应模式,一个请求只处理一个响应;

  1. 必须先有客户端向服务端发出请求,请求包括;
  • 类型:GET、POST、DELETE …
  • 路径:/full/url/path
  • 域名:www.sina.com.cn
  • 其他 Header
  • 如果是 POST,请求还包括一个 Body
  1. 服务端想客户端返回 HTTP 响应,响应包括;
  • 响应代码:200 成功,3XX 重定向,4XX 请求有错,5XX 服务端处理请求错误
  • 响应类型:由 Content-Type 指定
  • 其他 Header
  • Body:包含了响应的内容,网页的 HTML 源码等
  1. 如果返回的内容还包含其他 HTTP 请求,重复 1. 2;

2. HTTP 格式

  • 每个Header一行,多个Header用换行符’\r\n’分割;
  • HeaderBody用两个’\r\n’分割;
  • Body的数据类型由Content-Type头确定;
  • Content-Encoding指定压缩方式;

2. HTML 简介

HTML 定义了一套语法规则,来告诉浏览器如何把网页显示出来;

HTML 文档是有一系列 Tag 组成,最外层的 Tag 是<html>,规范的要包括<head>...</head><body>...</body>

HTML 是富文档模型,因此还有一系列 Tag 用来表示链接、图片、表格、表单等;

1. CSS

Cascading Style Sheets 层叠样式表,用来控制 HTML 里所有元素的展现方式;

2. JavaScript

为了让 HTML 具交互性而添加的,可以内嵌在 HTML,也可以外部链接到 HTML;

对于优秀的 Web 开发人员,精通 HTML、CSS、JavaScript 是必须的

3. WSGI 接口

Web Server Gateway Interface

用于接收 HTTP 请求,解析 HTTP 请求,发送 HTTP 响应的 Python 标准接口,是 Web 服务端或网关端与 Web 业务端或框架端的桥梁;

无论多复杂的 Web 应用,入口都是一个 WSGI 处理函数,HTTP 请求的所有输入信息通过environ获取,HTTP 响应通过start_response()输出Header,通过函数返回值输出Body

1. 实现 WSGI 接口

def application(environ, start_response):
    start_response('200 oK', [('Content-Type', 'text/html')])
    body = f"<h1>Hello, {environ['PATH_INFO'][1:] or 'web'}!</h1>"
    return [body.encode('utf-8')]
  • environ 一个包含所有 HTTP 请求信息的 dict 对象;
  • start_response 一个发送 HTTP 响应的函数,只能发送一次,格式见上例;
  • return HTTP 响应的 Body,bytes;

2. 运行 WSGI

Python 内置了一个 WSGI 服务器模块wsgiref,纯 Python 编写的参考实例,完全符合 WSGI 标准,单不考虑运行效果,仅供开发和测试使用;

from wsgiref.simple_server import make_server

# 创建一个服务器,IP地址为空,端口是 8000,处理函数是 application
httpd = make_server('', 8000, application)
print('Serving HTTP on port 8000...')
# 开始监听HTTP 请求
httpd.serve_forever()

4. 使用 Web 框架

面对客服端的不同请求,若使用 WSGI,需对environ的不同信息作出不同处理逻辑,这样的代码很难维护;

Web 框架负责URL到函数的映射,解析 HTTP 请求的参数,让我们可以专注于一个函数处理一个URL

1. Flask

Python 最流行的 Web 框架;

安装

pip install flask

示例

from flask import Flask
from flask import request

app = Flask(__name__)


@app.route('/', methods=['GET', 'POST'])
def home():
    return '<h1>Home</h1>'


@app.route('/signin', methods=['GET'])
def signin_form():
    return '''<form action="/signin" method="post">
              <p><input name="username"></p>
              <p><input name="password" type="password"></p>
              <p><button type="submit">Sign In</button></p>
              </form>'''


@app.route('/signin', methods=['POST'])
def signin():
    # 需要从request对象读取表单内容:
    if request.form['username'] == 'admin' and request.form[
            'password'] == 'password':
        return '<h3>Hello, admin!</h3>'
    return '<h3>Bad username or password.</h3>'


if __name__ == "__main__":
    app.run()

Flask 通过装饰器关联URL和函数,通过request.form['name']获取表单内容;

Flask 自带的服务器(调试使用)端口为 5000;

2. 其他 Web 框架

  • Django 全能型
  • web.py 小巧
  • Bottle 类似 Flask
  • Tornado 异步

5. 使用模板

分离出 Python 代码与 HTML 代码,HTML 代码全部放在模板里;

1. MVC

Model-View-Controller

Controller 处理 URL 的函数,负责业务逻辑;

View .html 模板页,负责显示逻辑,通过简单的变量替换,最终输出用户看到的 HTML;

Model 用来传给 View 替换的变量;

2. Jinja2

安装

$ pip install janja2

示例

from flask import Flask, request, render_template

app = Flask(__name__)


@app.route('/', methods=['GET', 'POST'])
def home():
    # 使用模板: ./templates/home.html
    return render_template('home.html')


@app.route('/signin', methods=['GET'])
def signin_form():
    return render_template('form.html')


@app.route('/signin', methods=['POST'])
def signin():
    # 需要从request对象读取表单内容:
    username = request.form['username']
    password = request.form['password']
    if username == 'admin' and password == 'password':
        return render_template('signin-ok.html', username=username)
    return render_template('form.html',
                           message='Bad username or password',
                           username=username)

Flask通过render_templates()函数实现模板的渲染;

{{ name }}表示一个需要替换的变量;

{% ... %}表示循环、条件判断等指令;

3. 其他模板

  • Mako,<% … %> 和 ${xxx}
  • Cheetah,<% … %> 和 ${xxx}
  • Django,{% … %} 和 {{ xxx }}

  • 上一篇:「Python 基础」数据库应用编程
  • 专栏:《Python 基础》

PS:欢迎各路道友阅读评论,感谢道友点赞关注收藏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/652.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue基础23之路由第二节

Vue基础23路由路由的query参数src/router/index.jsDetail.vueHomeMessage.vue路由的query参数命名路由src/router/index.jsHomeMessage.vueApp.vue总结路由的params参数src/router/index.jsHomeMessage.vueDetail.vue总结路由 路由的query参数 src/router/index.js //该文件专…

Gehpi的网络布局

Gehpi的网络布局1. 力引导布局2. 辅助布局布局是网络可视化中的重要概念&#xff0c;指将点和边通过某种策略进行排布&#xff0c;应尽可能满足以下4个原则&#xff1a; 节点均匀分布在有限的区域内避免边的交叉和弯曲保持边的长度一致整体布局能反映图内在的特性 Gephi的布局…

卷积神经网络

目录卷积神经网络概述神经网络原理卷积神经网络卷积层怎么控制输出数据&#xff1f;如何抓取特征池化层归一化层全连接层局部感受野权值共享多卷积核池化子采样多卷积层卷积神经网络的训练前向传播BackForward反向传播权值更新过程中的卷积网络结构层的排列规律层的尺寸设置规律…

web3:区块链共识机制系列-POS(Proof of Stake)股权证明算法

web3相关学习一并收录至该博客&#xff1a;web3学习博客目录大全 前情衔接&#xff1a;web3:区块链常见的几大共识机制及优缺点 目录前言算法公式与原理算法公式运作原理以Peer Coin为例缺陷优点缺点特点分类发展历程casper协议1.什么是无成本利益关系问题2.引入casper协议解决…

SpringBoot 动态操作定时任务(启动、停止、修改执行周期)增强版

前段时间编写了一篇博客SpringBoot 动态操作定时任务&#xff08;启动、停止、修改执行周期&#xff0c;该篇博客还是帮助了很多同学。 但是该篇博客中的方法有些不足的地方&#xff1a; 只能通过前端控制器controller手动注册任务。【具体的应该是我们提前配置好我们的任务&am…

selenium(4)-------自动化测试脚本(python)

webdriverAPI 一)定位元素的方式&#xff0c;必问 1.1)id来定位元素&#xff0c;前提是元素必须具有id属性&#xff0c;因为有的元素是没有id的 1.2)name&#xff0c;元素必须有name&#xff0c;并且必须全局唯一 1.3)tagname&#xff0c;元素是一定有的&#xff0c;但是必须全…

HTTP 缓存的工作原理

缓存是解决http1.1当中的性能问题主要手段。缓存可能存在于客户端浏览器上&#xff0c;也可以存在服务器上面&#xff0c;当使用过期缓存可能给用户展示的是错误的信息而导致一些bug。 HTTP 缓存&#xff1a;为当前请求复用前请求的响应 • 目标&#xff1a;减少时延&#xff1…

Python+Yolov8目标识别特征检测

Yolov8目标识别特征检测如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01;前言这篇博客针对<<Yolov8目标识别特征检测>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应用推荐…

3分钟看完-丄-Python自动化测试【项目实战解析】经验分享

目录&#xff1a;导读 引言 自动化测试 背景 测试团队 测试体系发展 测试平台 自动化测试现状 现状一&#xff1a; 现状二&#xff1a; 现状三&#xff1a; 现状四&#xff1a; 现状五&#xff1a; 现状六&#xff1a; 失败的背景 失败的经历 失败总结 引言 内…

Java多线程系列--synchronized的原理

原文网址&#xff1a;Java多线程系列--synchronized的原理_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java的synchronized的原理。 反编译出字节码 Test.java public class Test {private static Object LOCK new Object();public static int main(String[] args) {synchro…

动态矢量瓦片缓存库方案

目录 前言 二、实现步骤 1.将数据写入postgis数据库 2.将矢量瓦片数据写入缓存库 3.瓦片接口实现 4.瓦片局部更新接口实现 总结 前言 矢量瓦片作为webgis目前最优秀的数据格式&#xff0c;其主要特点就是解决了大批量数据在前端渲染时出现加载缓慢、卡顿的问题&#xff0…

LeetCode 112. 路径总和

LeetCode 112. 路径总和 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 叶…

Python笔记 -- 文件和异常

文章目录1、文件1.1、with关键字1.2、逐行读取1.3、写入模式1.4、多行写入2、异常2.1、try-except-else2.2、pass1、文件 1.1、with关键字 with关键字用于自动管理资源 使用with可以让python在合适的时候释放资源 python会将文本解读为字符串 # -*- encoding:utf-8 -*- # 如…

Linux操作系统基础的常用命令

1&#xff0c;Linux简介Linux是一种自由和开放源码的操作系统&#xff0c;存在着许多不同的Linux版本&#xff0c;但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中&#xff0c;比如手机、平板电脑、路由器、台式计算机。1.1Linux介绍Linux出现于1991年&#xff0c…

操作技巧 | 在Revit中借用CAD填充图案的方法

在建模过程中&#xff0c;有时需要达到多种填充效果&#xff0c;而CAD中大量的二维填充图案&#xff0c;便是最直接的资源之一。 使用 填充图案之前 使用 填充图案之后 其中要用到主要命令便是对表面填充图案的添加与编辑 简单效果 如下 模型填充与绘图填充 区别 模型填…

Java for循环嵌套for循环,你需要懂的代码性能优化技巧

前言 本篇分析的技巧点其实是比较常见的&#xff0c;但是最近的几次的代码评审还是发现有不少兄弟没注意到。 所以还是想拿出来说下。 正文 是个什么场景呢&#xff1f; 就是 for循环 里面还有 for循环&#xff0c; 然后做一些数据匹配、处理 这种场景。 我们结合实例代码来…

SpringBoot+WebSocket实时监控异常

# 写在前面此异常非彼异常&#xff0c;标题所说的异常是业务上的异常。最近做了一个需求&#xff0c;消防的设备巡检&#xff0c;如果巡检发现异常&#xff0c;通过手机端提交&#xff0c;后台的实时监控页面实时获取到该设备的信息及位置&#xff0c;然后安排员工去处理。因为…

Java实现调用第三方相关接口(附详细思路)

目录1.0.简单版2.0.升级版2-1.call.timeout()怎么传入新的超时值2-2.timeout(10, TimeUnit.SECONDS)两个参数的意思&#xff0c;具体含义3.0.进阶版3-1.java.net.SocketTimeoutException: 超时如何解决4.0.终极版1.0.简单版 以下是一个使用 Java 实际请求“第三方”的简单示例代…

一眼看破五花八门的链表结构

文章目录&#x1f4d5;一&#xff1a;五花八门的链表结构&#x1f4d6;链表与数组的简单对比&#x1f4d6;单链表&#x1f4d6;循环链表&#x1f4d6;双向链表&#x1f4d5;二&#xff1a;链表VS数组性能大比拼&#x1f47f;最后说一句&#x1f431;‍&#x1f409;作者简介&am…

数据挖掘(2.1)--数据预处理

一、基础知识 1.数据的基本概念 1.1基础知识 数据是数据对象(Data Objects)及其属性(Attributes)的集合。 数据对象(一条记录、一个实体、一个案例、一个样本等)是对一个事物或者物理对象的描述。 数据对象的属性则是这个对象的性质或特征&#xff0c;例如一个人的肤色、眼球…
最新文章