欢迎您到:本站提供有声小说下载和评书下载服务!{下载记录:}
热门下载 | 设为首页 | 收藏本站
当前位置:首页 > 都市言情 > 蜜月红豆打包下载全集

【极限运动少不了索尼X1000V 打包】:下载地址 ――→有声小说打包下载列表! 全集

    雪飞鸿觉得这对父女也是宝货,父亲好色,女儿脑残,不知道她母亲如何,如果再加上个红杏出墙,那就是天衣无缝的组合了。

    适合在家养殖的项目

    胡志说,你真聪明,我修炼了五百年才到现在的修为,你只怕二三百年就可以了。他终日在外采药炼丹,助我修炼,我也没有让他失望,在第二百零六年的时候,我终于炼成了人身。
    李连长放开了路障,让那些难民老百姓速速通过,那些老百姓看得清清楚楚,完整目睹了刚才的那个情形,顿时欢呼起来,哭号声变成了欢呼声,他们知道,只要过了这个口子,前面就是江边码头了,已经有许多女学生和附近防空洞的老百姓坐船渡过江跑出去了,而护送他们渡江的正是八卦洲那边的独立师加强团的部队,当然还有驻守挹江门这边的税警总团的部队!

    “韦爵爷,很威风啊。”站在一边的龙儿微微嘲讽道,最近一段时间连续耍了韦小宝几次,她的心情可是和现在的韦小宝完全相反,好得不得了。

    WSGI框架及Paste+Pastedeploy+route+webob开发


    一。前言

    WSGI服务器

    一个Web服务器网关接口 (WSGI)服务器实现了WSGI接口的Web服务器端运行的Python的Web应用程序。

    为什么需要WSGI?

    传统的Web服务器不理解或有任何方式来运行Python应用程序。在20世纪90年代后期,名为Grisha Trubetskoy的开发人员 提出了一个名为mod_python的Apache模块 来执行任意的Python代码。在20世纪90年代后期和21世纪初,Apache配置的mod_python运行了大多数Python Web应用程序。

    但是,mod_python不是标准规范。这只是一个允许Python代码在服务器上运行的实现。由于mod_python的开发陷入僵局,安全漏洞被发现,社区认识到,需要一致的方式来执行Web应用程序的Python代码。

    因此,Python社区提出了WSGI作为模块和容器可以实现的标准接口。WSGI现在是运行Python Web应用程序的被接受的方法。

    WSGI官方规范

    WSGI标准v1.0在PEP 0333中指定 截至2010年9月,WSGI v1.0被PEP 3333取代 ,它定义了v1.0.1 WSGI标准。如果您使用Python 2.x,并且您符合PEP 0333,那么您也符合3333.较新版本仅仅是Python 3的更新,并且有关于如何处理unicode的说明。

    在的wsgiref的Python 2.x中和 的wsgiref在Python 3.x的 是内置到Python的标准库WSGI规范的参考实现,因此它可以被用来建造WSGI服务器和应用程序

     

     

    PEP 0333 – Python Web Server Gateway Interface 是一种 web server or gateway 和 python web application or framework 之间简单通用的接口,符合这种接口的 application 可运行在所有符合该接口的 server 上。通俗的讲,WSGI 规范了一种简单的接口,解耦了 server 和 application,使得双边的开发者更加专注自身特性的开发。

    • Web server/gateway: 即 HTTP Server,处理 HTTP 协议,接受用户 HTTP 请求和提供并发,调用 web application 处理业务逻辑。通常采用 C/C++ 编写,代表:apache, nginx 和 IIS。
    • Python Web application/framework: 专注业务逻辑的 python 应用或者框架

    Python Web application/framework

    Application/framework 端必须定义一个 callable object,callable object 可以是以下三者之一:

      • function, method
      • class
      • instance with a __call__ method

    Callable object 必须满足以下两个条件:

      • 接受两个参数:字典(environ),回调函数(start_response,返回 HTTP status,headers 给 web server)
      • 返回一个可迭代的值

    示例:

    def application(environ, start_response):
        start_response("200 OK", [("Content-Type", "text/plain")])
        return ["HELLO WORLD!"]
    class ApplicationClass(object):
        def __init__(self, environ, start_response):
            self.environ = environ
            self.start_response = start_response
     
        def __iter__(self):
            self.start_response("200 OK", [("Content-type", "text/plain")])
            yield "Hello world!n"
    1. environ 和 start_response 由 http server 提供并实现
    2. environ 变量是包含了环境信息的字典
    3. Application 内部在返回前调用 start_response
    4. start_response也是一个 callable,接受两个必须的参数,status(HTTP状态)和 response_headers(响应消息的头)
    5. 可调用对象要返回一个值,这个值是可迭代的

    服务器接口端

    服务器端主要专注 HTTP 层面的业务,重点是接收 HTTP 请求和提供并发。

    每当收到 HTTP 请求,服务器接口端必须调用 callable object:

    • 接收 HTTP 请求,但是不关心 HTTP url, HTTP method 等
    • 为 environ 提供必要的参数,实现一个回调函数 start_response,并传给 callable object
    • 调用 callable object

    Middleware,中间件

      Middleware 处于 服务层和 应用接口层 之间,每个 middleware 实现不同的功能,我们通常根据需求选择相应的 middleware 并组合起来,实现所需的功能。其作用有以下几点:

    • 根据 url 把用户请求调度到不同的 application 中。
    • 负载均衡,转发用户请求
    • 预处理 XSL 等相关数据
    • 限制请求速率,设置白名单
    class IPBlacklistMiddleware(object):
        def __init__(self, app):
            self.app = app
    
        def __call__(self, environ, start_response):
            ip_addr = environ.get("HTTP_HOST").split(":")[0]
            if ip_addr not in ("127.0.0.1"):
                return forbidden(start_response)
    
            return self.app(environ, start_response)
    
    def forbidden(start_response):
        start_response("403 Forbidden", [("Content-Type", "text/plain")])
        return ["Forbidden"]
    
    def application(environ, start_response):
        start_response("200 OK", [("Content-Type", "text/plain")])
        return ["Hello World!"]
    
    if __name__ == "__main__":
        from wsgiref.simple_server import make_server
        application = IPBlacklistMiddleware(application)
        server = make_server("0.0.0.0", 8080, application)
        server.serve_forever()
    

     大致了解WSGI框架后我们来看下Paste+Pastedeploy+route+webob开发,openstack开发使用的就是此开发框架,主要使用到的一些模块是:

    • eventlet: python 的高并发网络库
    • paste.deploy: 用于发现和配置 WSGI application 和 server 的库
    • routes: 处理 http url mapping 的库
    • webob: 处理HTTP请求并提供了一个对象来方便的处理返回response消息

    Eventlet 

    Eventlet 是一个基于协程的 Python 高并发网络库,额以下特点:

    • 使用 epoll、kqueue 或 libevent 等 I/O 复用机制,对于非阻塞 I/O 具有良好的性能
    • 基于协程(Coroutines),和进程、线程相比,其切换开销更小,具有更高的性能
    • 简单易用,特别是支持采用同步的方式编写异步的代码

    paste.deploy

    Paste Deployment是用于查找和配置WSGI应用程序和服务器的系统。对于WSGI应用程序消费者,它提供了从配置文件或Python Egg加载WSGI应用程序的单一简单函数(loadapp)。对于WSGI应用程序提供商,它只需要一个简单的入口点到您的应用程序,以便应用程序用户不需要暴露于应用程序的实现细节。

    Paste.deploy 通常要求 application 实现一个 factory 的类方法,如下:

    class TestApplication(object):
        def __init__(self):
            pass
    
        @webob.dec.wsgify
        def __call__(self, req):
            return self.router
    
        @classmethod
        def factory(cls, global_conf, **local_conf):
            return cls()

    if "__main__" == __name__: application = loadapp("config:%s/config.ini" % (CONF)) server = eventlet.spawn(wsgi.server, eventlet.listen(("0.0.0.0", 8080)), application) server.wait()

     Paste.deploy 的.ini配置文件配置 讲解

    配置文件说明,一个配置文件有不同的分段,但pastedeploy 关心的是前缀,比如app:main or filter:errors,:分隔部分之后是是这个分段的name,前一部分是这个分段的type类型,前段给的类型,后段名字将被忽略。

    一个简单的INI配置文件格式是 name = value.可以通过缩进后续行来扩展配置,#是对前面配置的评论标注。

    通常,您有一个或两个部分,称为“main”:一个应用程序部分(app:main)和一个服务器部分(server:main)。(复合:…表示向多个应用程序发送的内容(如以下示例)。

    [composite:main]
    use = egg:Paste#urlmap
    / = home
    /blog = blog
    /wiki = wiki
    /cms = config:cms.ini
    
    [app:home]
    use = egg:Paste#static
    document_root = %(here)s/htdocs
    
    [filter-app:blog]
    use = egg:Authentication#auth
    next = blogapp
    roles = admin
    htpasswd = /home/me/users.htpasswd
    
    [app:blogapp]
    use = egg:BlogApp
    database = sqlite:/home/me/blog.db
    
    [app:wiki]
    use = call:mywiki.main:application
    database = sqlite:/home/me/wiki.db

    urlmap 相当于做了多路由的分发,请求http://xxxx/ 时会请求分段名称为home的app, 走到相对的处理函数或者controller,其他类同

    第一分段解释:

    [composite:main]
    use = egg:Paste#urlmap
    / = home
    /blog = blog
    /cms = config:cms.ini

    composite 分段将请求分发给其他applications程序,use = egg:Paste#urlmap 意思是这个composite程序将使用paste名称为urlmap的包, urlmap是一个特别常见的复合应用程序,它使用路径前缀将请求映射到另一个应用程序。其他的如/ /blog 是应用程序,最后一个/cms,表明指的是另一个ini配置文件。

    [app:home]
    use = egg:Paste#static
    document_root = %(here)s/htdocs

    egg:Paste#static 静态文件配置,使用paste包static只提供静态文件,需要指定document_root目录

    使用方法

    from paste.deploy import loadapp
    wsgi_app = loadapp("config:/path/to/config.ini")

    section的type可以有:app、composite、filter、pipeline、filter-app等。学习具体更多配置详参官网 

    Route 

    Routes 是基于 ruby on rails 的 routes system 开发的 python 库,它根据 http url 把请求映射到具体的方法,routes 简单易用,可方便的构建 Restful 风格的 url。

    示例:

    import eventlet
    from eventlet import wsgi
    from paste.deploy import loadapp
    import routes
    import routes.middleware as middleware
    import webob.dec
    import webob.exc
    
    from manager.settings import CONF
    
    
    class TestController(object):
    
        def index(self, req):
            return "GET"
    
        def create(self, req):
            return "POST"
    
        def delete(self, req):
            return "DELETE"
    
        def update(self, req):
            return "PUT"
    
    
    class Resource(object):
        def __init__(self, controller):
            self.controller = controller()
    
        @webob.dec.wsgify
        def __call__(self, req):
            match = req.environ["wsgiorg.routing_args"][1]
            action = match["action"]
            if hasattr(self.controller, action):
                method = getattr(self.controller, action)
                return method(req)
            return webob.exc.HTTPNotFound()
    
    
    class TestApplication(object):
        def __init__(self):
            self.mapper = routes.Mapper()
            self.mapper.resource("test", "tests", controller=Resource(TestController))
            self.router = middleware.RoutesMiddleware(self.dispatch, self.mapper)
    
        @webob.dec.wsgify
        def __call__(self, req):
            return self.router
    
        @classmethod
        def factory(cls, global_conf, **local_conf):
            return cls()
    
        @staticmethod
        @webob.dec.wsgify
        def dispatch(req):
            match = req.environ["wsgiorg.routing_args"][1]
            return match["controller"] if match else webob.exc.HTTPNotFound()
    
    
    if "__main__" == __name__:
        application = loadapp("config:%s/config.ini" % (CONF))
        server = eventlet.spawn(wsgi.server,
                                eventlet.listen(("0.0.0.0", 8080)), application)
        server.wait()

     

    当前文章:http://shlcjn.com/osn6f/66776.html

    发布时间:2018-12-12 03:43:02

    软件接码搬砖项目 乐分享赚钱是不是真的 哔哩哔哩up主怎么挣钱 代勇和郑宇伯赌钱 快速数钱的方法 多少钱算富人 以太坊挖矿一天赚多少 怎样利用电脑挣钱

    编辑:安王扁海


【名称】:惊悚:恐怖的西藏神秘起尸习俗缘由
【播音】:CF我们的战队荣誉之战活动上线 拼排名领神器
【作者】:5月13日相约子洲3A景区 看比赛 品美食 观美景
【类型】:全国成品油价格指数小幅回落
【格式】:MP3版
【大小】:409.9M
【时间】:2018-12-12 09:57:39
【下载】:点此进入《2018-12-12》打包下载列表
【介绍】:“好生狂妄!”王子夜身旁的尸神鸠登时怒火冲天,正要飞走,却被王子夜一把拉住:“不可!纪太虚这厮传承了奇相氏的道统,仗着大道符篆简直是横行无忌,如今乃是气运正盛之时。我们不可去惹他!”
关于我们 | 联系我们 | 版权声明 | 网友上传 | 下载帮助
有声下吧 BAIDU 版权所有 Copyright ? 2009-2015 All rights reserved.
本站主要提供有声小说打包下载,为全国的盲童和视力障碍者及小说爱好者做一点儿公益奉献,如本站资源涉及版权问题,请告知我们,立即予以删除!
投稿及建议请: 下载帮助 最佳浏览方式 1024×768分辨率 IE 6.0 版本 站长统计