Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python入门(18+)

Python入门(18+)

作者头像
高一峰
发布于 2020-09-22 01:56:36
发布于 2020-09-22 01:56:36
4440
举报
文章被收录于专栏:高渡号外高渡号外
Python入门(18+)

Web极简开发

各位朋友,大家好!

嗯,今天的开场白怎么不一样了?

哈哈,是啊!要知道这个可是我们的又年轻又帅又有才的Python导师刘之昂老师的口头禅哦。

这里借来用一下,是因为我们今天要送给大家的彩蛋正是刘之昂老师在高渡网(https://www.igaodu.cn)发布的新的视频课程《Python Web开发》要讲的内容哦,我们这里先打开一个门缝,让大家往里边瞧瞧吧。因为很多人一看到“Python Web开发”这么高大上的东西,就开始有畏难的学习情绪了。

但是,真的是那么难吗?真的有必要学吗?

这样说吧,当我们巴心巴肝的学完了Python的基础知识,咱好歹也算是一名Python程序员了,可是我们应该去哪里施展我们的拳脚呢?实话实说,学习Python技术,用武之地可多了,Web开发算一种,其他的还有数据挖掘数据分析机器学习人工智能,几乎你能想到的软件能做的事,Python都能行!

为什么要从Web开发学起呢?这个还真不一定啊。不过呢,作为初学者,Web开发的确是一个非常好的技术路径的入口,毕竟这是一个网络的时代,Web应用极其普遍,小到网站,大到平台,都被称为Web开发。Web不止是一个网站,Web技术正是一切网络应用技术的基础和入口。很难想象,在今天我们还会创建一个独立于网络之外的应用,这就是我们为什么一定要学习Web应用技术的原因。

当然,完整的Web开发技术,绝不是一堂课能学会的,有兴趣的同学赶紧上高渡网站,查找《Python Web开发》,就能找到刘之昂老师完整的视频课程了。

今天我们仅就Web开发的核心理念,来做一些有意义的探索。通过一个极简的案例,来一窥Python Web应用的奇迹,从而为大家打开一扇通往Web应用的大门。

那我们就废话少说,大家一起来看看我们的第一个WEB应用吧。

1、Web技术的本质

  • 浏览器向服务器发送一个HTTP请求。
  • 服务器收到请求,生成一个HTML文档。
  • 服务器把HTML文档作为HTTP响应请求的消息发送给浏览器。
  • 浏览器在接收到HTTP响应后,从HTTP返回的消息中,取出HTML文档,并显示出来,供浏览者阅读。

最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,然后从文件中读取HTML文档信息,返回给浏览器。一些常见的静态服务器就是这样干的。

如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应等等,都不是一件轻松的事情。如果让我们自己来写这些底层代码,光是阅读HTTP规范,没有1-2个月时间不定能搞清楚,所以,这肯定不是一个正确的方向。

正确的做法是底层代码交由专门的服务器软件实现,我们用Python写代码,主要是专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口(WSGI接口),让我们专心用Python编写Web的业务逻辑。

2、Hello, web

我们来看看python是如何搭建一个极简的Web网站的。

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

上面的application()函数就是符合WSGI标准的一个HTTP处理函数,它接收两个参数:

environ:一个包含所有HTTP请求信息的dict对象;

start_response:一个是发送HTTP响应的函数。

在application()函数中,调用:start_response()函数,就发送了HTTP响应的Header头部标签。因为Header只能发送一次,所以,start_response()函数也只能调用一次。

start_response()函数接收两个参数,一个是http响应码,一个是一组 list 表示的http Header,每个Header用一个包含两个字符串(str)的元组(tuple)表示。

通常情况下,都应该把Content-Type头发送给浏览器。其他很多常用的HTTP Header也应该发送。

然后,函数的返回值'<h1>Hello, 小明!</h1>'将作为HTTP响应的Body发送给浏览器。

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

  • 确保以上两个文件在同一个目录下。
  • 然后通过运行server.py来启动WSGI服务器。

上图:我们在Python里运行server.py,

启动了服务器,

并连通了服务器的8000端口。

然后,我们就可以打开浏览器,

在地址栏输入:localhost:8000,

就能访问网站了。

如下图所示。

小结

真正的商业Web应用要远比这个演示程序复杂很多,有兴趣的同学请访问高渡网站,就能找到刘之昂老师的Python Web开发课程了。

那么,到此为止,我们的Python入门课程就真的全部分享完了。

尚未尽兴的同学,请继续关注我们,接下来我们还会不定期推出一些非常有价值又易于学习的课程或内容,分享给大家。

有任何问题或指正,欢迎给我们留言,方便我们改进和为大家提供更好的服务。

谢谢你们!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 高渡号外 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
多线程五 锁的膨胀过程
上一篇中,涉及到了锁升级的过程,也对其锁的升级有了一个大概的了解:单线程持有,在jvm延迟偏向的时间内是轻量级锁,之后为偏向锁,出现多个线程交替执行,对同一资源加锁会升级为轻量级锁,多个线程竞争拿不到锁会升级为重量级锁。在上一篇的基础上再进一步的了解锁升级的过程。
用针戳左手中指指头
2021/01/29
3110
JVM - 剖析Java对象头Object Header之对象大小
JVM - 写了这么多年代码,你知不道new对象背后的逻辑? 中大体介绍了Java中 new 对象背后的主要流程,其中对象头的部分,我们仅仅是点到为止,这里我们深入剖一下Object Header的奥秘 。
小小工匠
2021/08/17
1.7K0
3分钟带你了解对象的创建过程
在之前的文章中,我们介绍了类加载的过程和 JVM 内存布局相关的知识。本篇我们综合之前的知识,结合代码一起推演一下对象的真实创建过程,以及对象创建完成之后在 JVM 中是如何保存的。
Java极客技术
2024/02/22
4200
3分钟带你了解对象的创建过程
线程并发带来的安全性问题 之 同步锁(一)
在下面的案例中,演示了两个线程分别去去调用 demo.incr 方法来对 i 这个变量进行叠加,预期结果 应该是20000,但是实际结果却是小于等于20000的值。
架构探险之道
2023/03/04
2850
线程并发带来的安全性问题 之 同步锁(一)
深入解析JVM-Java对象头组成
上一章节带着大家初探JVM的类加载机制,以及双亲委派机制,本文主要介绍了Java对象头的组成以及详解
janyxe
2022/04/17
2.9K0
深入解析JVM-Java对象头组成
多线程基础(五):java对象的MarkWord及synchronized锁升级过程
在前面聊过了如何使用synchronized,以及synchronized不同的加锁方式分别锁的是哪些对象。本文对synchronized底层的原理进行深层次的分析。
冬天里的懒猫
2020/09/10
9770
多线程基础(五):java对象的MarkWord及synchronized锁升级过程
线程并发带来的安全性问题 之 同步锁(二)
上一节我们学习了线程并发常见的安全性问题、锁的底层类型和对象结构的差异、锁升级相关知识。今天我们继续学习锁是如何升级的?
架构探险之道
2023/03/04
3560
线程并发带来的安全性问题 之 同步锁(二)
承前启后,Java对象内存布局和对象头
大家好,我是小高先生。在我之前的一篇文章《并发编程防御装-锁(基础版)》中,我简要介绍了锁的基础知识,并解释了为什么Java中的任何对象都可以作为锁。在那里,我提到了对象头中有一个指向ObjectMonitor的指针,但没有深入探讨Java对象的内存结构。本文将引导大家深入了解Java对象的内存布局以及对象头结构,帮助大家更好地理解Java中的对象和锁,并为之后学习synchronized和锁升级打下基础。
小高先生
2024/02/21
2380
多线程四 并发中锁的原理
偏向锁就是在运行过程中,对象的锁偏向某个线程,即在开启偏向锁的情况下,某个线程获得锁,当该线程下次想要获得锁时,不需要再获取锁(忽略synchronized关键字),直接执行代码
用针戳左手中指指头
2021/01/29
6180
多线程四 并发中锁的原理
深入了解Java锁
继 打印Java对象头,我们再深入探索一下Java锁。无锁状态我们就不说了,下面我们一一打印偏向锁、轻量锁,重量锁的对象头。
@阿诚
2021/02/04
4770
HotSpot 虚拟机对象探秘
Mark Word记录了对象和锁有关的信息,当这个对象被synchronized关键字当成同步锁时,围绕这个锁的一系列操作都和Mark Word有关。
黑洞代码
2021/04/23
5310
HotSpot 虚拟机对象探秘
synchronized 底层如何实现?什么是锁升级、降级?
synchronized 代码块是由一对 monitorenter/monitorexit 指令实现的,Monitor 对象是同步的基本实现单元。
王小明_HIT
2020/05/08
1.5K0
synchronized 底层如何实现?什么是锁升级、降级?
【JUC进阶】03. Java对象头和内存布局
为了后面更好的学习锁优化以及运作过程,需要我们对HotSpot虚拟机的Java对象内存布局有一定的了解,也作为技术储备。
有一只柴犬
2024/01/25
6080
【JUC进阶】03. Java对象头和内存布局
[JAVA基础] - JVM对象内存布局及锁的标记位
一、对象布局 1、对象头 1)存储对象自身的运行时数据 hash码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等。占位32/64位虚拟机分别占32/64个比特,官方称"Mark Word" 2)类型指针 指向对象的元数据,如果是数组,还会存储数组长度。 2、实例数据 3、对齐填充 要求对象是8的整数倍,对象头已经是8位的整数倍,只填充实例数据即可。 二、Object o = new Object()内存占用情况 占用16个字节 对象头12个字节,对齐填充4个字
夹胡碰
2022/05/19
4770
[JAVA基础] - JVM对象内存布局及锁的标记位
Synchronized 源码分析
前面我们已经介绍和分析了管程,而 Synchronized 则是 JVM 层面中管程的一种实现,它通过对细节的屏蔽方便了开发人员的使用。
itliusir
2020/02/10
1.1K0
Java | synchronized 不同情况下的对象头测试
这里通过改动 testSynchronizedLock 方法代码进行测试,下面的测试情况只说明改动后的 testSynchronizedLock的代码,其余代码不再说明。因为只关注对象头的变化,其余的值也省略了。
双鬼带单
2021/12/06
4310
对象实例化与内存布局(深入)
创建对象方式有:new、Class的newInstance()、Constructor的newInst(Xxx)、使用clone()、使用反序列化、第三方库Objenesis;
逍遥壮士
2021/05/24
1.2K0
对象实例化与内存布局(深入)
synchronized的实现原理——锁膨胀过程
上一篇分析了优化后的synchronized在不同场景下对象头中的表现形式,还记得那个结论吗?当一个线程第一次获取锁后再去拿锁就是偏向锁,如果有别的线程和当前线程交替执行就膨胀为轻量级锁,如果发生竞争就会膨胀为重量级锁。这句话看起来很简单,但实际上synhronized的膨胀过程是非常复杂的,有许多场景和细节需要考虑,本篇就对其进行详细分析。
夜勿语
2020/09/15
8590
JVM 系列(4)一看就懂的对象内存布局 审核中
Java 中一切皆对象,同时对象也是 Java 编程中接触最多的概念,深入理解 Java 对象能够更帮助我们深入地掌握 Java 技术栈。在这篇文章里,我们将从内存的视角,带你深入理解 Java 对象在虚拟机中的表现形式。
用户9995743
2022/09/26
4970
JVM 系列(4)一看就懂的对象内存布局 审核中
JVM - 剖析Java对象头Object Header之指针压缩
同一个对象, 不开启指针压缩 8字节 存入堆中和 开启指针压缩4字节存入堆中,哪个更好一些,显而易见。
小小工匠
2021/08/17
1.1K0
相关推荐
多线程五 锁的膨胀过程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档