简单的web框架

web的应用本质其实就是socket服务器,用户所使用的浏览器就是一个cocket客户端,客户使用浏览器发送的请求会被服务接收,服务器会按照http协议的响应协议来回复请求,这样的网络通讯,我们就可以自己实现web框架

下面是一个html文件,现在用户想要通过浏览器向服务器请求这个页面,我们应该怎么去让客户访问到这个页面;我们就得使用到socket

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="test.css">
<link rel="stylesheet" href="bootstrap-3.3.7-dist/css/bootstrap.min.css">
<link rel="stylesheet" href="https://www.jd.com/favicon.ico">
</head>
<body> <div class="div1" >
<h1>欢迎来到我的世界</h1>
</div> <div class="container">
<img src="1.jpg" alt="">
</div> <div class="container">
<form>
<div class="form-group">
<label for="exampleInputEmail1">Email address</label>
<input type="email" class="form-control" id="exampleInputEmail1" placeholder="Email">
</div>
<div class="form-group">
<label for="exampleInputPassword1">Password</label>
<input type="password" class="form-control" id="exampleInputPassword1" placeholder="Password">
</div>
<div class="form-group">
<label for="exampleInputFile">File input</label>
<input type="file" id="exampleInputFile">
<p class="help-block">Example block-level help text here.</p>
</div>
<div class="checkbox">
<label>
<input type="checkbox"> Check me out
</label>
</div>
<button type="submit" class="btn btn-default">Submit</button>
</form>
</div> </body>
<script src="bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
<script src="bootstrap-3.3.7-dist/js/npm.js"></script>
<script src="test.js"></script>
</html>

下面来写一个socket的文件,但我们使用socket将页面发送给浏览器时,由于html文件不只是一个文件,还有其它文件,这些文件是html文件通过本地路径进行导入的,所有在浏览器上没有办法显示;因此我们就将html先发送给浏览器,当浏览器在解析html文件时会再次向服务端发送请求,我们就将这些文件的请求再次获取通过判断找到对应的文件,并且发送给浏览器,进行渲染html文件;

import socket
# 导入socket这个包
from urls import urlpatters
# 导入所需的文件
from threading import Thread
# 导入thread模块,开启线程
server = socket.socket()
server.bind(('127.0.0.1',8080)) # 连接本地端口(方便测试)
server.listen() # 设置监听数,可以不写, while 1:
conn,addr = server.accept()
# 接收相应的请求信息
from_web_data = conn.recv(1024).decode('utf-8')
# 接收客户端的请求信息,并且转化成字符串,因为请求中会有地址的信息,
data = from_web_data.split(' ')[1]
# 将这个字符串用空格分割,得到的第二个字符就是请求的地址,获取到地址是(/ ---- 代表的是本地),为了方便发送html的主页面;
print(data)
conn.send(b'HTTP/1.1 200 ok\r\n\r\n')
# 这句话是一个http的消息格式,照着写就行 for i in urlpatters:
if data == i[0]:
t = Thread(target=i[1],args=(conn,))
t.start() # 这个语句是将urlpatters这个列表进行循环,

下面是一个urls的文件,就是专门放一个列表,再列表中放着一个个的元组,这些元组是为了通过与上边的判断语句进行比对,如果获取到的地址信息是下边列表中那个元组的第一个元素,就会找到元组的第二个元素对应的函数,这个函数有存放在另一个文件里;

import views
# 导入对应的函数文件
urlpatters=[
('/',views.home),
('/test.css',views.css),
('/bootstrap-3.3.7-dist/css/bootstrap.min.css',views.bootstrap_css),
('/bootstrap-3.3.7-dist/js/bootstrap.min.js',views.bootstrap_js),
('/bootstrap-3.3.7-dist/js/npm.js',views.bootstrap_npm),
('/test.js',views.js),
('/1.jpg',views.img),
('/bootstrap-3.3.7-dist/css/bootstrap.min.css.map',views.bootstrap_map),
]

