zoukankan      html  css  js  c++  java
  • django源码笔记-【1】(转)

    add by zhj:第二段代码有修改

    原文:http://www.cnblogs.com/gaott/archive/2012/02/28/2371181.html

    前言

    Django是一个开放源代码的Web应用框架,她像一个工具箱,包括了整个web开发中的各种技术,例如ORM,Template等。这是在阅读django的源码中作的笔记。

    首先需要简要介绍以下WSGI。

    WSGI

    基本概念

    wsgi是Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。 在此接口中有两个方面,一个web应用程序类比java中的war包,一个是web服务器类比tomcat,apache。在这里我们只关注web应用程序。 参考http://www.python.org/dev/peps/pep-0333/

    在此接口中定义了一个服务器和应用程序通信的方法:

    复制代码
    #file:  app.py
    def simple_app(environ, start_response):
    """Simplest possible application object"""
    status = '200 OK'
    response_headers = [('Content-type', 'text/plain')]
    start_response(status, response_headers)
    return ['Hello world! ']
    复制代码

    服务器传递两个参数:environ,start_response到我们的应用程序中,我们根据自己的业务逻辑处理后, 调用start_response返回相应代码和响应头信息,并在方法的最后返回相应的内容。假设将此app.py部署在 服务器上,那么用户访问时,服务器将会返回 Hello world 字符串,并带着相应头信息。

    实例

    此处我们建立了一个应用程序也就是app,为该app创建一个view,另外值得注意的是middleware。 middleware和app是类似的东西,只不过它对于app的view实现了一个decorator的模式,看代码就明白了。

    复制代码
    import eventlet.wsgi

    def view_def(env, response_call):
    status = '200 ok'
    response_headers = [('Content-type', 'text/plain')]
    response_call(status, response_headers )
    return 'hello '

    class handler(object):
    def __init__(self, view):
    self._view = view

    def __call__(self, env, start_response):
    pre_middle = pre_middle(self._view)
    view_res = self._view(env, start_response)
     post_middle = post_middle(self._view)
    res = "%s %s %s" %(pre_middle.res,view_res,post_middle.res)

    return res

    class pre_middle(object):
    def __init__(self,view):
    print 'before app process...I run'
    self.res = "pre middle.."

    class post_middle(object):
        def __init__(self,view):
            print 'after app process...I run too'
    self.res = "..post middle"






    port = 1234
    sock = eventlet.listen(('0.0.0.0', port))
    handler_instance = handler(view_def)
    eventlet.wsgi.server(sock, handler_instance)
    复制代码

    代码思路: 创建一个view(view_def),给view包裹Middleware(pre_middle、post_middle),然后开启一个服务器(eventlet)并监听1234端口,若有请求,那么系统的处理顺序是:

    Request -> pre_middle -> view_def -> post_middle -> Response

    运行结果 

    运行脚本:

    在浏览器中浏览http://0.0.0.0:1234/可以看到以下效果

    后台输出:

    验证了我们的想法。

    下一篇将会介绍django中是如何实现WSGI的。o(∩∩)o...

  • 相关阅读:
    LeetCode(123) Best Time to Buy and Sell Stock III
    LeetCode(122) Best Time to Buy and Sell Stock II
    LeetCode(147) Insertion Sort List
    360兼容模式不支持hidden属性的问题
    第一个博客,用来勉励自己,加油
    【LGR-059】洛谷7月月赛题解
    Codechef July Challenge 2019 Division 1题解
    AtCoder Grand Contest 035
    Comet OJ
    2019-7-3 感记
  • 原文地址:https://www.cnblogs.com/ajianbeyourself/p/3644941.html
Copyright © 2011-2022 走看看