CGI - 良好的设计实践:setattr / eval / if-then?

时间:2011-05-01 12:58:58

标签: python cgi eval

我对良好做法有疑问。在为我的公司开发后端时,我们的销售人员可以远程管理客户,我希望他们能够单击“编辑联系信息”。 (例如)并让python脚本“manageClients.py”调用“editContactInfo”函数。

显然,最简单的方法是href manageClients.pyfunction=editContactInfo&client=ClientName

并在脚本中获取fieldstorage实例后:

if function:
      eval(function)

然而,我所看到的一切都表明,如果可以避免,就不要使用eval。我不完全理解setattr(),我真的不知道如何将它用于这样一个简单的脚本。我也认为if function=="editClientInfo :(依此类推)太笨重了。

显然上面列出的代码/ URL内容很简单,所以我可以清楚地问这个问题。有安全措施等。

我只想找到一种方法来解决这个被认为是好习惯的方法,因为这是我的第一个大型编程项目,我想做得对。

2 个答案:

答案 0 :(得分:1)

CGI?这是上个世纪的古代罪魁祸首。

请使用合适的Python Web框架来实现您的功能 以一种体面和现代的方式。

像Flask或Bottle这样的小框架比处理CGI要好得多 如今 - 请不要找借口。现在没有理由以任何方式使用CGI。

即使在Python HTTPServer之上构建一些东西也是一个更好的选择。

答案 1 :(得分:1)

如果我理解正确,您有一组功能,并且您希望按名称指定要使用的功能。我设置了一个将名称映射到函数的字典,然后只是一个简单的查找来获取要使用的函数:

# Map names to functions. Note there is no need for the names
# to match the actual function name, and the functions can appear
# multiple times.
function_map = {
    'editContactInfo': editContactInfo,
    'editClientInfo': editClientInfo,
    'editAlias': editContactInfo,
}

# Get name of function to run etc. I'm assuming that the function
# name is stored in the variable function_name, and any parameters 
# call it with is in the dictionary parameters (i.e., the functions
# all take keyword arguments).

# Do a lookup to get the function.
try:
    function = function_map[function_name]
except KeyError:
    # Replace with your own error handling code.
    print 'Function {0} does not exist.'.format(function_name)

# Call the function
result = function(**parameters)

这是进行查找的标准方法,这就是您要求的内容。但是,您还询问了最佳实践,并且我同意RestRisiko:在这种情况下,使用专为Web应用程序设计的框架是最佳实践。

我唯一真正体验过的Python框架是Django。这是一个比Flask或Bottle更“重”(更复杂)的框架,但内置了更多内置功能。这实际上取决于您的需求,我建议您仔细检查它们,看看哪种情况最适合您的情况。