`
androider
  • 浏览: 752128 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

pyAMF.django的处理机制

阅读更多
既然跟django结合,就应该有一套处理request,response的机制。
pyamf里对应的就是 pyamf.remoting.gateway.django模块。打开能看到有一个类class DjangoGateway(gateway.BaseGateway),它就是整个处理流程的主干。仅仅需要在views.py中建立一个DjangoGateway实例,这个实例是urlmap对应的处理函数,它把从django底层传递过来的request(其实是AMF编码过的)解码,并映射相应的python对象,然后执行注册的RPC方法(就是flex调用amf过程中看到的方法调用)返回一个response,最后用AMF机制编码这个response,返回给 django。这样django再通过层层处理返回这个AMF信息给flex。如此便是一个完整的amf PRC调用过程。很多的server基本上都是基于类似的机制,通过中间件层层过滤request和response,达到隔离底层处理的目的。最后我们能看到,django内部处理amf的调用是如此之简单。

DjangoGateway有两个方法很重要,一个是__call__(python的特殊名字方法,自己定义的方法不能用这些名字哦,__call__使得对象能像方法那样用,比如有对象a,执行a()相当于执行a.__call__()。也许可以猜到了,没错,在django里urlmap需要有一个对应的处理函数,__call__就是起这个处理函数的作用)。还有一个就是getResponse方法。它的作用是处理解码后的request,这是一些很普通的方法调用,因为request已经AMF解码了,它会寻找合适的PRC方法(选择的依据就是 AMF指定的方法名,也就是flex调用amf url时的方法名)来处理request。
    def getResponse(self, http_request, request):
        """
        Processes the AMF request, returning an AMF response.
 
        @param http_request: The underlying HTTP Request.
        @type http_request: C{HTTPRequest}
        @param request: The AMF Request.
        @type request: L{Envelope
}
        @rtype: L{Envelope
}
        @return: The AMF Response.
        """
        response = remoting.Envelope(request.amfVersion, request.clientType)
 
        for name, message in request:
            processor = self.getProcessor(message)
            response[name] = processor(message, http_request=http_request)
 
        return response
 
    def __call__(self, http_request):
        """
        Processes and dispatches the request. 解码request,并处理
 
        @param http_request: The C{HTTPRequest} object. 来自django底层的httprequest对象,body还是被AMF编码的
        @type http_request: C{HTTPRequest}
        @return: The response to the request. 返回一个AMF编码过的response对象
        @rtype: C{HTTPResponse}
        """
        if http_request.method != 'POST':
            return http.HttpResponseNotAllowed(['POST'])
 
        context = pyamf.get_context(pyamf.AMF0)
        stream = None
        http_response = http.HttpResponse()
 
        # Decode the request 解码request对象
        try:
            request = remoting.decode(http_request.raw_post_data, context)
        except pyamf.DecodeError:
            self.logger.exception(gateway.format_exception())
            http_response.status_code = 400
 
            return http_response
 
        self.logger.debug("AMF Request: %r" % request)
 
        # Process the request 处理request,这里它调用了getResponse,就会按照指定的方法名来正式处理request
        try:
            response = self.getResponse(http_request, request)
        except (KeyboardInterrupt, SystemExit):
            raise
        except:
            self.logger.exception(gateway.format_exception())
 
            return http.HttpResponseServerError()
 
        self.logger.debug("AMF Response: %r" % response)
 
        # Encode the response 编码response,在返回之前要用AMF编码好
        try:
            stream = remoting.encode(response, context)
        except pyamf.EncodeError:
            self.logger.exception(gateway.format_exception())
 
            return http.HttpResponseServerError('Unable to encode the response')
 
        buf = stream.getvalue()
        http_response['Content-Type'] = remoting.CONTENT_TYPE
        http_response['Content-Length'] = str(len(buf))
        http_response['Server'] = gateway.SERVER_NAME
        http_response.write(buf)
 
        return http_response
分享到:
评论

相关推荐

    Python.Django视频教程.zip

    django-01-django安装.rar django-02-模板文件的导入.rar django-03-模板变量的使用.rar django-04-运算符-表达式.rar django-05-URL配置.rar Django-06-模板基本使用.rar Django-07-数据库使用-01.rar Django-08-...

    Python.Django视频教程-13.zip

    Python.Django视频教程-13.zip

    Sams.Django.Unleashed.0321985079

    《Sams.Django.Unleashed.0321985079》是一本深入讲解Django框架的专业书籍,适合对Python编程有一定基础并希望深入学习Django的开发者阅读。Django是用Python编写的高级Web开发框架,以其快速开发、内置安全性和“ ...

    The.Definitive.Guide.to.Django.Dec.2007.eBook-BBL\Apress.The.Definitive.Guide.to.Django

    Django的ORM(对象关系映射)机制自动处理所有底层的数据库操作。 ##### 2. 视图层(Views) 视图负责处理用户的请求并返回响应。它们可以访问模型层提供的数据,并使用模板层渲染HTML页面。Django的视图支持多种...

    Packt.Django.JavaScript.Integration.AJAX.and.jQuery

    《Packt.Django.JavaScript.Integration.AJAX.and.jQuery》这本书主要涵盖了使用Django框架与JavaScript技术,特别是AJAX和jQuery,进行高效Web开发的知识点。以下是对这些主题的详细解析: **Django框架**: ...

    4. Django 探究FBV视图

    【描述】:“配套资源”通常意味着这是一些与Django框架中的功能行为视图(Function-Based Views,简称FBV)相关的学习材料,可能包含了深入理解Django视图机制的基础知识和实践教程。 【标签】:“django”表明...

    基于Django的视频网站.zip基于Django的视频网站.zip基于Django的视频网站.zip基于Django的视频网站

    基于Django的视频网站.zip基于Django的视频网站.zip基于Django的视频网站.zip基于Django的视频网站.zip基于Django的视频网站.zip基于Django的视频网站.zip基于Django的视频网站.zip基于Django的视频网站.zip基于...

    精通Django.Django 1.8 LTS全解.pdf

    9. **缓存系统**:Django提供了多种缓存机制,包括内存缓存、数据库缓存等,以提高应用性能。 10. **测试与调试**:Django内建了全面的测试框架,支持单元测试、集成测试和功能测试。此外,它还有强大的错误报告和...

    Apress.Pro.Django.2nd.Edition.Jul.2013

    本书是《Apress.Pro.Django.2nd.Edition.Jul.2013》,是针对Django 1.5版本的深入开发教程。由于当时关于Django的教程相对较少,本书以浅入深的方式对Django的各个部分进行了详细的讲解。本书分为多个章节,从基础...

    Mastering.Django.Core.2016.12.pdf

    Mastering Django: Core is a completely revised and updated version of the original Django Book, written by Adrian Holovaty and Jacob Kaplan-Moss – the creators of Django. The main goal of this book ...

    Learning.Django.Web.Development

    From idea to prototype, a learner's guide for web development with the Django application framework About This Book Build two real-life based projects, one based on SQL and other based on NoSQL Best ...

    Addison.Wesley.Python.Web.Development.with.Django.Oct.2008.rar

    4. **表单和验证**:Django提供了一套强大的表单处理机制,包括自动生成HTML表单、验证用户输入和处理POST数据。这部分内容会涉及表单类、字段类型和验证规则。 5. **视图和响应**:视图是Django应用的心脏,它接收...

    2. Django配置信息

    'ENGINE': 'django.db.backends.postgresql', 'NAME': 'mydatabase', 'USER': 'myuser', 'PASSWORD': 'mypassword', 'HOST': 'localhost', 'PORT': '', } } ``` 2. **应用注册**:在`INSTALLED_APPS`列表中,...

    Django框架详解,Django的优缺点.zip

    django:Django框架详解,Django的优缺点.zip django:Django框架详解,Django的优缺点.zip django:Django框架详解,Django的优缺点.zip django:Django框架详解,Django的优缺点.zip django:Django框架详解,...

    Apress.Pro.Django.Dec.2008

    3. **静态文件管理(Static Files Management)**:Django提供了一套完善的静态文件处理机制,包括收集静态文件、配置静态文件服务等,使得开发者可以更加方便地管理和部署静态资源。 #### 五、Django的安全性 ...

Global site tag (gtag.js) - Google Analytics