百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

用Python写一个Web应用,周边知识梳理(建议收藏)

bigegpt 2024-08-23 11:34 5 浏览

首先这是网络编程的范畴,因此带你们来了解一下这部分的知识。

网络协议

首先,要在网络上进行通信,就需要有相关网络协议,例如TCP/IP,UDP……等等。

当然你可以说我直接选用一个框架作为开始,不想了解这么多东西。那样也没问题,不过到一定的时间,相信你还是会愿意回过头来看一看这些基础知识的。

提到网络编程,你一定见过Socket,翻译过来是套接字。这个是啥,相信你也和我一样在初见到它的时候一头雾水,我觉得是翻译的不好,引用一段我觉得还算不错的解释:

Socket是网络编程的一个抽象概念。通常我们用一个Socket表示“打开了一个网络链接”,而打开一个Socket需要知道目标计算机的IP地址和端口号,再指定协议类型即可。

那么,抛开各种框架不谈,直接用Python去进行网络编程时,一般会用到socket模块。具体示例代码,我随便找了本书上的伪代码抄在下面。

流程是这样:先创建一个服务器端,再创建一个客户端,

然后它们开始参与发送和接收的对话,直到连接终止。

具体操作的时候,我们需要打开两个命令行窗口,一个运行服务器程序,另一个运行客户端程序,就可以看到对话的效果了。

到这里你应该有了一个大致的概念:在网络上通信,需要通信的双方,以及网络协议,然后建立起联系。

Web开发

Web当然是网络的一部分。

在Web应用中,服务器把网页传给浏览器,实际上就是把网页的HTML代码发送给浏览器,让浏览器显示出来。而浏览器和服务器之间的传输协议是HTTP,所以:

  • HTML是一种用来定义网页的文本,会HTML,就可以编写网页;
  • HTTP是在网络上传输HTML的协议,用于浏览器和服务器的通信。

看来,HTTP协议是Web开发中,十分重要的协议了。关于HTTP协议的具体知识,推荐一本书《图解HTTP协议》。

因此,在Web应用中,经常在做接受HTTP请求、解析HTTP请求、发送HTTP响应这些苦力活。所以,如果需要自己动手实现,就得接触到TCP连接、HTTP原始请求和响应格式,估计还得阅读不少相关规范。

WSGI

可是大部分Web应用的开发者并不想把时间耗费在这些苦力活上,因此,WSGI应运而生了。其全称是Web Server Gateway Interface。

WSGI接口定义非常简单,它只要求Web开发者实现一个函数,就可以响应HTTP请求。

Python也内置了一个WSGI服务器,这个模块叫wsgiref,它是用纯Python编写的WSGI服务器的参考实现。所谓“参考实现”是指该实现完全符合WSGI标准,但是不考虑任何运行效率,仅供开发和测试使用。

了解了WSGI框架,我们发现:其实一个Web App,就是写一个WSGI的处理函数,针对每个HTTP请求进行响应。

但是当HTTP请求、URL多起来的时候,问题又出现了:如何处理URL和处理函数之间的映射关系?

WSGI提供的接口虽然比HTTP接口高级了不少,但和Web App的处理逻辑比,还是比较低级,我们需要在WSGI接口之上能进一步抽象,让我们专注于用一个函数处理一个URL,至于URL到函数的映射,就交给Web框架来做。

因此,Python内置的WSGI服务器当然不足以满足许多人的需要,好在我们还有其他的框架可以选用。

Web框架

目前运行在WSGI协议之上的Web框架非常多。从个人经验角度而言:轻量级选Flask、重量级选Django,当然还有其他的,不过我没有去深入了解,各位可以自行搜索。

学习它们的教程也很多,比如Flask就有“狼书”《Flask Web开发实战:入门、进阶与原理解析》、“狗书”《Flask Web开发:基于Python的Web应用开发实战》等不错的参考书籍。

当然,这些框架也都对WSGI进行了各自的实现。

因为每个Web框架都不是专注于实现服务器方面的,所以这些WSGI服务器一般也就是开发调试时使用。在生产环境部署的时候,不会简单的使用Web框架自带的服务器。

实际环境使用的WSGI服务器

  • Gunicorn

最流行的大概就是这个了吧。

  • uwsgi

因为使用C语言开发,会和底层接触的更好。

一般生产环境上,也就是二者选其一了。我目前在用的是Gunicorn。

小结

阅读完这篇文章,你应该能够从网络编程的基本原理,到框架选用,再到生产环境的部署,都有了相关概念了。

