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

相关文章

Java通过ServerSocket与Socket实现通信过程

《Java通过ServerSocket与Socket实现通信过程》本文介绍了Java中的ServerSocket和Socket类,详细讲解了它们的构造方法和使用场景,并通过一个简单的通信示例展示了如何... 目录1 ServerSocket2 Socket3 服务器端4 客户端5 运行结果6 设置超时总结1

Linux服务器数据盘移除并重新挂载的全过程

《Linux服务器数据盘移除并重新挂载的全过程》:本文主要介绍在Linux服务器上移除并重新挂载数据盘的整个过程,分为三大步:卸载文件系统、分离磁盘和重新挂载,每一步都有详细的步骤和注意事项,确保... 目录引言第一步:卸载文件系统第二步:分离磁盘第三步:重新挂载引言在 linux 服务器上移除并重新挂p

Apache服务器IP自动跳转域名的问题及解决方案

《Apache服务器IP自动跳转域名的问题及解决方案》本教程将详细介绍如何通过Apache虚拟主机配置实现这一功能,并解决常见问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录​​问题背景​​解决方案​​方法 1:修改 httpd-vhosts.conf(推荐)​​步骤

浅析Python中如何处理Socket超时

《浅析Python中如何处理Socket超时》在网络编程中,Socket是实现网络通信的基础,本文将深入探讨Python中如何处理Socket超时,并提供完整的代码示例和最佳实践,希望对大家有所帮助... 目录开篇引言核心要点逐一深入讲解每个要点1. 设置Socket超时2. 处理超时异常3. 使用sele

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

JS纯前端实现浏览器语音播报、朗读功能的完整代码

《JS纯前端实现浏览器语音播报、朗读功能的完整代码》在现代互联网的发展中,语音技术正逐渐成为改变用户体验的重要一环,下面:本文主要介绍JS纯前端实现浏览器语音播报、朗读功能的相关资料,文中通过代码... 目录一、朗读单条文本:① 语音自选参数,按钮控制语音:② 效果图:二、朗读多条文本:① 语音有默认值:②

Nginx屏蔽服务器名称与版本信息方式(源码级修改)

《Nginx屏蔽服务器名称与版本信息方式(源码级修改)》本文详解如何通过源码修改Nginx1.25.4,移除Server响应头中的服务类型和版本信息,以增强安全性,需重新配置、编译、安装,升级时需重复... 目录一、背景与目的二、适用版本三、操作步骤修改源码文件四、后续操作提示五、注意事项六、总结一、背景与

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

Linux搭建ftp服务器的步骤

《Linux搭建ftp服务器的步骤》本文给大家分享Linux搭建ftp服务器的步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录ftp搭建1:下载vsftpd工具2:下载客户端工具3:进入配置文件目录vsftpd.conf配置文件4:

Python库 Django 的简介、安装、用法入门教程

《Python库Django的简介、安装、用法入门教程》Django是Python最流行的Web框架之一,它帮助开发者快速、高效地构建功能强大的Web应用程序,接下来我们将从简介、安装到用法详解,... 目录一、Django 简介 二、Django 的安装教程 1. 创建虚拟环境2. 安装Django三、创