HTTP基本原理
1.http简述:
http协议永远都是客户端发起请求,服务端回送请求。客户端和服务端本质上是一个socket客户端和服务端,http协议可以说是基于socket的再上层封装
2.http特性:
1)短链接
2)被动响应
3)无状态
Socket基本原理
结合上图及下面的python代码,我们来一起学习一下socket的基本原理
 #!/usr/bin/env python
#_*_coding:utf-8_*_
#Author:Tiger At import socket #导入socket模块 def main():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #创建socket实例,AF_INET表示IPV4,SOCK_STREAM表示TCP连接
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #表示客户端失去连接后,服务端可以立即释放端口
sock.bind(('0.0.0.0', 8000)) #进行服务器的端口绑定
#开始TCP监听。backlog指定在拒绝连接之前,操作系统可以挂起的最大连接数量。该值至少为1,大部分应用程序设为5就可以了。
sock.listen(5) while True:
# 等待浏览器访问
conn, addr = sock.accept()
# 接收浏览器发送来的请求内容
data = conn.recv(1024)
print(data) # 给浏览器返回内容
conn.send(b"HTTP/1.1 200 OK\r\nContent-Type:text/html; charset=utf-8\r\n\r\n")
conn.send("电脑前的你长的真好看!".encode("utf-8")) # 关闭和浏览器创建的socket连接
conn.close() if __name__ == "__main__":
main()

socket_server

总结一下就是:创建socket实例->绑定IP地址及端口号(对外提供服务)->监听外来请求->接受请求->处理请求(数据交互)->关闭连接

#!/usr/bin/env python
#_*_coding:utf-8_*_
#Author:Tiger At
import socket
client = socket.socket() #创建socket实例 client.connect(("x.x.x.x",9999)) #与服务器建立连接
while True:
msg = input(">>>>>:").strip()
if len(msg) == 0:continue
client.send(msg.encode('utf-8')) #发送请求 data = client.recv(1024) #接收数据
print(data) client.close() #关闭连接

socket_client

总结一下就是:创建socket实例->主动发起连接->发送请求->接收结果->关闭连接

讲了这么多,这个到底与http有什么关系呢?上面我们提到过说:http的本质其实就是socket客户端和服务端,只是client变成了浏览器,而服务端只需要能处理浏览器的请求,并返回
相应结果就可以了。我这边摘出了"socket_server"中的部分代码,做详细解释:

# 给浏览器返回内容
conn.send(b"HTTP/1.1 200 OK\r\nContent-Type:text/html; charset=utf-8\r\n\r\n")   #表示:返回状态码为 200  Content-Type表示文本格式 charset表示字符编码。这些都是浏览器所需的信息不能缺少
conn.send("电脑前的你长的真好看!".encode("utf-8"))

#注上面要是直接写成 conn.send("电脑前的你长的真好看!"),只有再shell界面中能看到这个字符串了,浏览器是不会识别的

WSGI简介

WSGI(Web Server Gateway Interface)是一种规范,它定义了使用python编写的web app(应用程序)与web server(socket服务端)之间接口格式,实现web app与web server间的解耦。

通俗的说:当规范建立后,程序就不再重复编写web server(socket服务端),而是直接使用现成的实现WSGI的模块(例如:wsgiref、uwsgi、werkzeug),从而让程序员更加专注与业务代码

与其重复造轮子,不如直接用现成的。

Python的wsgiref是基于WSGI规范封装的模块,我们可以在这个模块基础上开发我们的web server

#!/usr/bin/env python
#_*_coding:utf-8_*_
#Author:Tiger At from wsgiref.simple_server import make_server #导入wsgiref模块 def run_server(environ, start_response):
"""
当有用户在浏览器上访问:http://127.0.0.1:8000/, 立即执行该函数并将函数的返回值返回给用户浏览器
:param environ: 请求相关内容,比如浏览器类型、版本、来源地址、url等
:param start_response: 响应相关
:return:
""" start_response('200 OK',[('Content-Type', 'text/html;charset=utf-8')])
return [bytes('<h1>我旁边的这个人长的真丑呀!!',encoding='utf-8'),] if __name__ == '__main__':
httpd = make_server('0.0.0.0',8001,run_server)
httpd.serve_forever()