为了帮助小伙伴们更好的学习Python,技术学派整理了Python的相关学习视频及学习路线图。

领取方式

关注“技术学派”后,评论转发文章,私信回复:Python学习

相关推荐

悠悠万事,吃饭为大(悠悠万事吃饭为大,什么意思)

新媒体编辑:杜岷赵蕾初审:程秀娟审核:汤小俊审签:周星...

高铁扒门事件升级版!婚宴上‘冲喜’老人团:我们抢的是社会资源

凌晨两点改方案时,突然收到婚庆团队发来的视频——胶东某酒店宴会厅,三个穿大红棉袄的中年妇女跟敢死队似的往前冲,眼瞅着就要扑到新娘的高额钻石项链上。要不是门口小伙及时阻拦,这婚礼造型团队熬了三个月的方案...

微服务架构实战:商家管理后台与sso设计,SSO客户端设计

SSO客户端设计下面通过模块merchant-security对SSO客户端安全认证部分的实现进行封装,以便各个接入SSO的客户端应用进行引用。安全认证的项目管理配置SSO客户端安全认证的项目管理使...

还在为 Spring Boot 配置类加载机制困惑?一文为你彻底解惑

在当今微服务架构盛行、项目复杂度不断攀升的开发环境下,SpringBoot作为Java后端开发的主流框架,无疑是我们手中的得力武器。然而,当我们在享受其自动配置带来的便捷时,是否曾被配置类加载...

Seata源码—6.Seata AT模式的数据源代理二

大纲1.Seata的Resource资源接口源码2.Seata数据源连接池代理的实现源码3.Client向Server发起注册RM的源码4.Client向Server注册RM时的交互源码5.数据源连接...

30分钟了解K8S(30分钟了解微积分)

微服务演进方向o面向分布式设计(Distribution):容器、微服务、API驱动的开发;o面向配置设计(Configuration):一个镜像,多个环境配置;o面向韧性设计(Resista...

SpringBoot条件化配置(@Conditional)全面解析与实战指南

一、条件化配置基础概念1.1什么是条件化配置条件化配置是Spring框架提供的一种基于特定条件来决定是否注册Bean或加载配置的机制。在SpringBoot中,这一机制通过@Conditional...

一招解决所有依赖冲突(克服依赖)

背景介绍最近遇到了这样一个问题,我们有一个jar包common-tool,作为基础工具包,被各个项目在引用。突然某一天发现日志很多报错。一看是NoSuchMethodError,意思是Dis...

你读过Mybatis的源码?说说它用到了几种设计模式

学习设计模式时,很多人都有类似的困扰——明明概念背得滚瓜烂熟,一到写代码就完全想不起来怎么用。就像学了一堆游泳技巧,却从没下过水实践,很难真正掌握。其实理解一个知识点,就像看立体模型,单角度观察总...

golang对接阿里云私有Bucket上传图片、授权访问图片

1、为什么要设置私有bucket公共读写:互联网上任何用户都可以对该Bucket内的文件进行访问,并且向该Bucket写入数据。这有可能造成您数据的外泄以及费用激增,若被人恶意写入违法信息还可...

spring中的资源的加载(spring加载原理)

最近在网上看到有人问@ContextConfiguration("classpath:/bean.xml")中除了classpath这种还有其他的写法么,看他的意思是想从本地文件...

Android资源使用(android资源文件)

Android资源管理机制在Android的开发中,需要使用到各式各样的资源,这些资源往往是一些静态资源,比如位图,颜色,布局定义,用户界面使用到的字符串,动画等。这些资源统统放在项目的res/独立子...

如何深度理解mybatis?(如何深度理解康乐服务质量管理的5个维度)

深度自定义mybatis回顾mybatis的操作的核心步骤编写核心类SqlSessionFacotryBuild进行解析配置文件深度分析解析SqlSessionFacotryBuild干的核心工作编写...

@Autowired与@Resource原理知识点详解

springIOCAOP的不多做赘述了,说下IOC:SpringIOC解决的是对象管理和对象依赖的问题,IOC容器可以理解为一个对象工厂,我们都把该对象交给工厂,工厂管理这些对象的创建以及依赖关系...

java的redis连接工具篇(java redis client)

在Java里,有不少用于连接Redis的工具,下面为你介绍一些主流的工具及其特点:JedisJedis是Redis官方推荐的Java连接工具,它提供了全面的Redis命令支持,且...