django-socket跟浏览器通信、wsgiref服务器、jinja2渲染库

2024-08-31 22:32

本文主要是介绍django-socket跟浏览器通信、wsgiref服务器、jinja2渲染库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      • socket跟浏览器通信
      • wsgiref
      • jinja2

socket跟浏览器通信

所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端。 这样我们就可以自己实现Web框架了。
每个HTTP请求和响应都遵循相同的格式,一个HTTP包含Header和Body两部分,其中Body是可选的。 HTTP响应的Header中有一个 Content-Type表明响应的内容格式。如 text/html表示HTML网页

HTTP GET请求的格式:
使用 \r\n分隔多个header

GET /path HTTP/1.1
header1:v1\r\n
header2:v2\r\n

HTTP POST请求格式:

POST /path HTTP/1.1
header1:v1\r\n
header2:v2\r\n
\r\n\r\n
请求体...

当遇到连续两个 \r\n\r\n时,表示Header部分结束了,后面的数据是Body。

HTTP响应的格式

200 OK
Header1:v1\r\n
Header2:v2\r\n
\r\n\r\n
响应体...

我们通过socket来实现一下交互功能:

import socketsk = socket.socket()
sk.bind(("127.0.0.1", 8070))
sk.listen(5)while True:conn, addr = sk.accept()data = conn.recv(8096)print("data-->",data)  # data是浏览器传过来的请求信息,bytes类型data_str = str(data, encoding="utf8")print("data_str",data_str)l1 = data_str.split("\r\n")print("l1",l1)l2 = l1[0].split()print("l2",l2)url = l2[1]print("url",url)# 根据url的不同,返回不同的内容if url == "/index/":body = "这是index页面"elif url == "/home/":body = "这是home页面"else:body = "404找不到"# 服务端回复消息conn.send(bytes("HTTP/1.1 200 OK\r\nContent-Type:text/html; charset=utf-8""\r\n\r\n<h1>{}</h1>".format(body), encoding="utf8"))conn.close()

以下是运行结果:
这里写图片描述

我们来看下pycharm里面的日志信息:

