`
edison0951
  • 浏览: 71763 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

DJANGO深入使用之 ---Contex, RequestContext和Processor

阅读更多
class Context(object):
    "A stack container for variable context"
    def __init__(self, dict_=None, autoescape=True, current_app=None):
        dict_ = dict_ or {}
        self.dicts = [dict_]
        self.autoescape = autoescape
        self.current_app = current_app

    def __repr__(self):
        return repr(self.dicts)

    def __iter__(self):
        for d in self.dicts:
            yield d

    def push(self):
        d = {}
        self.dicts = [d] + self.dicts
        return d

    def pop(self):
        if len(self.dicts) == 1:
            raise ContextPopException
        return self.dicts.pop(0)

    def __setitem__(self, key, value):
        "Set a variable in the current context"
        self.dicts[0][key] = value

    def __getitem__(self, key):
        "Get a variable's value, starting at the current context and going upward"
        for d in self.dicts:
            if key in d:
                return d[key]
        raise KeyError(key)

    def __delitem__(self, key):
        "Delete a variable from the current context"
        del self.dicts[0][key]

    def has_key(self, key):
        for d in self.dicts:
            if key in d:
                return True
        return False

    __contains__ = has_key

    def get(self, key, otherwise=None):
        for d in self.dicts:
            if key in d:
                return d[key]
        return otherwise

    def update(self, other_dict):
        "Like dict.update(). Pushes an entire dictionary's keys and values onto the context."
        if not hasattr(other_dict, '__getitem__'):
            raise TypeError('other_dict must be a mapping (dictionary-like) object.')
        self.dicts = [other_dict] + self.dicts
        return other_dict
 

 

以上是DJANGO中Context的源码,其本质上是一个类似于堆栈的一个容器,拥有PYTHON字典和列表的一些方法,其主要功能是将传入的字典变成CONTEXT对象,送给TEMPLATE对象调用,当然了,我们可以用更快捷的方法如render_to_response(templatename, **kwargs)

接着让我们看看威力强大的RequestContext,下面是RequestContex的源码:

class RequestContext(Context):
    """
    This subclass of template.Context automatically populates itself using
    the processors defined in TEMPLATE_CONTEXT_PROCESSORS.
    Additional processors can be specified as a list of callables
    using the "processors" keyword argument.
    """
    def __init__(self, request, dict=None, processors=None, current_app=None):
        Context.__init__(self, dict, current_app=current_app)
        if processors is None:
            processors = ()
        else:
            processors = tuple(processors)
        for processor in get_standard_processors() + processors:
            self.update(processor(request))

 如上面的英文所说,其主要功能是可以调用Processor对象,在DJANGO project的SETTINGS里面有一个变量为TEMPLATE_CONTEXT_PROCESSORS,里面包含一部分内置的PROCESSOR,下面就来看看他们分别有什么作用吧:

django.contrib.auth.context_processors.auth:在模板里面可以直接使用user,message, perms对象。

perms也就是我们的权限模型哟。

django.core.context_processors.i18n:在模板里面可以直接使用settings的LANGUAGES和 LANGUAGE_CODE

django.core.context_processors.debug:在模板里面可以直接使用settings的DEBUG参数以及强大的sql_queries:它本身是一个字典,其中包括当前页面执行SQL查询所需的时间

django.core.context_processors.media:可以在模板里面使用settings的MEDIA_URL参数

django.core.context_processors.request:可以在模板中使用request对象(是强大的HttpRequset实例)

当然了,如果你觉得这写功能还不够,还可以写自己的PROCESSOR啦,自定义PROCESSOR的限制很少,本质上来说他就是一个PYTHON函数,只需要满足这几个条件就OK了:

1.传入参数必须有HttpRequest 2.返回值必须是个字典,3,使用时在settings的TEMPLATE_CONTEXT_PROCESSORS里申明。

关于Context和RequestContext的内容基本到此了,感觉PROCESSOR的功能和模板标签很相似。

分享到:
评论

相关推荐

    PyPI 官网下载 | django-tables2-column-shifter-0.3.0.tar.gz

    总的来说,`django-tables2-column-shifter`是Python和Django开发者的一个有力工具,它提升了`django-tables2`的用户体验,使数据表的列管理更加便捷。对于那些需要创建数据驱动的Web应用的开发者来说,这是一个值得...

    Python库 | django-taggit-serializer-0.1.5.tar.gz

    本文将深入探讨django-taggit-serializer的使用、功能以及在实际开发中的应用场景。 django-taggit-serializer是基于django-taggit的一个序列化库,它的主要任务是帮助我们在序列化和反序列化过程中处理Taggit创建...

    高效易用Django流程引擎源码 - django-lb-workflow

    项目概述:django-lb-workflow 是一个基于Python的高效易用Django...综合来看,django-lb-workflow是一个功能全面、易于集成的Django流程引擎,非常适合需要在现有系统中快速引入流程管理功能的开发者和项目团队使用。

    django-python3-ldap, python 3的Django LDAP用户身份验证后端.zip

    django-python3-ldap, python 3的Django LDAP用户身份验证后端 django-python3-ldapdjango-python3-ldap 为 python 2和 3提供了一个 Django LDAP用户身份验证后端。特性使用LDAP服务器验证用户身份。将LDAP用户与...

    Python库 | django-microsip-base-1.0.5.zip

    开发人员在使用`django-microsip-base` 时,需要熟悉Django的基本操作,包括安装依赖、配置项目、创建模型、编写视图和模板等。在部署时,通常会涉及到选择合适的Web服务器(如Gunicorn或uWSGI)、数据库服务器(如...

    Python库 | django-select2-forms-3.0.0.tar.gz

    在 `django-select2-forms-3.0.0.tar.gz` 压缩包中,包含了该库的源代码和必要的资源文件,供开发者在项目中集成和使用。安装此库后,开发者可以轻松地将 Select2 的功能引入到 Django 的 ModelForm 或自定义表单中...

    django-admin-bootstrap-master.zip

    回到【django-admin-bootstrap-master】项目,它将Bootstrap的样式和组件引入到Django的admin界面,以改善其外观和交互体验。项目内容可能包括以下几个方面: 1. **模板文件**:项目可能包含自定义的HTML模板,这些...

    基于Django+Django -Rest-Framework+Python的在线考试系统后端(源码).zip

    2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 4、本资源作为“参考资料”如果需要实现其他功能,...

    Python库 | django-sass-processor-0.8.2.tar.gz

    为了将Sass集成到Django项目中,开发者通常会使用`django-sass-processor`这个库。 **1. django-sass-processor简介** `django-sass-processor`是Django的一个第三方应用,它自动化了Sass文件的编译过程,使得在...

    django-vue3-admin 基于RBAC模型的权限控制的一整套基础开发平台,权限粒度达到列级别,前后端分离

    django-vue3-admin 基于RBAC模型的权限控制的一整套基础开发平台,权限粒度达到列级别,前后端分离,后端采用django + django-rest-framework,前端采用基于 vue3 + CompositionAPI + typescript + vite + ele

    Python库 | django_restql-0.3.1-py3-none-any.whl

    `django_restql`的核心功能是通过简化和扩展Django的`QuerySet` API,使开发者能够使用类似GraphQL的语法来查询数据库。它允许进行嵌套查询、过滤、排序和分页,同时保持性能高效。此外,`django_restql`还提供了...

    Django docs-1.11-en

    - **Writing custom django-admin commands (编写自定义 django-admin 命令)**: 介绍了如何添加自定义的命令行工具。 - **Writing custom model fields (编写自定义模型字段)**: 介绍了如何扩展模型字段类型。 - **...

    django-classy-tags, 基于类的Django 模板标记.zip

    django-classy-tags, 基于类的Django 模板标记 django-classy-tags请参考文档/目录中的文档以获得帮助。 有关HTML呈现版本的信息,请参见这里的 。 这里项目这个项目的目标是创建一种新的编写 Django 模板标签的方法...

    django3-cas-ng-4.0.0.tar.gz

    为支持django3对django_cas_ng进行修改 **Features** - Support CAS version 1.0, 2.0, 3.0 - Support Single Sign Out - Configuration of services via the django Admin application - Fine control on ...

    Python库 | django-sass-processor-0.4.4.tar.gz

    要在 Django 项目中使用 `django-sass-processor`,首先需要通过 pip 安装库: ```bash pip install django-sass-processor ``` 然后在项目的 `settings.py` 中进行配置,将 `django_sass_processor` 添加到 `...

    Python库 | django-minio-backend-2.5.0.tar.gz

    `django-minio-backend` 是一个专门为Python的Django框架设计的存储后端,它允许开发者将Django的静态文件和媒体文件存储在MinIO对象存储服务上。这个库使得在分布式系统中管理大量静态资源和用户上传的媒体文件变得...

    Python在线考试系统后端-大学毕业设计-基于Django+Django -Rest-Framework

    Python在线考试系统后端-大学毕业设计-基于Django+Django -Rest-Framework 适合大学生计算机专业的毕业设计,课程设计。 Python在线考试系统后端-大学毕业设计-基于Django+Django -Rest-Framework 适合大学生...

    Python库 | django-bs4-0.0.3.tar.gz

    在实际使用中,开发者首先需要将django-bs4-0.0.3.tar.gz文件下载到本地,然后使用tar命令解压,接着通过Python的pip工具进行安装,例如: ``` $ tar -zxvf django-bs4-0.0.3.tar.gz $ cd django-bs4-0.0.3 $ pip ...

    Python库 | django-layers-hr-1.9.tar.gz

    同时,由于Django的强大生态,开发者还可以利用大量的第三方库来增强功能,如使用`django-crispy-forms`优化表单展示,或者使用`django-rest-framework`构建API接口。 总的来说,`django-layers-hr-1.9`为Python...

    django-filebrowser-no-grappelli, 媒体管理无 Grappelli.zip

    django-filebrowser-no-grappelli, 媒体管理无 Grappelli Django FileBrowser 媒体管理 。( 基于 https://github.com/sehmaschine/django-filebrowser )FileBrowser是对 Django 命令行管理界面

Global site tag (gtag.js) - Google Analytics