wsgi_server

可以清晰的看到,使用了wsgiref模块后,我们直接使用make_server代替了服务器初始化的过程,使代码更加规范。我们再来看看下面的代码:

#!/usr/bin/env python
#_*_coding:utf-8_*_
#Author:Tiger At from wsgiref.simple_server import make_server def western():
return "欢迎来到欧美专区" def japan():
return "欢迎来到日本人专区" def routers():
"""负责把url与对应的方法关联起来"""
urlpatterns = (
('/western/',western),
('/japan/',japan),
) return urlpatterns def run_server(environ, start_response):
"""
当有用户在浏览器上访问:http://127.0.0.1:8000/, 立即执行该函数并将函数的返回值返回给用户浏览器
:param environ: 请求相关内容,比如浏览器类型、版本、来源地址、url等
:param start_response: 响应相关
:return:
"""
start_response('200 OK',[('Content-Type', 'text/html;charset=utf-8')])
url = environ.get("PATH_INFO")
urlpatterns = routers() func = None for item in urlpatterns:
if item[0] == url:
func = item[1]
break
if func:
return [bytes(func(),encoding="utf-8"),]
else:
return [bytes('404 not found.',encoding="utf-8"),] if __name__ == '__main__':
httpd = make_server('0.0.0.0',8001,run_server)
httpd.serve_forever()

对比之前的代码,我们可以看到我们做了相关路由选择功能urlpatterns,因此我们可以根据访问的url不通而显示不同的内容

小结

Web框架的本质

虽然自己写Web Server比较麻烦,但是我们从中也了解web框架的本质:

a.浏览器是socket客户端,网站是socket服务端

b.wsgi,是一个规范,wsgiref实现了这个规范并在其内部实现了socket服务端

c.根据 url 的不同执行不同函数,即:路由系统

d.函数,即:视图函数

e.图片、css、js文件 统一称为静态文件,需要读取内容直接返回给用户浏览器

Django初识

写在前面,既然web框架的本质如上面的小结所示,那django基本也是按照这个思路进行相应功能的封装和优化的,从而使用户更加关注于业务代码,让我们开始Django吧

开始一个Django项目:

1.使用 django-admin startproject mysite(此为项目名称,可根据具体需求定义)
├───mysite
│ │ manage.py #管理程序的文件,启动和结束等
│ │
│ └───mysite
│ settings.py #程序的配置文件
│ urls.py #程序的路由系统,即url和处理其函数的对应关系
│ wsgi.py #指定框架的wsgi
│ __init__.py
2.创建APP
python manage.py startapp app01(此为业务模块名称)
├───app01
│ │ admin.py #业务admin管理(数据库后台)
│ │ apps.py #业务配置(django把项目和app关联起来的一个文件)
│ │ models.py #数据库相关操作
│ │ tests.py #业务单元测试
│ │ views.py #业务代码(重要)
│ │ __init__.py
│ │
│ └───migrations #数据库相关
│ __init__.py 3.第一次django 请求
1)匹配路由,路由分发器查找用户请求得url对应关系
a.如果找到了业务函数就调用
b.找不到就报404
2)业务函数,执行业务逻辑
3)返回数据给浏览器 具体实现方式:
1) urls.py 编写路由
2)在views.py写一个业务函数
a.编写业务代码
b.通过HttpResponse方法返回数据给前端
3)python manage.py runserver 0.0.0.0:8000
注:127.0.0.1 环回测试地址,代表本机IP地址,访问127.0.0.1:80表示本机的80号端口,且仅表示内网访问
0.0.0.0 网络地址,0.0.0.0:80也表示本机IP地址,以外网的方式访问
这两种表示法用以对计算机端口进行权限设置
如果listen(0.0.0.0:XX),则这个可以被外部网络访问
而 listen(127.0.0.1:XX) 则这个端口只能被本机访问
4.模板初探
1)配置settings.py:
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,"html")],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
2)views.py 调用render方法
return render(response,"login.html") 声明:
1.本节内容用户自我学习与自我回顾使用
2.本文主要参考:https://www.cnblogs.com/alex3714/articles/8662706.html
https://www.cnblogs.com/alex3714/articles/5830365.html
进行梳理学习,详细内容可参阅如上URL。
3.希望可以与大家一起共同进步。

