Web框架

Web框架

众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端。上篇只是返回了一句话,如果是要返回一个图片呢?一个文件呢?这就涉及你自己要负责实现文件的传送了,要自己通过Socket把Http协议里的各种功能都实现,浪费时间。

对于真实开发中的python web程序来说,一般会分为两部分:服务器程序和应用程序。

1.服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据进行整理。

2.应用程序则负责具体的逻辑处理。为了方便应用程序的开发,就出现了众多的Web框架,例如:Django、Flask、web.py 等。

不同的框架有不同的开发方式,但是无论如何,开发出的应用程序都要和服务器程序配合,才能为用户提供服务。我们可以设立一个标准,只要服务器程序支持这个标准,框架也支持这个标准,那么他们就可以配合使用。一旦标准确定,双方各自实现。这样,服务器可以支持更多支持标准的框架,框架也可以使用更多支持标准的服务器。

WSGI

WSGI(Web Server Gateway Interface)是一种规范,它定义了使用python编写的web app与web server之间接口格式,实现web app与web server间的解耦。

python标准库提供的独立WSGI服务器称为wsgiref。通俗的说:当规范建立后,程序就不再重复编写web server(socket服务端),而是直接使用现成的实现WSGI的模块(例如:wsgiref、uwsgi、werkzeug),从而让程序员更加专注与业务代码。Python的wsgiref是基于WSGI规范封装的模块,我们可以在这个模块基础上开发我们的web server。

from wsgiref.simple_server import make_server
def RunServer(environ, start_response):
       ""当有用户在浏览器上访问:http://127.0.0.1:8000/, 立即执行该函数并将函数的返回值返回给用户浏览器
    :param environ: 请求相关内容,比如浏览器类型、版本、来源地址、url等,即客户发来的所有数据
    :param start_response: 响应相关 封装要返回给用户的数据,响应头状态""
    start_response('200 OK', [('Content-Type', 'text/html')])
   
return [bytes('<h1>Hello, web!</h1>', encoding='utf-8'), ]
2.7无字节 转3.x字节 必须把字符串转为字节
1.b'abc'
2.bytes('abc',encoding='utf-8')
3.'abc'.encode('utf-8')
if __name__ == '__main__': httpd = make_server('', 8000, RunServer)
ip 端口 自定义函数
print("Serving HTTP on port 8000...") httpd.serve_forever()
运行 自动创建Socket服务端 一旦连接上 会触发 RunServer

自定义Web框架

通过python标准库提供的wsgiref模块开发一个自己的Web框架

web server支持多页面

from wsgiref.simple_server import make_server
 
def handle_index():"一类可以用正则作为函数,例如翻页"
    return 'index'
 
def handle_login():
    return 'login'
 
def routers():
     
    urlpatterns = (
        ('/index/',handle_index),
        ('/login/',handle_login),
    )
     
    return urlpatterns
 
def RunServer(environ, start_response):
    start_response('200 OK', [('Content-Type', 'text/html')])
    url = environ['PATH_INFO']  ""从断点处拿到用户的url标识""
urlpatterns
= routers() "url太多 放在一个列表里 不用一个一个写函数" func = None for item in urlpatterns: func = urlpatterns[item] if func: return func() else: return [bytes('404 not found.',encoding="utf-8"),
] 

if __name__ == '__main__':
httpd
= make_server('', 8000, RunServer)
print "Serving HTTP on port 8000..."
httpd.serve_forever()

 函数显示页面,要调用html,所以我们一般将要返回给用户的HTML写在指定文件中,然后再返回。

def index():
    # return 'index'
    f = open('index.html')
    data = f.read()
    return data
 
def login():
    # return 'login'
    f = open('login.html')
    data = f.read()
    return data

View:    由于数据去各自的html中拿,html太多放在一个View文件夹中    f = open('View/index.html')

Controller:   放各个函数     from  Controller  import   account      函数放在account.py

Model:   数据库相关 的文件夹

总结

web框架

MVC    :    Model 数据库    View模板文件       Controller 业务处理

MTV    : Model 数据库    Template 业务处理     View模板文件

Web框架的本质

  1. 浏览器是socket客户端,网站是socket服务端
  2. wsgi,是一个规范,wsgiref实现了这个规范并在其内部实现了socket服务端
  3. 根据 url 的不同执行不同函数,即:路由系统
  4. 函数,即:视图函数
  5. 图片、css、js文件 统一称为静态文件,需要读取内容直接返回给用户浏览器

 

原文地址:https://www.cnblogs.com/hmm1995/p/10013859.html