2013-12-08 3 views
0

Я программирую простой скрипт python, который, если он запущен на localhost (с apache), будет генерировать html-страницу.Python скрипт, который генерирует HTML-страницу

Мой сценарий заключается в следующем (test.py):

#!/usr/bin/python 
# -*- coding: utf-8 -*- 

import cgitb         
cgitb.enable() 

import cgi 
form = cgi.FieldStorage() 

print "Content-type: text/html\n\n" 

x="hello" 
y="world" 

f= open('my.html', 'r').read() 
print f.format(x=val1, y=val2) 

Это открывает страницу HTML, которая имеет простой Javascript в главном элементе:

<head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
     <title>Test html</title> 

     <script type="text/javascript"> 
      $(document).ready(function() { 
       $("#select1").change(function() { 
        var selectedVal = $(this).find("option:selected").val(); 
        $("#select2 option").removeAttr("disabled").removeAttr("selected"); 
        $("#select2 option").each(function() { 
         if($(this).val() != selectedVal && $(this).val() != -1) 
          $(this).attr("disabled","disabled").removeAttr("selected"); 
        }); 
       }); 
      }); 
    </script> 


    </head> 

с большим количеством кода в тело. Когда я запускаю test.py, он говорит: Проблема возникла в скрипте Python. Вот последовательность вызовов функций, ведущих к ошибке, в том порядке, в котором они произошли.

/Library/WebServer/CGI-Executables/test.py in() 
    181 
    182 
    184 f= open('my.html', 'r').read() 
=> 185 print f.format(x=val1, y=val2) 
f = '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN...\n </form>\n <hr>\n </body>\n</html>', f.format = <built-in method format of str object>, val1 = 0, val2 = '',' 
<type 'exceptions.KeyError'>: '\n\t\t\t $("#select1")' 
     args = ('\n\t\t\t $("#select1")',) 
     message = '\n\t\t\t $("#select1")' 

Но если я удалить Javascript питон генерирует HTML без проблем, но мне нужно этот сценарий.

Как я могу выполнить скрипт без ошибок?

+0

Как вы думаете, 'f.format (x = val1, y = val2)' делает? – SLaks

+0

назначает строку «x» в поле ввода «val1». То же самое для y и val2. Val1 и val2 объявляются в теле HTML! Это всего лишь тест, но как я могу выполнить javascript? –

+0

Убедитесь, что Javascript не похож на сломанную строку формата, как сообщает вам ошибка. Кроме того, у вас есть отверстие XSS. – SLaks

ответ

1

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

$("#select1").change(function() { 
       var selectedVal = $(this).find("option:selected").val(); 
       $("#select2 option").removeAttr("disabled").removeAttr("selected"); 
       $("#select2 option").each(function() { 
        if($(this).val() != selectedVal && $(this).val() != -1) 
         $(this).attr("disabled","disabled").removeAttr("selected"); 

как ключ в пройденных вами kwargs. Решение, описанное здесь String format a JSON string gives KeyError, состоит в использовании двойных скобок. Ваш новый HTML-файл, то должен выглядеть примерно так:

<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <title>Test html</title> 

    <script type="text/javascript"> 
     $(document).ready(function() {{ 
      $("#select1").change(function() {{ 
       var selectedVal = $(this).find("option:selected").val(); 
       $("#select2 option").removeAttr("disabled").removeAttr("selected"); 
       $("#select2 option").each(function() {{ 
        if($(this).val() != selectedVal && $(this).val() != -1) 
         $(this).attr("disabled","disabled").removeAttr("selected"); 
       }}); 
      }}); 
     }}); 
</script> 


</head> 

(Обратите внимание на изменения от '{' на '{{' и '}' в '}}'.)

Позвольте мне знать, если у вас есть какие-либо последующие вопросы/что-то не сработало.

+0

Это работает! Спасибо! : D –

Смежные вопросы