data--> b'GET /home/ HTTP/1.1\r\nHost: 127.0.0.1:8070\r\nUser-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:57.0) Gecko/20100101 Firefox/57.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2\r\nAccept-Encoding: gzip, deflate\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\n\r\n'
data_str GET /home/ HTTP/1.1
Host: 127.0.0.1:8070
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:57.0) Gecko/20100101 Firefox/57.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1l1 ['GET /home/ HTTP/1.1', 'Host: 127.0.0.1:8070', 'User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:57.0) Gecko/20100101 Firefox/57.0', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2', 'Accept-Encoding: gzip, deflate', 'Connection: keep-alive', 'Upgrade-Insecure-Requests: 1', '', '']
l2 ['GET', '/home/', 'HTTP/1.1']
url /home/

wsgiref

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

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

from wsgiref.simple_server import make_serverdef index():return "这是index页面"def home():return "这是home页面"def login():with open("login.html", encoding="utf8") as f:data = f.read()return dataURL_FUNC = [("/index/", index),("/home/", home),("/login/", login),
]def run_server(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html;charset=utf8')])  # 设置HTTP响应的状态码和头信息url = environ['PATH_INFO']  # 取到用户输入的urlprint("--->url:", url)# 根据url的不同,返回不同的内容func_name = Nonefor i in URL_FUNC:if url == i[0]:  # 如果能找到对应关系,就把函数名拿到func_name = i[1]break# 拿到可以执行的函数,执行函数拿到结果if func_name:body = func_name()else:body = "404找不到这个页面"return [bytes("<h1>{}</h1>".format(body), encoding="utf8"),]if __name__ == '__main__':httpd = make_server('', 8010, run_server)print("Serving HTTP on port 8000...")httpd.serve_forever()

这里写图片描述

控制台输出如下:

--->url: /login/
127.0.0.1 - - [11/Jan/2018 16:59:32] "GET /login/ HTTP/1.1" 200 281
--->url: /favicon.ico
127.0.0.1 - - [11/Jan/2018 16:59:32] "GET /favicon.ico HTTP/1.1" 200 33

jinja2

通过实现下载安装

pip install jinja2
from wsgiref.simple_server import make_server
import jinja2def userlist():with open("login.html", encoding="utf8") as f:data = f.read()# 生成了一个jinja2的模板对象template = jinja2.Template(data)# 相当于字符串替换new_data = template.render({"user_list": [{"name": "wyf", "pwd": "1234"},{"name": "safly", "pwd": "5678"}]})return new_dataURL_FUNC = [("/login/", userlist),
]def run_server(environ, start_response):start_response('200 OK', [('Content-Type', 'text/html;charset=utf8')])  # 设置HTTP响应的状态码和头信息url = environ['PATH_INFO']  # 取到用户输入的urlprint("--->url:", url)# 根据url的不同,返回不同的内容func_name = Nonefor i in URL_FUNC:if url == i[0]:  # 如果能找到对应关系,就把函数名拿到func_name = i[1]break# 拿到可以执行的函数,执行函数拿到结果if func_name:body = func_name()else:body = "404找不到这个页面"return [bytes("<h1>{}</h1>".format(body), encoding="utf8"),]if __name__ == '__main__':httpd = make_server('', 9000, run_server)print("Serving HTTP on port 8000...")httpd.serve_forever()

login.html模板代码如下:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Title</title>
</head>
<body>
<ul>{% for user in user_list %}<li>{{user.name}}|{{user.pwd}}</li>{% endfor %}
</ul>
</body>
</html>

浏览器输出如下:
这里写图片描述

这篇关于django-socket跟浏览器通信、wsgiref服务器、jinja2渲染库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125175

相关文章

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

Linux服务器Java启动脚本

Linux服务器Java启动脚本 1、初版2、优化版本3、常用脚本仓库 本文章介绍了如何在Linux服务器上执行Java并启动jar包, 通常我们会使用nohup直接启动,但是还是需要手动停止然后再次启动, 那如何更优雅的在服务器上启动jar包呢,让我们一起探讨一下吧。 1、初版 第一个版本是常用的做法,直接使用nohup后台启动jar包, 并将日志输出到当前文件夹n

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

vue2 组件通信

props + emits props:用于接收父组件传递给子组件的数据。可以定义期望从父组件接收的数据结构和类型。‘子组件不可更改该数据’emits:用于定义组件可以向父组件发出的事件。这允许父组件监听子组件的事件并作出响应。(比如数据更新) props检查属性 属性名类型描述默认值typeFunction指定 prop 应该是什么类型,如 String, Number, Boolean,

zeroclipboard 粘贴板的应用示例, 兼容 Chrome、IE等多浏览器

zeroclipboard单个复制按钮和多个复制按钮的实现方法 最近网站改版想让复制代码功能在多个浏览器上都可以实现,最近看网上不少说我们的代码复制功能不好用的,我们最近将会增加代码高亮等功能,希望大家多多支持我们 zeroclipboard是一个跨浏览器的库类 它利用 Flash 进行复制,所以只要浏览器装有 Flash 就可以运行,而且比 IE 的

速盾:直播 cdn 服务器带宽?

在当今数字化时代,直播已经成为了一种非常流行的娱乐和商业活动形式。为了确保直播的流畅性和高质量,直播平台通常会使用 CDN(Content Delivery Network,内容分发网络)服务器来分发直播流。而 CDN 服务器的带宽则是影响直播质量的一个重要因素。下面我们就来探讨一下速盾视角下的直播 CDN 服务器带宽问题。 一、直播对带宽的需求 高清视频流 直播通常需要传输高清视频

利用Django框架快速构建Web应用:从零到上线

随着互联网的发展,Web应用的需求日益增长,而Django作为一个高级的Python Web框架,以其强大的功能和灵活的架构,成为了众多开发者的选择。本文将指导你如何从零开始使用Django框架构建一个简单的Web应用,并将其部署到线上,让世界看到你的作品。 Django简介 Django是由Adrian Holovaty和Simon Willison于2005年开发的一个开源框架,旨在简

linux中使用rust语言在不同进程之间通信

第一种:使用mmap映射相同文件 fn main() {let pid = std::process::id();println!(