自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 收藏
  • 关注

原创 Python WSGI 规范

作为 Python Web 开发者来说,在开发程序阶段一般是不会接触到 WSGI 这个名词的,但当程序开发完成,考虑上线部署的时候,WSGI 规范是一个绕不开的话题,本文将介绍何为 WSGI。WSGI 全拼 Web Server Gateway Interface,是为 Python 语言定义的 Web 服务器和 Web 应用程序(或框架)之间的一种通用编程接口。翻译成白话就是说 WSGI 是一个协议,就像 HTTP 协议定义了客户端和服务端数据传输的规范,WSGI 协议定义了 Web 服务器和 Web

2021-04-09 09:43:31 212 1

原创 Python 可变类型作为函数默认参数时的副作用

在 Python 中定义函数时,可以为其指定 默认参数,这样就不必在每次调用函数时都传递参数进去,并且可以简化我们的代码。在定义函数时,如果使用了 可变类型 来作为函数的 默认参数,往往会产生一些副作用。来看下面一段代码。def foo(li=[]): li.append(1) print(li)foo()foo()foo()你可能想得到如下的结果:[1][1][1]但实际上,结果却是:[1][1, 1][1, 1, 1]根据结果来看,似乎每次的函数调用,

2021-02-22 17:10:57 276

原创 Python 运算符 + 与 +=

Python 中如果需要对一个变量进行增量运算通常有两种写法,a = a + b 或 a += b。虽然两种方法能够得到同样的结果,但两者却并不完全等价。加法运算符 +对于 a = a + b 这条语句来说,实际上执行了两步操作,首先执行 a + b 求出两者的 和,然后再将结果通过赋值运算符 = 赋值给变量 a。来看下面的示例:>>> a = 100>>> b = 200>>> id(a)1796532544>>> a

2021-02-18 07:27:33 933 2

原创 Python 中对象的比较操作 == 与 is

Python 中对象的比较有两种方式 == 和 is。两种方式都能判断操作符两侧的变量值是否相等,那么它们的区别是什么呢?通过下面的介绍我们来一探究竟。比较操作符通常用于条件语句,如下示例:if a == b: passif a is False: pass== 与 is 的区别== 操作符比较对象的值是否相等。小明有一块 劳力士 手表,小李也有一块同款 劳力士 手表,这时我们就认为这两块手表相等。小明的手表 = 劳力士小李的手表 = 劳力士小明的手表 == 小李的手表

2021-02-11 09:35:23 652 3

原创 Python for...else... 语句

条件语句在编程语言中再寻常不过了,只要你需要编写程序,那么几乎一定会用到 if … else … 这样的条件语句进行条件判断。所以通用编程语言都会提供 if … else … 这样的语法。Python 也不例外,不过 Python 不只有 if … else … 这样的语法,它还提供了 for … else …、try … except … else … 等这样的语法。今天我们只讨论 for … else … 语法,来看看 Python 的 else 语句跟在 for 后面与跟在 if 后面有什么异同。先

2021-02-09 09:40:22 183 1

原创 用 Python 实现一个简易版 HTTP 客户端

此文为《用 Python 撸一个 Web 服务器》系列教程的一个补充,这个系列教程介绍了如何使用 Python 内置的 socket 库实现一个简易版的 Web 服务器。之所以写这篇文章,是因为我发现很多人并不清楚 HTTP 客户端的概念,以为只有浏览器才叫 HTTP 客户端。事实上并非如此,我们在 Web 开发中常见的 Postman、爬虫程序、curl 命令行工具 等,这些都可以称为 HTTP 客户端。服务器程序示例这里以一个 Hello World 程序来作为示例服务器,实现如下:# serv

2021-02-04 09:52:38 2518 1

原创 用 Python 撸一个 Web 服务器-第9章:项目总结

项目总结本教程带大家一起实现了一个 Todo List 程序,包含基础的增删改查功能,和用户登录认证。这也是 Web 开发中最常见的需求。我画了一张思维导图,帮助你从宏观的角度来概览 Todo List 程序,加深你对 Web 开发的理解。项目整体思路参考 MVC 设计模式。有意设计 utils/ 目录专门用来存储一些工具方法,这些工具方法通常比较独立,尽量不从外部模块导入依赖,其他模块需要某个工具方法时从 utils/ 目录下导入即可使用,这样就避免了循环导入的问题。诚然,Todo List 程

