首页 > 其他分享 >【django学习-01】基于wsgi自制一个web框架

【django学习-01】基于wsgi自制一个web框架

时间:2022-08-28 19:45:36浏览次数:53  
标签:web wsgi 01 return server environ HTTP def

  • 什么是web框架
    • 框架,即farmework。特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演。
    • 对于所有的web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端
import socket

def handle_request(client):
    buf = client.recv(1024)
    client.send("HTTP/1.1 200 OK\r\n\r\n".encode("utf8"))
    # client.send("<h1 style='color:red'>Hello, yuan</h1>".encode("utf8"))
    
    #读取html文件
    with open('index.html','rb') as f:
        data = f.read()
    client.send(data)

def main():

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    sock.bind(('localhost',8001))
    sock.listen(5)

    while True:
        connection, address = sock.accept()
        handle_request(connection)
        connection.close()

if __name__ == '__main__':
    main()
  • 最简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。
  • 如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。
  • 正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口,让我们专心用Python编写Web业务。
  • 这个接口就是WSGI:Web Server Gateway Interface。
    • 1、最基础的,直接给浏览器返回固定值
from wsgiref.simple_server import make_server
def application(environ, start_response):
    #通过enciron封装成一个所有请求信息的对象
    #start_response 可以很方便的设置响应头
    start_response('200 OK', [('Content-Type', 'text/html')])
    print(environ)
    return [b'<h1>Hello, web!</h1>']

#封装socket对象以及准备过程(socket,bind,listen)
httpd = make_server('localhost', 8080, application)

print('Serving HTTP on port 8000...')
# 开始监听HTTP请求:
httpd.serve_forever()
  • 2、根据浏览器传的不同路径,返回不同内容
from wsgiref.simple_server import make_server

def f1(request):    #request:形参,根据传入的environ获取请求参数,从而按不同逻辑处理
    return [b'<h1>Hello, web!</h1>']
def f2(request):
    return [b'<h1>Hello, book!</h1>']
def application(environ, start_response):
    # print(environ['PATH_INFO'])
    start_response('200 OK', [('Content-Type', 'text/html')])
    path = environ['PATH_INFO']

    if path == '/web':
        return f1(environ)
        # return [b'<h1>Hello, web!</h1>']
    elif path == '/book':
        return f2(environ)
        # return [b'<h1>Hello, book!</h1>']
    else:
        return [b'<h1>404!</h1>']

httpd = make_server('localhost', 8080, application)

print('Serving HTTP on port 8000...')
# 开始监听HTTP请求:
httpd.serve_forever()
  • 3、如上所示,如果有很多个路径,这样写就不适合了,于是我们通过循环的方式获取
from wsgiref.simple_server import make_server
import time
def router():
    urlpath = (
        ('/book',f1),
        ('/web',f2),
        ('/curtime',f3),
    )
    return urlpath

def f1(request):
    return [b'<h1>Hello, book!</h1>']
def f2(request):
    return [b'<h1>Hello, web!</h1>']
def f3(request):
    cur_time = time.ctime(time.time())
    with open('cur_time.html','rb') as f:    
        data = f.read()
        data = str(data,'utf8').replace('!curtime!',str(cur_time))    #返回当前时间
    return [data.encode('utf8')]

def application(environ, start_response):
    # print(environ['PATH_INFO'])
    start_response('200 OK', [('Content-Type', 'text/html')])
    path = environ['PATH_INFO']

    urlpatterns = router()
    func = None
    for item in urlpatterns:
        if item[0] == path:
            func = item[1]
            break
    if func:
        return func(environ)
    else:
        return ["<h1>404</h1>".encode("utf8")]

httpd = make_server('localhost', 8080, application)

print('Serving HTTP on port 8080...')
# 开始监听HTTP请求:
httpd.serve_forever()
//cur_time.html
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>
<h3>current_time: !curtime!</h3>
</body>
</html>
  • 伙计们,不知不觉我们自己已经写出一个web框架啦!

标签:web,wsgi,01,return,server,environ,HTTP,def
From: https://www.cnblogs.com/xwltest/p/16633458.html

相关文章

  • 在 React 中释放 Web 组件的力量
    在React中释放Web组件的力量Photoby法提赫on不飞溅假设您有一个项目,要求您在React应用程序中使用Web组件。你如何使用该组件的状态?如何访问它的方法和属......
  • P3955 [NOIP2017 普及组] 图书管理员
    P3955[NOIP2017普及组]图书管理员-洛谷|计算机科学教育新生态(luogu.com.cn)  #include<iostream>#include<cstdio>#include<cstring>#include<algorithm......
  • 数据库基础01
    基本介绍录入信息->产生相应数据(存入数据库)->被加载至项目页面中常见数据库分类关系型(RDMS)数据的关系以表的形式表达。常见:Oracle(大型项目),Mysql(Web项目),SQLServer......
  • CVE-2017-7921 海康威视(Hikvision)摄像头漏洞复现
    今天看到了海康威视又出了新漏洞——CVE-2021-36260,突然心血来潮想要复现一下,结果搜到了一个旧的漏洞——CVE-2017-7921,而且发现仍然有不少海康威视摄像头后台没有修补这个......
  • web应用模式和api接口
    web应用模式:前后端不分离(客户端看到的内容和所有界面效果都是由服务端提供出来的)  2.前后端分离(把前端的界面效果(html,css,js分离到另一个服务端,python服务......
  • Windows RDP的RCE漏洞分析和复现(CVE-2019-0708)
    0x00漏洞描述Windows系列服务器于2019年5月15号,被爆出高危漏洞,该漏洞影响范围较广如:windows2003、windows2008、windows2008R2、windowsxp系统都会遭到攻击,该服务器漏......
  • 「JOISC 2016 Day 1」俄罗斯套娃(二维偏序)
    「JOISC2016Day1」俄罗斯套娃思路清奇的呀,先在坐标轴上画图(R为横坐标,H为纵坐标),然后发现每个询问之间没有影响,考虑离线处理,因为询问的要求是选择>=R的,所以把横坐标从大......
  • FUXA——基于Web的过程可视化软件
    资源GitHub地址:https://github.com/frangoteam/FUXADEMO地址:https://frangoteam.github.io/概述FUXA是基于Web的,过程(SCADA、HMI、看板等)可视化软件。可创建现代的......
  • P1003 [NOIP2011 提高组] 铺地毯 题解
    题目传送门[NOIP2011提高组]铺地毯题目描述为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有\(n\)......
  • 数据库学习笔记 (本数据库学习笔记以SQL sever 2019 为例进行学习) 20220824 第二节课
    什么是数据模型?数据模型:是对现实世界数据特征的抽象,他是用来描述数据、组织数据和对数据进行操作的。在数据库中用数据模型这个工具来抽象、表示和处理现实世界中的数据......