CGI - Надлежащая практика проектирования: setattr / eval / if-then? - PullRequest
0 голосов
/ 01 мая 2011

У меня есть вопрос о хорошей практике.Разрабатывая серверную часть для моей компании, в которой наши сотрудники по продажам могут управлять клиентами удаленно, я хочу, чтобы они просто нажимали «Изменить контактную информацию».(например) и заставить скрипт Python «manageClients.py» вызывать функцию «editContactInfo».

Очевидно, что самым простым способом сделать это будет href manageClients.pyfunction=editContactInfo&client=ClientName

и в скрипте после получения экземпляра fieldstorage:

if function:
      eval(function)

Однако всеЯ вижу, говорит не использовать eval, если этого можно избежать.Я не совсем понимаю setattr (), и я не знаю, как бы я превратил это в такой простой скрипт.Я также думаю, что if function=="editClientInfo: (и так далее) было бы слишком громоздким.

Очевидно, что приведенный выше код / ​​URL-адрес упрощен, поэтому я могу четко задать вопрос.Существуют меры безопасности и т. Д.

Я просто хочу найти способ справиться с этим, который считается хорошей практикой, поскольку это мой первый большой программный проект, и я хочу сделать это правильно.

Ответы [ 2 ]

1 голос
/ 01 мая 2011

Если я правильно понимаю, у вас есть набор функций, и вы хотите указать по имени, какую из них использовать. Я бы настроил словарь, отображающий имя на функцию, а затем просто просмотр, чтобы получить функцию для использования:

# 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: использование фреймворка, разработанного для веб-приложений, является лучшей практикой в ​​этом случае.

Единственная среда Python, с которой я когда-либо сталкивался, это Django . Это более «тяжелый» (более сложный) фреймворк, чем Flask или Bottle, но он имеет гораздо больше встроенных функций. Это действительно зависит от ваших потребностей, и я бы порекомендовал проверить их все, чтобы увидеть, какая из них лучше всего подходит для вашей ситуации.

1 голос
/ 01 мая 2011

CGI?Это древний преступник прошлого века.

Пожалуйста, используйте приличный веб-фреймворк Python для реализации вашей функциональности достойным и современным способом.

Небольшие фреймворки, такие как Flask или Bottle, оченьнамного, намного лучше, чем иметь дело с CGI в настоящее время - никаких оправданий, пожалуйста.В настоящее время нет никакой причины использовать CGI каким-либо образом.

Даже сборка чего-либо поверх Python HTTPServer является гораздо лучшим вариантом.

...