我对良好做法有疑问。在为我的公司开发后端时,我们的销售人员可以远程管理客户,我希望他们能够单击“编辑联系信息”。 (例如)并让python脚本“manageClients.py”调用“editContactInfo”函数。
显然,最简单的方法是href manageClients.pyfunction=editContactInfo&client=ClientName
并在脚本中获取fieldstorage实例后:
if function:
eval(function)
然而,我所看到的一切都表明,如果可以避免,就不要使用eval。我不完全理解setattr(),我真的不知道如何将它用于这样一个简单的脚本。我也认为if function=="editClientInfo
:(依此类推)太笨重了。
显然上面列出的代码/ URL内容很简单,所以我可以清楚地问这个问题。有安全措施等。
我只想找到一种方法来解决这个被认为是好习惯的方法,因为这是我的第一个大型编程项目,我想做得对。
答案 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更“重”(更复杂)的框架,但内置了更多内置功能。这实际上取决于您的需求,我建议您仔细检查它们,看看哪种情况最适合您的情况。