存放函数的文件,里边存放着每个元组对应的函数,每个函数都对应着各自的文档,当调用某个函数时,函数就会找到对应的文档,将其读取出来,并且发送给浏览器,

def home(conn):
with open('home.html', 'rb')as f:
data = f.read() conn.send(data)
conn.close() def css(conn):
with open('test.css', 'rb')as f:
data = f.read()
conn.send(data)
conn.close() def js(conn):
with open('test.js', 'rb')as f:
data = f.read() conn.send(data)
conn.close() def img(conn):
with open('1.jpg', 'rb')as f:
data = f.read() conn.send(data)
conn.close() def bootstrap_css(conn):
with open('bootstrap-3.3.7-dist/css/bootstrap.min.css', 'rb')as f:
data = f.read() conn.send(data)
conn.close() def bootstrap_js(conn):
with open('bootstrap-3.3.7-dist/js/bootstrap.min.js','rb')as f:
data = f.read()
conn.send(data)
conn.close() def bootstrap_npm(conn):
with open('bootstrap-3.3.7-dist/js/npm.js', 'rb')as f:
data = f.read()
conn.send(data)
conn.close()
def bootstrap_map(conn):
with open('bootstrap-3.3.7-dist/css/bootstrap.min.css.map', 'rb')as f:
data = f.read() conn.send(data)
conn.close()

wsgiref模块的应用

WSGI(web server gateway interface)就是一种规范,它定义了使用python编写的web应用程序与web服务器程序之间的接口格式,实现web应用程序与web服务器程序间的解耦

常用的WSGI服务器有uwsgi、Gunicorn,而python标准库提供的独立WSGI服务器叫wsgiref,Django开发环境就是用这个模块来作服务器

下面是一个make_server文件

from wsgiref.simple_server import make_server
# 导入make_server模块
from urls import urlpatters
# 导入对应的文件
def application(environ,start_response):
# environ --- 所有请求相关信息
# start_response --- 封装响应数据格式
path = environ['PATH_INFO']
# 由于获得信息是个字典的形式,所以这样就能获取到浏览器需要的地址信息;
start_response('200 ok',[])
# 相当于HTTP/1.1 200 ok\r\n\r\n 写上就行
for i in urlpatters:
if path == i[0]:
ret = i[1]() # 调用相应的函数,并获取返回值
# 用于做判断的for语句
return [ret]
# 将返回值返回给server_forever()
if __name__ == '__main__':
http = make_server('127.0.0.1',8090,application)
# 第一个是本地的ip地址,第二个是端口号,第三个是对应的函数名
http.serve_forever()
# 通过这个语句执行上边的函数表达式,并且将得到的返回值发送给浏览器

这个是一个html文件

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="http://pic13.nipic.com/20110409/7119492_114440620000_2.jpg">
</head>
<body>
<div>
<h1>欢迎XXX来到24期后台管理系统</h1>
</div> <a href="homepage.html">个人中心</a> </body>
</html>

下边是一个urls文件用来存放用于判断路径并执行对应函数的一个列表文件

import views

urlpatters=[
('/',views.home),
]

这个是函数,找到文件并且返回给make_server文件中的函数

def home():
with open('home.html', 'rb')as f:
data = f.read()
return data

