【问题标题】:python - best way to call a variable between files?python - 在文件之间调用变量的最佳方法?
【发布时间】:2014-01-21 02:59:24
【问题描述】:

我在 DRF 中有一个视图设置 -

views.py

class APIDetail(APIView):
    def get(self, request, pk, format=None):
        query = model.objects.get(id=pk)

....

我基本上想将该 pk 作为变量传递到下面的渲染器中 -

renderers.py

def render(self, data, accepted_media_type=None, renderer_context=None):
    if data is None:
        return ''

    stream = StringIO()

    xml = SimplerXMLGenerator(stream, self.charset)
    xml.startDocument()
    xml.startElement("job id='string1' name='string2'",{})

我认为这就像让我在views.py中的类变得像这样简单 -

class APIDetail(APIView):
    def get(self, request, pk, format=None):
        def jobid():
            global pk
            return pk
        query = model.objects.get(id=pk)

....

然后以某种方式将该全局变量传递给 renderers.py 但我不知道该怎么做。我猜是这样的,但它不起作用。

def render(self, data, accepted_media_type=None, renderer_context=None):
    if data is None:
        return ''

    stream = StringIO()

    xml = SimplerXMLGenerator(stream, self.charset)
    xml.startDocument()
    xml.startElement("job id='string1' name='string2'",{}) [jobid]

我得到的只是全局名称“jobid”未定义。

【问题讨论】:

  • 你能在你的渲染器中检查data吗?
  • 渲染器可以很好地处理正在传递的数据,并且 pk 是有效的 jobid。我只想将它作为变量单独传递,以便在我正在呈现的自定义 xml 中的另一个位置调用。
  • 这个问题很不清楚。全局变量几乎总是一个坏主意,尤其是在像 Django 项目这样的多用户环境中。但是你到底想做什么?为什么不能简单地将 ID 传递给渲染器?

标签: python django django-rest-framework


【解决方案1】:

考虑到@DanielRoseman 的担忧,我决定以不同的方式处理这个问题。我正在更改视图以直接在行中传递,此时我将弄清楚如何将整个数据传递给渲染器。这是所有变量都在视图中本地传递,仅通过自定义渲染器渲染。

【讨论】:

    【解决方案2】:

    您需要将jobid 变量声明为全局变量,因此:global jobidrender 函数本身中。我假设它在其他地方被正确定义。

    已编辑以清除以下评论:

    def render(self, data, accepted_media_type=None, renderer_context=None):
        global jobid ###this is what you need to add
        if data is None:
            return ''
    
        stream = StringIO()
    
        xml = SimplerXMLGenerator(stream, self.charset)
        xml.startDocument()
        xml.startElement("job id='string1' name='string2'",{}) [jobid]
    

    【讨论】:

    • 好的,我在views.py 中将其称为上述全局函数。我试图将渲染中的行更改为 [global jobid],现在它在该行上抱怨“无效语法”。
    • 不,你真的不想这样做。首先,global 表示在单个文件中,因此不能解决 OP 的问题;其次,您会遇到各种线程安全问题。不要这样做。
    • @DanielRoseman - 那么替代方案是什么?我已经有了将“数据”传递给渲染器的视图,我怎么能让它也传递“pk”?
    猜你喜欢
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2020-03-12
    • 2015-04-30
    • 2015-05-07
    相关资源
    最近更新 更多