2021-02-03 09:09:24 114 2

原创 用 Python 撸一个 Web 服务器-第8章:用户管理

用户登录原理用户登录与注册功能几乎已成为 Web 应用的标配。所以我们有必要给 Todo List 程序增加一个用户管理模块,以此来学习用户登录原理。HTTP 协议是无状态的,这意味着每个完整的 HTTP 请求 —— 响应过程都是相对独立的,Web 服务器无法分辨前后两次连续请求是否为同一个用户(客户端)发送过来的。为了让服务器能够记住用户,就有了一种叫作 Cookie 的技术。我画了一张图来描述 Cookie 的工作过程:首先浏览器向服务器 / 路径发送了一个 GET 请求,服务器返回响应给浏览器

2021-02-02 09:20:00 427

原创 用 Python 撸一个 Web 服务器-第7章:重构——更好的组织代码

通过前几章的学习,我们完成了 Todo List 程序的 todo 管理部分,实现了对 todo 的增、删、改、查基本操作,这也是几乎所有 Web 程序都具备的功能。我们当然可以按照目前的思路继续来实现用户管理部分,在 models.py 中编写用户相关的模型,在 templates/ 目录下新建用户相关 HTML,在 controllers.py 中编写用户相关的视图函数。但是,随着新功能的加入,把不同功能的代码都写在相同的文件中必然会引起代码的混乱。为实现易维护、易扩展的代码,我们需要对项目的目录结构进

2021-02-01 08:27:43 199

原创 用 Python 撸一个 Web 服务器-第6章:完善 Todo List 应用

这一章,我们来完成 todo 管理功能的剩余部分:新增、修改和删除功能。新增 todo首先实现 Todo List 程序的新增功能。新增 todo 的逻辑如下:在首页顶部的输入框中输入 todo 内容。然后点击新建按钮。将输入框中的 todo 内容通过 POST 请求传递到服务器端。服务器端解析请求中的 todo 内容并存储到文件。重新返回到程序首页。接下来对这些步骤进行具体实现。首页 HTML 中添加新增 todo 的输入框和新建按钮:<!-- todo_list/todo/

2021-01-31 09:26:39 156

原创 用 Python 撸一个 Web 服务器-第5章:处理静态资源