Django 00-socket、wsgi及初始django学习心得的更多相关文章

  1. Django 中的 WSGI

    Django 源码小剖: Django 中的 WSGI 2013-09-06 22:31 by 捣乱小子, 334 阅读, 0 评论, 收藏, 编辑 Django 其内部已经自带了一个方便本地测试的小 ...

  2. Django与socket

    Web框架本质是socket 各种socket一般都遵循wsgi协议 Django里面没有socket Django映射到Web框架,用了一个别人的socket:wsgiref 所以:django默认 ...

  3. django自带wsgi server vs 部署uwsgi+nginx后的性能对比

    一.下面先交代一下测试云主机 cpu: root@alexknight:/tmp/webbench-1.5# cat /proc/cpuinfo |grep model model : model n ...

  4. 初始Django

    Django概述 Django是什么 Django是一个开放源代码的Web应用框架,由Python写成.采用了MVC的软件设计模式,即模型M,视图V和控制器C. Django的主要目标是使得开发复杂的 ...

  5. 如何理解Nginx, WSGI, Flask(Django)之间的关系

    如何理解Nginx, WSGI, Flask(Django)之间的关系 值得指出的是,WSGI 是一种协议,需要区分几个相近的名词: uwsgi 同 wsgi 一样也是一种协议,uWSGI服务器正是使 ...

  6. Django之环境搭建以及初始配置

    Django采用MVC架构,百度百科介绍如下: 全名Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业 ...

  7. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

  8. django基础(web框架,http协议,django安装)

    学习Django之前我们先来看什么是OSI七层模型: 应用层 表示层       应用层(五层模型中把这三层合成一个应用层) http协议 会话层 传输层                  提供端口对 ...

  9. [部署开发环境]部署django的生成环境nginx+uwsgi+django

    #教程 # ubuntu部署django项目 # 部署准备 - ubuntu操作系统 -- vagrant虚拟 - Nginx服务器 -- 安装在ubuntu的web服务器 - uWSGI应用协议服务 ...

随机推荐

  1. SpringMVC详细学习笔记

    Spring MVC   1 spring MVC简介:   Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构 ...

  2. C语言编译数组中有的加code有的不加,有什么区别

    像uchar code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};和uchar ds1302[]={0xfe,0xfd,0xfb,0xf7,0 ...

  3. xargs处理来之STDIN的输入

    xargs能够将标准输入进行处理,配合下一个命令进行批量处理 #example grep -f go.test ~/jqyou/genedhs_10D |sed '/-1$/d' |awk '{pri ...

  4. SmartBinding与kbmMW#1

    即将发布的kbmMW,实现了SmartBinding,SmartBinding的设计目标是: 必须易于使用 必须最小化或完全删除锅炉板代码.(你看到这里的趋势了吗?... kbmMW从那时开始就是为了 ...

  5. div不固定高度垂直居中

    父容器的css属性 display:table;overflow:hidden;子容器的css属性 vertical-align:middle;display:table-cell; <!DOC ...

  6. 2019-04-25-day040-数据库的查询

    内容回顾 数据的增删改查 插入数据 insert into 表 values (值1,值2...) insert into 表(指定字段名1,字段名2) values (值1,值2...) 删除数据 ...

  7. KMP算法详细分解

    1. 引言 给定一个主串(以 S 代替)和模式串(以 P 代替),要求找出 P 在 S 中出现的位置,此即串的模式匹配问题. Knuth-Morris-Pratt 算法(简称 KMP)是解决这一问题的 ...

  8. python 列表、元组

    列表 List(列表) 是 Python 中使用最频繁的数据类型. 列表可以完成大多数集合类的数据结构实现.它支持字符,数字,字符串甚至可以包含列表(即嵌套). 列表用 [ ] 标识,是 python ...

  9. kafka工作原理介绍

    两张图读懂kafka应用: Kafka 中的术语   broker:中间的kafka cluster,存储消息,是由多个server组成的集群.  topic:kafka给消息提供的分类方式.brok ...

  10. zabbix AGENTS 在WINDOWS的安装

    1.下载 https://assets.zabbix.com/downloads/3.4.0/zabbix_agents_3.4.0.win.zip 解压 zabbix_agents_3.4.0.wi ...