day55——django引入、小型django(socket包装的服务器)
day55
吴超老师Django总网页:https://www.cnblogs.com/clschao/articles/10526431.html
请求(网址访问,提交数据等等) request
响应(回复页面,回复数据等等) response
web框架的本质及自定义web框架
我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端,基于请求做出响应,客户都先请求,服务端做出对应的响应,按照http协议的请求协议发送请求,服务端按照http协议的响应协议来响应请求,这样的网络通信,我们就可以自己实现Web框架了。
通过对socket的学习,我们知道网络通信,我们完全可以自己写了,因为socket就是做网络通信用的,下面我们就基于socket来自己实现一个web框架,写一个web服务端,让浏览器来请求,并通过自己的服务端把页面返回给浏览器,浏览器渲染出我们想要的效果。在后面的学习中,****大家提前准备一些文件:
html文件内容如下,名称为test.html:
详情看:https://www.cnblogs.com/clschao/articles/10391859.html#part_2
简单版回复html页面的web框架
python代码
server.py
import socket
server = socket.socket()
server.bind(('127.0.0.1', 8001))
server.listen()
while 1:
conn,addr = server.accept()
from_brower_msg = conn.recv(1024)
path = from_brower_msg.decode('utf-8').split(' ')[1]
print(path)
conn.send(b'HTTP/1.1 200 ok\r\n\r\n')
if path == '/':
with open('05dong.html', 'rb')as f:
data = f.read()
elif path == '/style.css':
with open('style.css', 'rb') as f:
data = f.read()
elif path == '/test.js':
with open('test.js', 'rb') as f:
data = f.read()
elif path == '/1.jpg':
with open('1.jpg', 'rb') as f:
data = f.read()
conn.send(data)
conn.close()
html代码
04test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="style.css">
<!-- <link rel="icon" href="favicon.ico">-->
</head>
<body>
<h1>24期官网</h1>
<div>
<img src="1.jpg" alt="">
</div>
</body>
<script src="test.js"></script>
</html>
样式和js等文件
style.css
body{
background: red;
}
test.js
alert(123);
图片文件--1.jpg
基础函数版
python代码
server.html
import socket
from threading import Thread
server = socket.socket()
server.bind(('127.0.0.1',8003))
server.listen()
def home(conn):
with open('04test.html', 'rb') as f:
data = f.read()
conn.send(data)
conn.close()
def css(conn):
with open('style.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 pic(conn):
with open('1.jpg', 'rb') as f:
data = f.read()
conn.send(data)
conn.close()
def nofount(conn):
conn.send(b'not found 404!')
conn.close()
def ico(conn):
with open('favicon.ico', 'rb') as f:
data = f.read()
conn.send(data)
conn.close()
urlpatterns = [
('/',home),
('/style.css',css),
('/test.js',js),
('/1.jpg',pic),
('/favicon.ico',ico),
]
while 1:
conn,addr = server.accept()
from_brower_msg = conn.recv(1024)
path = from_brower_msg.decode('utf-8').split(' ')[1]
print(path)
conn.send(b'HTTP/1.1 200 ok\r\n\r\n')
for url in urlpatterns:
if path == url[0]:
# ret = url[1]()
t = Thread(target=url[1],args=(conn,))
t.start()
break
else:
t = Thread(target=nofount,args=(conn,))
t.start()
html代码
04test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="style.css">
<link rel="icon" href="favicon.ico">
</head>
<body>
<div>
<img src="1.jpg" alt="">
</div>
<script src="test.js"></script>
</body>
</html>
样式和js等文件
style.css
body{
background: red;
}
test.js
alert(123);
图片文件--1.jpg
进阶函数版
python文件
server.py
import socket
from urls import urlpatterns
from threading import Thread
import views
server = socket.socket()
server.bind(('127.0.0.1',8003))
server.listen()
while 1:
conn,addr = server.accept()
from_brower_msg = conn.recv(1024)
path = from_brower_msg.decode('utf-8').split(' ')[1]
print(path)
conn.send(b'HTTP/1.1 200 ok\r\n\r\n')
for url in urlpatterns:
if path == url[0]:
t = Thread(target=url[1], args=(conn,))
t.start()
break
else:
t = Thread(target=views.nofount, args=(conn,))
t.start()
列表文件--urls.py
import views
urlpatterns = [
('/',views.home),
('/style.css',views.css),
('/test.js',views.js),
('/1.jpg',views.pic),
('/favicon.ico',views.ico),
]
函数文件--views.py
def home(conn):
with open('05dong.html', 'rb') as f:
data = f.read()
conn.send(data)
conn.close()
def css(conn):
with open('style.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 pic(conn):
with open('1.jpg', 'rb') as f:
data = f.read()
conn.send(data)
conn.close()
def nofount(conn):
conn.send(b'not found 404!')
conn.close()
def ico(conn):
with open('favicon.ico', 'rb') as f:
data = f.read()
conn.send(data)
conn.close()
html文件
05dong.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="style.css">
<!-- <link rel="icon" href="favicon.ico">-->
</head>
<body>
<h1>24期官网</h1>
<div>
<img src="1.jpg" alt="">
</div>
</body>
<script src="test.js"></script>
</html>
样式和js等文件
style.css
body{
background: red;
}
test.js
alert(123);
图片文件--1.jpg
动态页面的web框架
python文件
server.py
import socket
server = socket.socket()
server.bind(('127.0.0.1', 8003))
server.listen()
while 1:
username = "朱凡宇"
conn, addr = server.accept()
from_brower_msg = conn.recv(1024)
path = from_brower_msg.decode('utf-8').split(" ")[1]
conn.send(b'HTTP/1.1 200 ok\r\n\r\n')
with open('dong.html', 'r', encoding='utf-8')as f:
data = f.read()
data = data.replace('%xxoo%', username)
conn.send(data.encode())
conn.close()
html文件
dong.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>欢迎来到%xxoo%的首页</h1>
</body>
</html>
不同html页面的web框架
python文件
server
import socket
from urls import urlpatterns
from threading import Thread
import views
server = socket.socket()
server.bind(('127.0.0.1',8003))
server.listen()
while 1:
conn,addr = server.accept()
from_brower_msg = conn.recv(1024)
path = from_brower_msg.decode('utf-8').split(' ')[1]
print(path)
conn.send(b'HTTP/1.1 200 ok\r\n\r\n')
for url in urlpatterns:
if path == url[0]:
t = Thread(target=url[1], args=(conn,))
t.start()
break
else:
t = Thread(target=views.nofount, args=(conn,))
t.start()
urls
import views
urlpatterns = [
('/',views.home),
('/center',views.person_center),
]
views
def home(conn):
with open('05dong.html', 'rb') as f:
data = f.read()
conn.send(data)
conn.close()
def person_center(conn):
with open('center.html', 'rb') as f:
data = f.read()
conn.send(data)
conn.close()
def nofount(conn):
conn.send(b'not found 404!')
conn.close()
html文件
05dong.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>欢迎24期来到xx网站</h1>
<a href="/center">个人中心</a>
</body>
</html>
center.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>欢迎来到xx个人中心</h1>
</body>
</html>
wsgiref模块
python文件
server
from wsgiref.simple_server import make_server
from urls import urlpatterns
def application(environ,start_response):
# environ 所有请求相关信息
# start_response --封装响应数据格式
path = environ['PATH_INFO']
start_response('200 ok',[]) # conn.send(b'HTTP/1.1 200 ok\r\n\r\n')
for url in urlpatterns:
if path == url[0]:
ret = url[1]()
break
return [ret]
if __name__ == '__main__':
h = make_server('127.0.0.1', 8080, application)
h.serve_forever()
urls
import views
urlpatterns = [
('/',views.home),
]
views
def home():
with open('05dong.html', 'rb') as f:
data = f.read()
return data
html文件
05dong.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>欢迎24期来到xx网站</h1>
</body>
</html>
jinja2模块
python文件
server
import socket
from urls import urlpatterns
from threading import Thread
import views
server = socket.socket()
server.bind(('127.0.0.1',8003))
server.listen()
while 1:
conn,addr = server.accept()
from_brower_msg = conn.recv(1024)
path = from_brower_msg.decode('utf-8').split(' ')[1]
print(path)
conn.send(b'HTTP/1.1 200 ok\r\n\r\n')
for url in urlpatterns:
if path == url[0]:
t = Thread(target=url[1], args=(conn,))
t.start()
break
urls
import views
urlpatterns = [
('/',views.home),
# ('/center',views.person_center),
# ('/style.css',views.css),
# ('/test.js',views.js),
# ('/1.jpg',views.pic),
# ('/favicon.ico',views.ico),
]
views
from jinja2 import Template
def home(conn):
# {% for i in hobby %}
# <li>{{ i }}</li>
# {% endfor %}
with open('08jinja2test.html', 'r',encoding='utf-8') as f:
data = f.read()
t = Template(data)
ret = t.render({'hobby':['金钱','女人','张达'], 'name': '朱凡宇'})
conn.send(ret.encode('utf-8'))
conn.close()
html文件
08jinja2test.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>{{ name }}个人介绍</h1>
我的爱好
<ul>
{% for i in hobby %}
<li>{{ i }}</li>
{% endfor %}
</ul>
</body>
</html>
day55——django引入、小型django(socket包装的服务器)的更多相关文章
- teprunner测试平台Django引入pytest完整源码
本文开发内容 pytest登场!本文将在Django中引入pytest,原理是先执行tep startproject命令创建pytest项目文件,然后从数据库中拉取代码写入文件,最后调用pytest命 ...
- django引入现有数据库 转
django引入现有数据库 Django引入外部数据库还是比较方便的,步骤如下: 1.创建一个项目,修改seting文件,在setting里面设置你要连接的数据库类型和连接名称,地址之类,和创建新 ...
- django引入现有数据库
Django引入外部数据库还是比较方便的,步骤如下: 1.创建一个项目,修改seting文件,在setting里面设置你要连接的数据库类型和连接名称,地址之类,和创建新项目的时候一致. 2.运行下面代 ...
- Django(一):从socket到MVC
一.socket的http套路 web应用本质上是一个socket服务端,用户的浏览器是一个socket客户端.socket处在应用层与传输层之间,是操作系统中I/O系统的延伸部分(接口),负责系统进 ...
- 五步教你实现使用Nginx+uWSGI+Django方法部署Django程序
Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求.ng ...
- Ubuntu+Django+Nginx+uWSGI+Mysql搭建Python Web服务器
Ubuntu+Django+Nginx+uWSGI+Mysql搭建Python Web服务器 闲着无聊的时候部署了一个Django项目玩,用vm虚拟机部署的. 准备工作 我使用的系统是Ubuntu16 ...
- Django组件(五) Django之ContentType组件
基础使用 -contenttype组件 -django提供的一个快速连表操作的组件,可以追踪项目中所有的APP和model的对应关系,并记录在ContentType表中. 当我们的项目做数据迁移后,会 ...
- 使用Nginx+uWSGI+Django方法部署Django程序
第一步先解决uwsgi与django的桥接.解决在没有nginx的情况下,如何使用uwsgi+DJANGO来实现一个简单的WEB服务器. 第二步解决uwsgi与Nginx的桥接.通过nginx与uws ...
- Django框架(一)-Django初识
Django初识 一.Web框架本质—自己实现Web框架 1.所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端 import socket sk = sock ...
随机推荐
- vue中使用时间插件、vue使用laydate
<input id="time1" readonly="readonly" placeholder="这里选择时间" v-model= ...
- JAVA字符编码一:Unicode,GBK,GB2312,UTF-8概念基础
第一篇:JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础 来源:holen'blog 对字符编码与Unicode,ISO 10646,UCS,UTF8,UTF16, ...
- uniapp - emmet
话说,emment是官方uniapp直接引入的.基本上没做啥修改:可以点这里查看所有用法 - http://emmet.evget.com/ 1.类似css层级写法 1.1 view.ok>vi ...
- SpringBoot(十四):SpringCloud初步认识
SpringCloud是一个基于SpringBoot实现的云应用开发工具,它为开发人员提供了一些工具来快速构建分布式系统中的一些常见模式(例如配置管理.服务发现.断路器.智能路由.微代理.控制总线.一 ...
- TOKEN验证防止CSRF攻击的原理
TOKEN验证防止CSRF攻击的原理.CSRF中文名是跨站请求伪造攻击,黑客可以通过CSRF攻击来伪造我们的身份,从而进行不法的活动.比如说是以我们的身份进行转账,发送邮件等操作. 要想做到预防CSR ...
- Android外接USB扫码枪
公司的设备以前接入的都是串口的扫码头,优点是直接通过串口读取流里面的数据就OK了,缺点是你需要知道每一款扫码器的型号以获取波特率及Android设备的串口地址.因为现在usb扫码器越来越方便且即插即用 ...
- 【C++】C++中重载运算符和类型转换
输入输出运算符 输入输出运算符 输入输出运算符 算术和关系运算符 相等运算符 关系运算符 赋值运算符 复合赋值运算符 下标运算符 递增和递减运算符 成员访问运算符 函数调用运算符 lambda是函数对 ...
- HandlerMethodArgumentResolver的抽象實現AbstractNamedValueMethodArgumentResolver下的子类
Annotation-based argument resolution 部分2 org.springframework.web.servlet.mvc.method.annotation.Reque ...
- 使用java计算数组方差和标准差
使用java计算数组方差和标准差 觉得有用的话,欢迎一起讨论相互学习~Follow Me 首先给出方差和标准差的计算公式 代码 public class Cal_sta { double Sum(do ...
- Elasticsearch学习笔记——索引模板
在索引模板里面,date类型的字段的format支持多种类型,在es中全部会转换成long类型进行存储,参考 https://zhuanlan.zhihu.com/p/34240906 一个索引模板范 ...