zoukankan      html  css  js  c++  java
  • 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文件 统一称为静态文件,需要读取内容直接返回给用户浏览器

     

  • 相关阅读:
    [导入]C#中将字符串转成 Base64 编码
    [导入]GridView中实现并列排名的例子
    VB.net编程中可能用到的边边角角(二) —— 取Mac地址、取某String的MD5值、多线程、RAR压缩、ADOX生成数据库、加载工程内的Form、一个滚动条控制两个DataGridView
    (转)Setup Factory 打包工具部分功能代码解析
    (转)SQL 优化原则
    VB.net编程中可能用到的边边角角(一) —— 反射添加Form、向Excel中写值
    自写的简单屏蔽特定字符的TextBox和数字TextBox
    spring import resource 文件后bean找不到问题解决
    mysql插入记录后获取插入数据的id值
    cookie+memcached实现单点登陆
  • 原文地址:https://www.cnblogs.com/hmm1995/p/10013859.html
Copyright © 2011-2022 走看看