Сценарий Python CGI - перенаправление не всегда работает - PullRequest
0 голосов
/ 02 декабря 2010

Я пишу небольшой CGI-скрипт для назначения (Python 2.4), который принимает данные формы, запускает команду оболочки с ними, а затем отображает ту или иную версию своей собственной страницы в зависимости от того, что он только что сделал.Например, если вы добавляете комментарий, он перезагружает версию страницы «элемент», а не представление «список всех элементов», включая новый комментарий.В программе есть несколько мест, где она должна перезагрузить себя.В одном месте это работает, а в одном - нет, и я ломаю голову, пытаясь увидеть разницу.

if mode == "change":
    if newcomment != "":
        comment_command = "some shell command \"" + item + "\" " + comment
        os.system(comment_command)
    if rating != "":
        rate_command = "same command \"" + item + "\" " + rating
        os.system(rate_command)
 # this NEVER works!
    print "%s%s" % ("Location:http://blahblah/cgi-bin/myproject.cgi?item=", urllib.quote_plus(item)) 

elif mode == "newitem":
    add_command = "command \"" + newitem + "\""
    result = os.system(add_command)
    retcode = os.WEXITSTATUS(result)
    # redirect depending on results
    if retcode == 1:
        # this one always works!
        print "%s%s" % ("Location:http://blahblah/cgi-bin/myproject.cgi?item=", urllib.quote_plus(newitem))
    else:
        print("Location:http://blahblah/cgi-bin/myproject.cgi")

Надеюсь, этого кода достаточно.Я не понимаю, почему это работает в одном месте, а не в другом.Я бы предположил, что он игнорирует как перенаправления, так и «проваливает» попытку перенаправления, за исключением того, что ?item= version работает в одном месте.В os.system есть что-то, чего я не понимаю?

Ответы [ 2 ]

0 голосов
/ 02 декабря 2010

Если ваша команда os.system напечатает что-либо, ваш заголовок Location может быть недействительным.

  • Убедитесь, что ваша os.system ничего не выводит
  • Если это так, заголовок Location должен быть перед тем, как какие-либо данные будут напечатаны
  • предпочитает модуль подпроцесса вместо os.system:
    import subprocess;
    subprocess.Popen(command, shell=True).communicate()
0 голосов
/ 02 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...