2.8.5Django --3 WEB框架

Django目录:https://blog.****.net/qq_41106844/article/details/105554082

什么是WEB框架

框架:即framework,特指未解决一个开放性问题而设计的具有一定约束性的支撑框架。使用框架可以用来快速开发特点的系统。

大白话就是,别人搭台,你唱戏。

Web框架(Web framework):是一种开发框架,用来支持动态网站、网络应用和网络服务的开发。

大多数的web框架都提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法。web框架已经实现了很多功能,开发人员使用框架提供的方法并且完成自己的业务逻辑,就能快速开发web应用了。

浏览器和服务器的是基于HTTP协议进行通信的,也可以说web框架就是在以上十几行代码基础张扩展出来的,有很多简单方便使用的方法,大大提高了开发的效率。

 

为DIV做准备

在div之前,我们要先知道几个概念:

WSGI:全称(Web Server Gateway Interface)。

简单的Web应用就是先把HTML用文件保存好,用一个现成的HTTP服务器软件,接收用户请求,从文件中读取HTML,返回。

如果要动态生成HTML,就需要把上述步骤自己来实现。不过,接受HTTP请求、解析HTTP请求、发送HTTP响应都是苦力活,如果我们自己来写这些底层代码,还没开始写动态HTML呢,就得花个把月去读HTTP规范。

正确的做法是底层代码由专门的服务器软件实现,我们用Python专注于生成HTML文档。

因为我们不希望接触到TCP连接、HTTP原始请求和响应格式,所以,需要一个统一的接口协议来实现这样的服务器软件,让我们专心用Python编写Web业务。这个接口就是WSGI。

wsgiref模块:就是python基于wsgi协议开发的服务模块。

 

我们先用wsgiref模块实现一个web应用

# 这样实现web应用与socket最大的区别是:

# 不需要在乎客户端或者服务端之间乱七八糟的连接和传输.

# 只需要在有连接在连接8080端口后返回给他页面数据。

from wsgiref.simple_serverimport make_server

#这两个参数,分别是包含HTTP信息的一个字典,发出HTTP响应的函数。

def application(environ, start_response):

    #响应头的设置

    start_response('200 OK', [('Content-Type', 'text/html')])

    return [b'<h1>Hello, web!</h1>']

 

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

print('Serving HTTP on port 8080...')

# 开始监听HTTP请求:

httpd.serve_forever()

 
2.8.5Django --3 WEB框架
 
 
2.8.5Django --3 WEB框架
 

我们再来看看 make_server这个函数:

 
2.8.5Django --3 WEB框架
 

第一个参数是IP,第二个参数是端口,第三个参数就直接是app。

 

如果查看environ

 
2.8.5Django --3 WEB框架
 
 
2.8.5Django --3 WEB框架
 

我们能在其中发现很多信息以k-v的形式保存,如果想要获得什么信息,可以从这里拿。

那么我们现在改一下需求,我们现在浏览 http://127.0.0.1/hanx  这个页面时,我们想让他出现  hello hanxuan!

我们这就需要去environ中找到负责管理路径的key。

我们发起 http://127.0.0.1/hanx 这个请求,然后我们想要找到的路径找到了。

 
2.8.5Django --3 WEB框架
 
 
2.8.5Django --3 WEB框架
 

from wsgiref.simple_serverimport make_server

 

def application(environ, start_response):

    #获取路径

    path=environ["PATH_INFO"]

    start_response('200 OK', [('Content-Type', 'text/html')])

    #简单处理一下之后拼接

    strin="<h1>Hello, "+path[1:]+"!"

    #将字符串转换成二进制串

    return [bytes(strin,encoding="utf-8")]

 

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

print('Serving HTTP on port 8080...')

 

# 开始监听HTTP请求:

httpd.serve_forever()

 
2.8.5Django --3 WEB框架
页面上ok

但是显然这么写有点不符合实际,显然我们的页面数量是有限的,那么我们接下来引用真实的HTML文件作为页面。

 
2.8.5Django --3 WEB框架
 
 
2.8.5Django --3 WEB框架
 

之后修改程序为:

from wsgiref.simple_serverimport make_server

def foo1():

    f =open("index1.html","rb")

    data = f.read()

    return data

 

def foo2():

    f =open("index2.html","rb")

    data = f.read()

    return data

 

def application(environ, start_response):

    #获取路径

    path=environ["PATH_INFO"]

    start_response('200 OK', [('Content-Type', 'text/html')])

    if path =="/HAN":

        return [foo1()]

    elif path =="/XUAN":

        return [foo2()]

    else:

        return [b"404"]

 

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

print('Serving HTTP on port 8080...')

# 开始监听HTTP请求:

httpd.serve_forever()

 
2.8.5Django --3 WEB框架
 
 
2.8.5Django --3 WEB框架
 

 

 
2.8.5Django --3 WEB框架
 
 
2.8.5Django --3 WEB框架
 

但是如果页面数量过多,我们需要大量的使用if--elif--else。那么有没有方便一点的呢,这就有了我们的路由表。

...

#路由表

def router():

    URLpattern = [

        ("/HAN", foo1),

        ("/XUAN", foo2)

    ]

    return URLpattern

def application(environ, start_response):

    #获取路径

    path=environ["PATH_INFO"]

    start_response('200 OK', [('Content-Type', 'text/html')])

 

    URLpattern = router()

    for iin URLpattern:

        if path == i[0]:

            func = i[1]

            return[func()]

        else:

            return [b"404"]

...

 
2.8.5Django --3 WEB框架
下面没截到的照旧
 
2.8.5Django --3 WEB框架
 

web访问照旧。

使用了路由表就可以*的增加删除页面。