CherryPy - сохранение выбора флажков в переменные

Я пытаюсь создать простую веб-страницу с несколькими флажками, текстовым полем и кнопкой отправки.

Я только что столкнулся с веб-программированием на Python и пытаюсь понять, как это сделать с CherryPy.

Мне нужно связать каждый флажок с переменной, чтобы мой файл .py знал, какие из них были выбраны при нажатии кнопки «Пуск». Может кто-нибудь привести пример кода? Есть ли у меня какое-либо преимущество, включая какой-нибудь компилятор Python Javascript, такой как Pyjamas?

<form action="../remote_targets/ssh_grab.py">
  <label for="goal"><strong>Host Availability:</strong></label>
  <input style="margin-left: 30px;" type="checkbox" name="goal[]" value="cpu" /> CPU idle<br>
  <input style="margin-left: 30px;" type="checkbox" name="goal[]" value="lighttpd" /> Lighttpd Service<br>
  <input style="margin-left: 30px;" type="checkbox" name="goal[]" value="mysql" /> Mysql Service<br>
</form>

Спасибо !


person Joao Figueiredo    schedule 10.09.2010    source источник
comment
стиль "foo[]" для элементов формы списка является артефактом Ruby on Rails. Такие имена будут автоматически собраны в список, хотя такие имена, как "foo", останутся скалярными значениями. Я очень удобен, но совершенно не связан ни с HTML-формами, ни с HTTP, и не широко реализован в какой-либо другой веб-инфраструктуре, в python или где-либо еще.   -  person SingleNegationElimination    schedule 03.08.2011


Ответы (1)


Вот минимальный пример:

import cherrypy

class Root(object):
    @cherrypy.expose
    def default(self, **kwargs):
        print kwargs
        return '''<form action="" method="POST">
Host Availability:
<input type="checkbox" name="goal" value="cpu" /> CPU idle
<input type="checkbox" name="goal" value="lighttpd" /> Lighttpd Service
<input type="checkbox" name="goal" value="mysql" /> Mysql Service
<input type="submit">
</form>'''

cherrypy.quickstart(Root())

А вот вывод терминала:

$ python stacktest.py 
[10/Sep/2010:14:25:55] HTTP Serving HTTP on http://0.0.0.0:8080/
CherryPy Checker:
The Application mounted at '' has an empty config.
Submitted goal argument: None
127.0.0.1 - - [10/Sep/2010:14:26:09] "GET / HTTP/1.1" 200 276 "" "Mozilla..."
Submitted goal argument: ['cpu', 'mysql']
127.0.0.1 - - [10/Sep/2010:14:26:15] "POST / HTTP/1.1" 200 276 "http://localhost:8003/" "Mozilla..."
[10/Sep/2010:14:26:26] ENGINE <Ctrl-C> hit: shutting down app engine
[10/Sep/2010:14:26:26] HTTP HTTP Server shut down
[10/Sep/2010:14:26:26] ENGINE CherryPy shut down
$

Как видите, CherryPy соберет несколько элементов управления с одинаковыми именами в список. Вам не нужен суффикс [], чтобы заставить его сделать это. Затем просмотрите список, чтобы увидеть, какие значения были отправлены. (Имейте в виду, что если выбран только один элемент, то аргумент goal будет одной строкой, а не списком!)

person fumanchu    schedule 10.09.2010
comment
Ты святой! Я бы проголосовал за ваш ответ, если бы у меня уже были баллы. Спасибо, что подтолкнули меня в правильном направлении. У меня в основном все работает, я также использую 'argument_name'.length для защиты от вас, если выбран только один элемент, тогда аргумент цели будет одной строкой вместо предупреждения списка. Теперь мне нужно расшифровать, как внедрить в него некоторые базовые CSS (которые я до сих пор знаю ноль :)). Может ли кто-нибудь указать мне несколько примеров небольших проектов в CherryPy, подобных этому? Мне не удалось погуглить ничего, кроме ванильных примеров «Hello world!»/«базовый блог». - person Joao Figueiredo; 14.09.2010
comment
О, 'argument_name'.length На самом деле я использовал тип (argument_name), чтобы различать, как извлекать данные - person Joao Figueiredo; 14.09.2010