python / django:如何检测并避免导入名称冲突?

时间:2013-04-18 15:35:16

标签: python django import conflict

我有一个我需要一些帮助。 在我的django应用程序中,我有这段代码:

from django.template import Context

render_dict = {'scan': oval_scan, 'user': user, 'vulns': oval_vulns, 'asset_vulns': asset_vulns}
report_html = get_template('oval_report.html').render(Context(render_dict))

然而,django给了我以下错误:

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 111, in get_response
    response = callback(request, *callback_args, **callback_kwargs)
  File "/home/nopsec/nopsecvrm/apps/pegasus/views.py", line 2359, in ovalReport
    report_html = get_template('pegasus/oval_report.html').render(Context(render_dict))
  File "/usr/local/lib/python2.7/dist-packages/django/template/base.py", line 121, in render
    context.render_context.push()
AttributeError: 'Context' object has no attribute 'render_context'

我记得我曾经遇到过这个错误,因为在另一个导入包中的其他地方还有另一个Context,这是错误使用的,所以我改变了我的代码(非常难看但有效):

import django

render_dict = {'scan': oval_scan, 'user': user, 'vulns': oval_vulns, 'asset_vulns': asset_vulns}
report_html = get_template('report.html').render(django.template.Context(render_dict))

我的问题是:如何通过查看回溯错误来确定哪个Context错误地使用了django?我该如何解决这种情况?感谢。

2 个答案:

答案 0 :(得分:4)

一种解决方案是通过别名导入的Context来避免冲突:

from django.template import Context as template_context

然后,当您需要使用的版本时,请参阅template_context。

答案 1 :(得分:0)

使用__import__模块中的__builtins__功能:

#Detecting name conflicts:
module_name_as_string = 'mymodule'

if module_name_as_string in globals(): #we have name collision
   try:
      custom_module = __import__(module_name_as_string)
   except ImportError:
      pass