web框架的本质:的更多相关文章

  1. 浅谈网站web框架的本质

    一.web框架的本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. import socket def handle_reques ...

  2. web框架的本质

    一 web框架的本质及自定义web框架 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端,基于请求做出响应,客户都先请求,服务端做出对应的响 ...

  3. python django基础一web框架的本质

    web框架的本质就是一个socket服务端,而浏览器就是一个socker客户端,基于请求做出相应,客户端先请求,服务器做出对应响应 按照http协议的请求发送,服务器按照http协议来相应,这样的通信 ...

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

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

  5. django基础一之web框架的本质

    一 web框架的本质及自定义web框架 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端,基于请求做出响应,客户都先请求,服务端做出对应的响 ...

  6. day 52 Django基础一之web框架的本质

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

  7. 01.Django基础一之web框架的本质

    一 web框架的本质及自定义web框架 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端,基于请求做出响应,客户都先请求,服务端做出对应的响 ...

  8. Django---Http协议简述和原理,HTTP请求码,HTTP请求格式和响应格式(重点),Django的安装与使用,Django项目的创建和运行(cmd和pycharm两种模式),Django的基础文件配置,Web框架的本质,服务器程序和应用程序(wsgiref服务端模块,jinja2模板渲染模块)的使用

    Django---Http协议简述和原理,HTTP请求码,HTTP请求格式和响应格式(重点),Django的安装与使用,Django项目的创建和运行(cmd和pycharm两种模式),Django的基 ...

  9. day 65 Django基础一之web框架的本质

      Django基础一之web框架的本质   django第一天 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基 ...

  10. web框架的本质、MVC框架MTV框架的介绍

    1.web框架的本质 所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端,基于请求做出响应,客户都先请求,服务端做出对应的响应,按照http协议的请求协议发送请 ...

随机推荐

  1. Kudu的特点

    Kudu的特点 0.原理 列式存储管理器 一个列式存储数据的地方,跟mysql差不多,只是mysql是行式存储. 他是一个集群,能分布式存储. 查询也是写sql语句. 列式存储效率高. 1.为什么会有 ...

  2. 工具-Git与GitHub-GitHub使用(99.5.3)

    @ 目录 1.在github中添加公钥 2.克隆项目 3.在本地工作区新建分支,修改文件并提交 4.推送到远程仓库 5.从远程分支上拉取代码 关于作者 1.在github中添加公钥 首次使用git必须 ...

  3. 扫描条形码获取商品信息(iOS 开发)

    一.导入ZBarSDK及其依赖库(这不是本文侧重点)     1.下载地址 https://github.com/bmorton/ZBarSDK     2.导入头文件 #import "Z ...

  4. 听说又有兄弟因为用YYYY-MM-dd被锤了...

    还记得去年分享过一篇日期格式化使用 YYYY-MM-dd 的潜在问题的文章不? 历史又重演了... 事故现场 我们来写个单元测试,重现一下这个问题. 测试逻辑: 创建两个日期格式化,一个是出问题的YY ...

  5. [LeetCode]231. Power of Two判断是不是2\3\4的幂

    /* 用位操作,乘2相当于左移1位,所以2的幂只有最高位是1 所以问题就是判断你是不是只有最高位是1,怎判断呢 这些数-1后形成的数,除了最高位,后边都是1,如果n&n-1就可以判断了 如果是 ...

  6. [leetcode349]Intersection of Two Arrays

    设计的很烂的一道题 List<Integer> res = new ArrayList<>(); // int l1 = nums1.length; // int l2 = n ...

  7. GraduateDesign-初试APP编写(去除虚拟按键和禁止状态栏下拉)

    为了毕设的要求,需要在Android系统上运行一个app来控制硬件,今天开始这个app的编写. 首先,我们的系统将只运行这个app,也就是我们不需要状态栏,虚拟按键等. 故这里将app设置为全屏模式. ...

  8. 本地项目上传至GitHub

    本地项目上传至GitHub 使用git上传 一.安装git 直接官网下载,安装即可. git官网下载 github下载 按照好后大概就是这个样子 二.创建公钥和私钥 有的就可跳过此步骤 我们双击打开g ...

  9. 远程控制卡 使用ipmitools设置ipmi

    远程控制卡 使用ipmitools设置ipmi 使用DELL的远程控制卡可以方便的管理服务器 在CentOS中可以使用ipmitools管理 IPMI( Intelligent Platform Ma ...

  10. case when then else end用法

        case具有两种格式,简单case函数和case搜索函数 case函数只返回第一个符合条件的值,剩下的case部分将会被自动忽略 1.简单函数 CASE sex         WHEN '1 ...