处理静态文件由于我们实现的模板引擎不支持直接将 CSS 嵌入在 HTML 中的写法,所以要将 CSS 独立出来。在 todo/ 目录下新建 static/ 目录,专门用来存储 CSS、JavaScript、图片等静态文件,在 static/ 目录下新建 css/ 目录用来存储 CSS 样式。我们把之前在 todo/templates/index.html HTML 页面中写的 CSS 移动到 todo/static/css/ 目录下的 style.css 文件中:/* todo_list/todo/st

2021-01-30 07:49:54 290

原创 用 Python 撸一个 Web 服务器-第4章:动态渲染数据

上一章中为了尽快让 Todo List 程序跑起来,并没有完全按照 MVC 模式编写程序。这一章就让我们一起实现一个完整的 MVC 模式 Todo List 程序首页。使用模型操作数据我们来分析下请求 Todo List 程序首页时,模型层需要做哪些事情。当一个请求到达首页视图函数 index 时,它需要做两件事情,首先调用模型层获取全部的 todo 数据,然后将 todo 数据动态填充到 index.html 模板中。调用模型层获取全部的 todo 数据,只需要在模型层编写读取 todo/db/to

2021-01-29 09:13:37 183

原创 用 Python 撸一个 Web 服务器-第3章:使用 MVC 构建程序

Todo List 程序介绍我们将要编写的 Todo List 程序包含四个页面,分别是注册页面、登录页面、首页、编辑页面。以下分别为四个页面的截图。注册页面:登录页面:首页:编辑页面:程序页面非常简洁,甚至有些 Low。但这足够我们学习开发 Web 服务器程序原理,页面样式的问题并不是我们本次学习的重点,所以读者不必纠结于此。Todo List 程序功能大概分为两个部分,一部分是 todo 管理,包含增删改查基础功能;另一部分是用户管理,包含注册和登录功能。初识 MVC介绍了 T

2021-01-28 09:24:48 250

原创 用 Python 撸一个 Web 服务器-第2章:Hello World

从一个 Hello World 程序说起要编写 Web 服务器,需要用到一个 Python 内置库 socket。Socket 是一个比较抽象的概念,中文叫套接字,它代表一个网络连接。两台计算机之间要进行通讯,大概分为三个步骤:建立连接,传输数据,关闭连接。而 socket 库为我们提供了这个能力。按照国际惯例,我们将通过编写一个 Hello World 程序来开始 Web 服务器的学习 。首先要创建一个基于 TCP 的 socket 对象:# 导入 socketimport socket#

2021-01-27 15:15:07 311

原创 用 Python 撸一个 Web 服务器-第1章:Web 开发简介

前言Web 开发技术一直在高速发展,各种新奇概念与框架层出不穷,尤其在 Web 前端领域,几年前还是 jQuery 的天下,而如今在 Vue、React 等框架面前也显得廉颇老矣。不过,虽然各种框架技术日新月异,但 Web 开发的核心概念与本质依旧不曾改变,本教程将通过一个 Todo List 应用带你探索 Web 开发基本原理,只有真正明白了 Web 开发的核心基础,才能更轻松的应对新框架与技术。Web 开发简介我们常见的软件种类有桌面软件、移动 APP以及网页应用等,Web 开发通常就是在开发网

2021-01-26 17:09:22 402

原创 Python 闭包

闭包(closure)作为一个不太容易理解的概念出现在很多主流编程语言中,Python 中很多高级实现都离不开 闭包,装饰器 就是使用 闭包 的典型例子。作用域要学习 闭包,先了解 作用域 的概念。作用域 是程序运行时变量的存在范围。常见 作用域 有 全局作用域 和 局部作用域,定义在全局作用域中的变量,在程序运行过程中的任何地方都可以访问到;而定义在函数内部的变量只有在函数内部才能够访问,函数内部的作用域就是局部作用域,为了便于理解,我这里称它为函数作用域。全局作用域不可以读取 函数作用域 中的局

2021-01-25 09:47:22 90

原创 Python 装饰器

Python 中一切皆对象,函数也是对象。函数可以赋值给一个变量,函数可以当作参数传递个另一个函数,函数可以通过 return 语句返回函数。而装饰器就是一个能够接收函数并返回函数的函数。这话乍听起来有点绕,但装饰器本质上就是一个函数。既然要学习装饰器,首先就要知道它用于什么场景,装饰器通过面向切面编程来增强代码的健壮性,比如:记录日志,处理缓存,权限校验等。接下来我们就一步一步的学习 Python 中装饰器的用法。先来看一个简单的函数定义,函数只有一个功能,打印 Hello World:def he

2021-01-23 20:49:04 116

原创 JavaScript 异步操作之 Promise

由于 JavaScript 通常是由单线程来执行代码,所以在编写 JavaScript 代码时经常需要使用异步操作来提高程序性能。一般来说异步执行在 JavaScript 中使用 回调函数 的形式来实现。不过近年来由于社区的推动,Promise 已经成为 JavaScript 异步编程的一个标准,使用 Promise 进行异步编程,代码的可维护性将有很大提升,尤其是使用 Promise 取代多层 回调函数 嵌套的问题。Promise 简介下面是构造一个最简单的 Promise 代码示例:// 构造 P

2021-01-21 17:16:32 153

原创 JavaScript 异步操作之回调函数

本文试图尝试站在初学 异步 编程的角度来解释什么是 回调函数。同步和异步在介绍 回调函数 之前,先来看两个概念 同步 和 异步。同步 行为通常指代码从上到下一行一行的顺序执行,后面的代码总是在前面的代码执行完成以后才会执行。同步 操作的例子如下:let a, b;function foo() { a = 1;}foo();b = a + 1;console.log(b); //2由于代码顺序执行,先调用函数 foo();,后执行 b = a + 1;,所以在执行 b = a

2021-01-21 17:10:28 1764 1

原创 JavaScript 立即执行函数

立即执行函数,顾名思义,即创建后被立刻执行的函数。在实际工作中,立即执行函数并不是必须用到的语法,不过使用立即执行函数有个好处是能够简化代码。立即执行函数语法在 JavaScript 中一个普通的函数定义语法如下:function foo() { console.log(123);}如果要调用这个函数,那么我们会执行:foo();如果把它改成立即执行函数的写法是这样的:(function foo() { console.log(123);}());或者这样的:(f

2021-01-21 17:07:00 182

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除