Какой атрибут указывает путь к файлу или странице, где находится обработчик данных формы
Обновлено: 21.11.2024
Это руководство знакомит вас с концепциями и функциями веб-фреймворка Bottle и охватывает как базовые, так и дополнительные темы. Вы можете прочитать его от начала до конца или использовать в качестве справочного материала позже. Автоматически сгенерированный справочник по API также может быть вам интересен. Он охватывает больше деталей, но объясняет меньше, чем этот учебник. Решения для наиболее распространенных вопросов можно найти в нашей коллекции рецептов или на странице часто задаваемых вопросов. Если вам нужна помощь, присоединяйтесь к нашему списку рассылки или посетите наш канал IRC.
Установка¶
Bottle не зависит ни от каких внешних библиотек. Вы можете просто загрузить Bottle.py в каталог вашего проекта и начать программировать:
Это позволит вам получить последнюю версию разработки, включающую все новые функции. Если вы предпочитаете более стабильную среду, вам следует придерживаться стабильных выпусков. Они доступны в PyPI и могут быть установлены через pip (рекомендуется), easy_install или менеджер пакетов:
В любом случае вам потребуется Python 2.7 или более поздней версии (включая 3.4+) для запуска бутылочных приложений. Если у вас нет разрешений на установку общесистемных пакетов или вы просто не хотите этого делать, сначала создайте виртуальную среду:
Или, если virtualenv не установлен в вашей системе:
Быстрый старт: «Привет, мир»¶
В этом руководстве предполагается, что у вас либо установлен Bottle, либо скопирован в каталог вашего проекта. Давайте начнем с очень простого примера «Hello World»:
Декоратор route() связывает фрагмент кода с путем URL. В этом случае мы связываем путь /hello с функцией hello(). Это называется маршрутом (отсюда и название декоратора) и является наиболее важной концепцией этого фреймворка. Вы можете определить столько маршрутов, сколько хотите. Всякий раз, когда браузер запрашивает URL-адрес, вызывается соответствующая функция, и возвращаемое значение отправляется обратно в браузер. Это так просто.
Вызов run() в последней строке запускает встроенный сервер разработки. Он работает на локальном порту 8080 и обслуживает запросы до тех пор, пока вы не нажмете Control-c. Вы можете переключить серверную часть позже, но пока сервер разработки — это все, что нам нужно. Он вообще не требует настройки и является невероятно безболезненным способом настроить и запустить приложение для локальных тестов.
Режим отладки очень полезен на ранних стадиях разработки, но его следует отключить для общедоступных приложений. Имейте это в виду.
Это всего лишь демонстрация основной концепции создания приложений с помощью Bottle. Продолжайте читать, и вы увидите, что еще возможно.
Приложение по умолчанию¶
Для простоты в большинстве примеров в этом руководстве для определения маршрутов используется декоратор route() на уровне модуля. Это добавляет маршруты к глобальному «приложению по умолчанию», экземпляру Bottle, который автоматически создается при первом вызове route(). Несколько других декораторов и функций уровня модуля относятся к этому приложению по умолчанию, но если вы предпочитаете более объектно-ориентированный подход и не возражаете против дополнительного ввода, вы можете создать отдельный объект приложения и использовать его вместо глобального: р>
Подробнее объектно-ориентированный подход описан в разделе "Приложение по умолчанию". Просто помните, что у вас есть выбор.
Маршрутизация запросов¶
В предыдущей главе мы создали очень простое веб-приложение с единственным маршрутом. Вот еще часть маршрутизации примера «Hello World»:
Декоратор route() связывает путь URL с функцией обратного вызова и добавляет новый маршрут в приложение по умолчанию . Однако приложение с одним маршрутом довольно скучно. Добавим еще немного (не забудьте из шаблона импорта бутылок):
Этот пример демонстрирует две вещи: вы можете связать более одного маршрута с одним обратным вызовом, и вы можете добавить подстановочные знаки к URL-адресам и получить к ним доступ через аргументы ключевого слова.
Динамические маршруты¶
Маршруты, содержащие подстановочные знаки, называются динамическими маршрутами (в отличие от статических маршрутов ) и соответствуют нескольким URL одновременно. Простой подстановочный знак состоит из имени, заключенного в угловые скобки (например, ), и принимает один или несколько символов до следующей косой черты (/). Например, маршрут /hello/ принимает запросы для /hello/alice, а также для /hello/bob, но не для /hello, /hello/ или /hello/mr/smith.
Каждый подстановочный знак передает закрытую часть URL в качестве аргумента ключевого слова обратному вызову запроса. Вы можете использовать их сразу и с легкостью реализовать RESTful, красивые и осмысленные URL-адреса. Вот несколько других примеров вместе с URL-адресами, которым они соответствуют:
Фильтры можно использовать для определения более конкретных подстановочных знаков и/или преобразования закрытой части URL перед ее передачей обратному вызову. Отфильтрованный подстановочный знак объявляется как или . Синтаксис дополнительной части конфигурации зависит от используемого фильтра.
Следующие фильтры реализованы по умолчанию, но можно добавить и другие:
- :int соответствует только цифрам (со знаком) и преобразует значение в целое число.
- :float аналогично :int, но для десятичных чисел.
- :path соответствует всем символам, включая символ косой черты, нежадным образом и может использоваться для сопоставления более чем одного сегмента пути.
- :re позволяет указать пользовательское регулярное выражение в поле конфигурации. Соответствующее значение не изменяется.
Давайте рассмотрим несколько практических примеров:
Вы также можете добавить свои собственные фильтры. Подробнее см. в разделе Маршрутизация запросов.
Метод POST обычно используется для отправки формы HTML. В этом примере показано, как обрабатывать форму входа с помощью POST:
В этом примере URL-адрес /login связан с двумя разными обратными вызовами: один для запросов GET, а другой — для запросов POST. Первый отображает HTML-форму для пользователя. Второй обратный вызов вызывается при отправке формы и проверяет учетные данные для входа, которые пользователь ввел в форму. Использование Request.forms более подробно описано в разделе «Запрос данных».
Специальные методы: HEAD и ANY
Метод HEAD используется для запроса ответа, идентичного тому, который соответствует запросу GET, но без тела ответа. Это полезно для получения метаинформации о ресурсе без загрузки всего документа. Bottle обрабатывает эти запросы автоматически, возвращаясь к соответствующему маршруту GET и отсекая тело запроса, если оно есть. Вам не нужно указывать маршруты HEAD самостоятельно.
Подводя итог: запросы HEAD возвращаются к маршрутам GET, а все запросы возвращаются к маршрутам ANY, но только в том случае, если нет соответствующего маршрута для исходного метода запроса. Это так просто.
Маршрутизация статических файлов¶
Статические файлы, такие как изображения или файлы CSS, не обслуживаются автоматически. Вы должны добавить маршрут и обратный вызов, чтобы контролировать, какие файлы обслуживаются и где их найти:
Функция static_file() помогает обслуживать файлы безопасным и удобным способом (см. Статические файлы). Этот пример ограничен файлами непосредственно в каталоге /path/to/your/static/files, потому что подстановочный знак не будет соответствовать пути с косой чертой. Чтобы обслуживать файлы в подкаталогах, измените подстановочный знак, чтобы использовать фильтр пути:
Будьте осторожны при указании относительного корневого пути, такого как root='./static/files' . Рабочий каталог ( ./ ) и каталог проекта не всегда совпадают.
Страницы ошибок¶
Создание контента¶
В чистом WSGI диапазон типов, которые вы можете вернуть из своего приложения, очень ограничен. Приложения должны возвращать итерируемые байтовые строки. Вы можете вернуть строку (поскольку строки повторяемы), но это заставляет большинство серверов передавать ваш контент char за char. Строки Unicode вообще запрещены. Это не очень практично.
Бутылка гораздо более гибкая и поддерживает широкий спектр типов. Он даже добавляет заголовок Content-Length, если это возможно, и автоматически кодирует юникод, поэтому вам не нужно этого делать. Далее следует список типов данных, которые вы можете вернуть из обратных вызовов вашего приложения, и краткое описание того, как они обрабатываются платформой:
Порядок в этом списке важен. Например, вы можете вернуть подкласс str с помощью метода read(). Он по-прежнему обрабатывается как строка, а не как файл, поскольку строки обрабатываются в первую очередь.
Изменение кодировки по умолчанию
Статические файлы¶
Вы можете напрямую возвращать файловые объекты, но static_file() является рекомендуемым способом обслуживания статических файлов. Он автоматически угадывает MIME-тип, добавляет заголовок Last-Modified, ограничивает пути к корневому каталогу из соображений безопасности и генерирует соответствующие ответы об ошибках (403 при ошибках прав доступа, 404 при отсутствующих файлах). Он даже поддерживает заголовок If-Modified-Since и в конечном итоге генерирует ответ 304 Not Modified. Вы можете передать пользовательский тип MIME, чтобы отключить угадывание.
Вы можете увеличить возвращаемое значение static_file() как исключение, если вам это действительно нужно.
Большинство браузеров пытаются открыть загруженные файлы, если тип MIME известен и назначен приложению (например, PDF-файлы). Если это не то, что вам нужно, вы можете вызвать диалоговое окно загрузки и даже предложить имя файла пользователю:
Если параметр загрузки имеет значение True , используется исходное имя файла.
Чтобы перенаправить клиента на другой URL-адрес, вы можете отправить ответ 303 See Other, указав в заголовке Location новый URL-адрес. redirect() сделает это за вас:
Объект ответа¶
Заголовки ответа, такие как Cache-Control или Location, определяются с помощью Response.set_header() . Этот метод принимает два параметра: имя заголовка и значение. Часть имени нечувствительна к регистру:
Большинство заголовков уникальны, то есть клиенту отправляется только один заголовок для каждого имени. Однако некоторые специальные заголовки могут появляться в ответе более одного раза. Чтобы добавить дополнительный заголовок, используйте Response.add_header() вместо Response.set_header():
Файлы cookie¶
Запрос данных¶
Файлы cookie, заголовок HTTP, HTML ''' @route ('/login', method = 'POST') def do_login (): username = request . формы . получить ('имя пользователя') пароль = запрос. формы . получить ('пароль'), если check_login (имя пользователя, пароль): вернуть "
Ваша информация для входа была правильной.
Есть несколько других атрибутов, используемых для доступа к данным формы. Некоторые из них объединяют значения из разных источников для облегчения доступа. Следующая таблица должна дать вам хороший обзор.
Атрибут | Поля формы GET | Поля формы POST | Загрузка файлов |
---|---|---|---|
BaseRequest.query | да | нет | нет |
BaseRequest.forms | нет | да | нет | BaseRequest.files | нет | нет | да |
BaseRequest.params < /td> | да | да | нет |
BaseRequest.GET | да td> | нет | нет |
BaseRequest.POST | нет | да | да |
Загрузка файлов¶
Хостинг:
Быстрый поиск
© Авторские права, 2009-2022, Марсель Хеллкамп - контакт
Последнее обновление: 15 марта 2022 г. Создано с использованием Sphinx 1.6.7.
Работает на Bottle 0.13-dev
Многие функции ColdFusion Ajax используют привязку для обеспечения динамической интерактивности на основе пользовательского ввода или изменения данных. При использовании привязки оценивается выражение привязки, и отображение обновляется на основе новых данных каждый раз, когда определенное событие (по умолчанию onChange) происходит в поле элемента управления формы, заданном bind параметр. Таким образом, значение тега, задающего выражение привязки, и отображение обновляются динамически на основе изменяющейся информации, включая введенные пользователем данные формы. При использовании привязки содержимое страницы обновляется, но вся страница не обновляется.
Примечание. Если связанное окно не видно или вкладка не выбрана, ее содержимое не обновляется при изменении элементов управления, к которым оно привязано. Когда вкладка или окно становятся видимыми, они обновляются только в том случае, если события были получены от связанных элементов управления, когда элемент управления не был виден.
- Атрибуты и значения элементов управления формы ColdFusion. Вы можете выполнить привязку к следующим элементам управления:
- cfgrid
- cfinput с флажком, полем даты, файлом, скрытым, радио или текстовым типом
- cfselect
- cftextarea
- cftree
Примечание. Вы не можете использовать выражение привязки для привязки к элементам управления в динамически загружаемом регионе. Например, вы не можете выполнить привязку элемента управления на одной странице к элементу управления в области макета на этой странице, если тег cflayoutarea использует исходный атрибут для своего содержимого. Однако динамически загружаемый регион привязывается к элементам управления на загружающей его странице, поэтому файл, указанный исходным атрибутом, использует выражения привязки, указывающие элементы управления на странице, содержащей тег cflayoutarea.
Результаты выражения привязки определяют значение тега, использующего это выражение. Например, если вы указываете URL-адрес в выражении привязки в качестве исходного атрибута элемента управления cfwindow, страница, указанная URL-адресом, должна возвращать полное содержимое окна.
Дополнительные примеры см. в разделе Использование компонентов и функций пользовательского интерфейса Ajax и на справочных страницах для элементов управления, поддерживающих привязку.Использование выражений связывания
Чтобы указать выражение привязки, используйте один из следующих форматов:
Примечание. В ColdFusion 9 (и только в ColdFusion 9 это примечание не относится к ColdFusion 10!), путь к компоненту не может использовать сопоставление. Значение componentPath должно быть разделенным точками путем от корневого веб-сайта или каталога, содержащего текущую страницу.
- javascript:имя_функции(параметры)
- url:URL?параметры
- URL?параметры
- Строка, содержащая один или несколько экземпляров параметра привязки>,
например, .@
В форматах 1–4 параметры обычно включают один или несколько параметров привязки. В следующей таблице перечислены атрибуты тегов, которые поддерживают выражения привязки, и используемые форматы:
В следующих примерах показаны некоторые из этих вариантов использования:
bind="cfc:myapp.bookorder.getChoices()"
исходный код">functionName = function(arguments)Определения функций, использующие следующий формат, могут не работать:
функция имя_функции (аргументы)
Однако Adobe рекомендует включать весь пользовательский код JavaScript во внешние файлы JavaScript и импортировать их на главную страницу приложения, а не встраивать их в код, полученный с помощью исходного атрибута. На импортированные страницы это ограничение формата определения функции не распространяется.
Указание параметров привязки
Параметр связывания указывает значение элемента управления формой или другой атрибут, как в следующем примере:
В этом примере параметр связывания — form1:bookTitle и указывает атрибут значения поля bookTitle формы form1.
Параметры привязки имеют один из следующих форматов:Квадратные скобки ([]) указывают на необязательное содержимое и не являются частью параметра.
Чтобы включить литеральную фигурную скобку в
выражение привязки, экранируйте символ обратной косой чертой, например .Значение имени формы
Запись formname определяет форму, содержащую элемент управления, к которому выполняется привязка. Укажите имя формы, если несколько форм содержат цели привязки с одинаковыми именами. Чтобы указать имя формы, начните выражение привязки с атрибута id формы, атрибута имени, если вы не указали атрибут id, и поставьте после него двоеточие (:). Например, чтобы указать элемент управления книгой в форме с именем inputForm, используйте следующий формат:
Значение controlName
Для привязки к полю формы значение controlName должно быть значением атрибута id или name элемента управления формы, к которому выполняется привязка. Если у элемента управления есть и атрибут id, и атрибут name, используйте любое значение. Вы можете выполнить привязку к любому элементу управления формы ColdFusion, включая cfgrid и cftree. Вы не можете привязываться к значениям в других тегах ColdFusion, таких как cftable. Для привязки к набору данных Spry укажите имя набора данных в этой части параметра привязки. Вы можете привязать к нескольким переключателям или флажкам, назначив им одинаковые значение имени. Если все переключатели в группе переключателей имеют одинаковое значение имени, параметр привязки представляет выбранную кнопку. Если несколько флажков имеют одинаковое значение имени, параметр привязки представляет значения выбранных элементов управления в списке с разделителями-запятыми. Если вы также указываете уникальный атрибут id для каждого флажка или переключателя, укажите тег метки HTML для каждой кнопки или флажка и используйте значение id в атрибуте for; в этом случае пользователи выбирают элементы, щелкая метку, а не только кнопку или поле. Если элемент управления cfselect поддерживает множественный выбор, выражение привязки возвращает информацию о выбранных элементах в списке с разделителями-запятыми. Вы можете выполнять привязку только к элементам управления. которые доступны в дереве DOM при регистрации привязки. Привязки регистрируются, когда страница с выражением привязки загружается либо в окне браузера, либо в теге контейнера. В результате, если у вас есть два контейнера cfdiv, cflayoutarea, cfpod или cfwindow, которые вы загружаете с помощью атрибута источника (или для тега cfdiv, bind), вы не можете связать элементы управления в одном контейнере с элементами управления в другом, поскольку один контейнер нельзя быть уверенным, что другой загружен, когда он загружается. Точно так же элементы на главной странице не могут быть привязаны к элементам в динамически загружаемом контейнере. Чтобы предотвратить эту проблему, определите цель привязки в строке на главной странице вместо использования источника или атрибута привязки для извлечения разметки, содержащей цель привязки. Другими словами, «главная» форма с полями, служащими источниками выражений привязки, загружается статически (на главной странице), а «дочерние» элементы управления, зависящие от данных, загружаются динамически, на странице, указанной в атрибут источника или привязки.
Значение attributeName
При привязке к элементу управления формы по умолчанию выражение привязки представляет атрибут значения указанного элемента управления. Если целью привязки является тег cfselect, выражение привязки представляет собой список значений выбранных элементов, разделенных запятыми. Чтобы выполнить привязку к другому атрибуту, после имени или идентификатора элемента управления следует точка (.) и имя атрибута. Чтобы передать атрибут checked флажка тега cfinput в качестве параметра CFC, например, используйте следующее выражение:
Префиксbind on". Следующий код, например, выполняет CFC getChoices каждый раз, когда пользователь нажимает кнопку мыши, когда указатель находится над элементом управления книгой:
Примечание. Чтобы выполнить привязку к элементу управления cfinput с атрибутом типа кнопки, укажите параметр события привязки, например щелчок. Событие изменения является событием по умолчанию, не имеет эффекта.
При привязке к набору данных Spry не указывайте событие. Выражение оценивается, когда выбранная строка изменяется в наборе данных или когда набор данных перезагружается с новыми данными. Вы также можете указать, что конкретный параметр привязки никогда не запускает повторную оценку выражения привязки, указав @none в качестве события. Это полезно, например, если выражение привязки использует несколько параметров привязки, привязанных к разным полям формы, и вы хотите, чтобы выражение привязки инициировало изменения только при изменении одного из полей, а не при изменении других. В этом случае вы должны указать @none для остальных полей, чтобы события из этих полей не запускали привязку. Следующий код показывает это использование:
Спецификатор события @none также полезен при использовании с автоматическим вводом текста, деревьями и сетками, как показано ниже:
- При использовании автоматического ввода текста выражение привязки оценивается по мере того, как пользователь вводит текст, и извлекает данные из всех параметров привязки, включая те параметры, для которых указано @none. Поэтому для автоподсказки укажите @none для всех параметров привязки, потому что она никак не может реагировать на изменение параметров.
- При вызове функции ColdFusion.Grid.refresh или ColdFusion.Tree.refresh функция извлекает данные из всех параметров привязки при оценке выражения привязки, включая любые параметры с указанным @none. Если вы укажете @none для всех параметров привязки, дерево или сетка могут не реагировать на изменения в других элементах управления, но получать данные из всех параметров привязки каждый раз, когда вы явно обновляете их.
Использование функций CFC в выражениях связывания
Как и в случае с функциями JavaScript, вы передаете аргументы в функцию CFC, указанную в выражении привязки, позиционно. При этом имена аргументов в определении функции CFC не обязательно должны совпадать с именами параметров связывания, но аргументы в выражении связывания должны быть в том же порядке, что и аргументы в определении функции CFC.
В качестве альтернативы вы передаете именованные аргументы функции CFC. Затем выражение связывания и функция CFC должны использовать одни и те же имена для аргументов, и функция не обязана определять аргументы в том же порядке, в котором они передаются. Чтобы указать имена аргументов в выражении привязки, используйте следующий формат, в котором используются два именованных параметра, arg1 и arg2:Поддержка CFC за пределами веб-корня
Примечание. Чтобы использовать эту функцию, необходимо установить ColdFusion 9, обновление 1.
Доступ к компонентам за пределами веб-корня можно получить в выражениях привязки. Это означает, что такие теги, как cfajaxproxy или компоненты Ajax, такие как сетка, карта или индикатор выполнения, могут использоваться более эффективно.
Примечание. В предыдущих выпусках CFC должны были быть доступны через Интернет для работы приложений Ajax.
Помимо доступа к CFC с использованием относительного или абсолютного пути, вы также можете использовать любой из следующих методов для доступа к CFC:
- логические сопоставления (определенные в администраторе ColdFusion)
- сопоставления для каждого приложения (определены в Application.cfc)
- импорт (используя cfimport/import)
Использование
В следующем коде показано использование этого усовершенствования с сопоставлениями для каждой карты:
Application.cfc
THIS.mappings["/mycfc"] = "C:\www\shared\components";
Test.cfmПример
В этом примере сопоставление для каждого приложения с именем mycfcs было создано в Application.cfc, указывающим на "c:\components". Чтобы пример кода работал, создайте папку с именем component в корне вашей системы (в данном примере c:) и скопируйте в нее файл Employee.cfc.Application.cfc
удалить любую функцию getEmployees(page,pageSize,gridsortcolumn="EMP_ID",gridsortdirection="ASC") <
var startRow = (page-1)*pageSize;
var endRow = page*pageSize;if(!isdefined("arguments.gridsortcolumn") or isdefined("arguments.gridsortcolumn") and trim(arguments.gridsortcolumn) eq "")
gridsortcolumn = "EMP_ID";
if(!isdefined("arguments.gridsortdirection") или isdefined("arguments.gridsortdirection") и arguments.gridsortdirection eq "")
gridsortdirection = "ASC";
var mysql = "ВЫБЕРИТЕ Emp_ID, Имя, EMail, Отдел ОТ Сотрудников";
if(isdefined("arguments.gridsortcolumn") и arguments.gridsortcolumn neq "")
mysql = mysql & " ORDER BY " & gridsortcolumn;
if(isdefined("arguments.gridsortdirection") и arguments.gridsortdirection neq "")
mysql = mysql & " " & gridsortdirection ;
rs1 = новый запрос(name="team", datasource="cfdocexamples", sql=mysql).execute();
возврат QueryConvertForGrid(rs1.getResult(), page, pageSize);
>
удалить любую функцию editEmployees(gridaction,gridrow,gridchanged) <
writelog("редактировать информацию о сотруднике");
>Использование привязки в атрибутах управления
При использовании прямой привязки вы указываете выражение привязки в форме ColdFusion или в атрибуте управления отображением. В самой простой форме привязки вы используете поля формы, такие как поле имени, для заполнения других полей, таких как поле электронной почты, как в следующем примере. показывает. Когда вы вводите имя или домен и нажимаете Tab в другом поле, имя добавляется в поле электронной почты.
Что означает enctype='multipart/form-data' в HTML-форме и когда ее следует использовать?
Он предназначен для отправки целых файлов при отправке формы. Я думал, что это может иметь какое-то отношение к вводу нескольких частей текстовой формы, но это не так, это просто для загрузки файлов.
10 ответов 10
Когда вы отправляете запрос POST, вы должны каким-то образом закодировать данные, формирующие тело запроса.
Формы HTML поддерживают три метода кодирования.
- application/x-www-form-urlencoded (по умолчанию)
- составные/данные формы
- текст/обычный
Велась работа по добавлению application/json , но от нее отказались.
Когда вы пишете клиентский код:
- используйте multipart/form-data, если ваша форма содержит какие-либо элементы
- в противном случае вы можете использовать multipart/form-data или application/x-www-form-urlencoded, но application/x-www-form-urlencoded будет более эффективным
Когда вы пишете серверный код:
Большинство (например, параметр CGI->Perl или параметр, предоставляемый суперглобальным параметром PHP $_POST) позаботятся о различиях за вас. Не утруждайте себя анализом исходных данных, полученных сервером.
Иногда вы найдете библиотеку, которая не поддерживает оба формата. Наиболее популярной библиотекой Node.js для обработки данных форм является body-parser, которая не может обрабатывать составные запросы (но имеет документацию, в которой рекомендуются некоторые альтернативы, которые могут это делать).
Если вы пишете (или отлаживаете) библиотеку для синтаксического анализа или создания необработанных данных, вам нужно начать беспокоиться о формате. Вы также можете узнать об этом ради интереса.
application/x-www-form-urlencoded более или менее совпадает со строкой запроса в конце URL-адреса.
multipart/form-data значительно сложнее, но позволяет включать в данные целые файлы. Пример результата можно найти в спецификации HTML 4.
text/plain введен в HTML 5 и полезен только для отладки — из спецификации: Они не могут быть надежно интерпретированы компьютером — и я бы сказал, что другие в сочетании с инструментами (такими как сетевая панель в инструментах разработчика большинства браузеров) для этого лучше).
@Quentin Извините, какие вероятные проблемы возникнут, если мы будем использовать multipart для всех форм? с файлами и без них.
@MasterJoe, так как он может иметь несколько элементов данных, разделенных границами, см. RFC 2046, раздел 5.1.1.
Ответ Квентина правильный: используйте multipart/form-data, если форма содержит загрузку файла, и application/x-www-form-urlencoded в противном случае, что является значением по умолчанию, если вы опустите enctype .
- добавьте еще несколько ссылок на HTML5
- объясните, почему он прав, на примере отправки формы
Ссылки HTML5
Есть три варианта enctype :
Как создавать примеры
Как только вы увидите пример каждого метода, станет понятно, как они работают и когда следует использовать каждый из них.
Вы можете создавать примеры, используя:
Сохраните форму в минимальный файл .html:
Создайте файлы для загрузки:
Запустите наш маленький эхо-сервер:
Откройте HTML-код в браузере, выберите файлы, нажмите «Отправить» и проверьте терминал.
nc распечатывает полученный запрос.
Проверено на: Ubuntu 14.04.3, nc BSD 1.105, Firefox 40.
составные/данные формы
Для двоичного файла и текстового поля байты 61 CF 89 62 ( aωb в UTF-8) отправляются буквально. Вы можете проверить это с помощью nc -l localhost 8000 | hd , который говорит, что байты:
были отправлены ( 61 == 'a' и 62 == 'b').
Поэтому ясно, что:
Content-Type: multipart/form-data; border=----------------------------------------735323031399963166993862150 устанавливает тип содержимого на multipart/form-data и говорит, что поля разделены заданным граничная строка.
Но учтите, что:
имеет на два тире меньше, чем фактический барьер
Это связано с тем, что стандарт требует, чтобы граница начиналась с двух дефисов -- . Другие тире кажутся именно тем, как Firefox решил реализовать произвольную границу. В RFC 7578 четко упоминается, что эти два начальных дефиса -- обязательны:
<блочная цитата>4.1. "Граница" Параметр multipart/form-data
Как и в случае с другими составными типами, части разделены граничным разделителем, построенным с использованием CRLF, "--" и значения параметра "boundary" .
каждое поле получает несколько подзаголовков перед данными: Content-Disposition: form-data; , имя поля, имя файла и данные.
Сервер считывает данные до следующей граничной строки. Браузер должен выбрать границу, которая не будет отображаться ни в одном из полей, поэтому граница может различаться между запросами.
Поскольку у нас есть уникальная граница, кодирование данных не требуется: двоичные данные отправляются как есть.
Content-Type автоматически определяется браузером.
application/x-www-form-urlencoded
Теперь измените enctype на application/x-www-form-urlencoded , перезагрузите браузер и повторите отправку.
Очевидно, что данные файла не были отправлены, только базовые имена. Поэтому это нельзя использовать для файлов.
Что касается текстового поля, мы видим, что обычные печатные символы, такие как a и b, отправлялись одним байтом, а непечатаемые, такие как 0xCF и 0x89, занимали по 3 байта каждый: %CF%89 !
Сравнение
Загружаемые файлы часто содержат много непечатаемых символов (например, изображений), в то время как текстовые формы почти никогда не содержат.
Из примеров видно, что:
multipart/form-data : добавляет к сообщению несколько байтов граничных служебных данных и должен потратить некоторое время на их вычисление, но отправляет каждый байт одним байтом.
application/x-www-form-urlencoded : имеет однобайтовую границу для каждого поля ( & ), но добавляет линейный коэффициент служебных данных в 3 раза для каждого непечатаемого символа.
Поэтому, даже если бы мы могли отправлять файлы с помощью application/x-www-form-urlencoded , мы бы этого не хотели, потому что это очень неэффективно.
Но для печатных символов, найденных в текстовых полях, это не имеет значения и создает меньше накладных расходов, поэтому мы просто используем его.
В OS X nc не принимает аргументы -l и -p одновременно. Но это работает для меня: пока верно; сделать printf '' | пс -1 8000; сделано .
Насколько я могу судить, смысл ВООБЩЕ ЛЮБЫХ ЧЕРТЕЖЕЙ в границах состоит в том, чтобы сделать невозможным проверку синтаксиса запроса на глаз. Не используйте их в маркерах границ.
@DewiMorgan Вы совершенно правы. Я отредактировал сообщение и удалил тире из граничной строки.
@CiroSantilli冠状病毒审查六四事件法轮功 Дело не в том, что дефисы в граничной строке не будут работать. Они отлично работают. Но, как сказал Деви Морган: они не нужны и сильно сбивают с толку, потому что кодирование multipart/form-data требует установки "--" перед каждой границей и после последней границы.
enctype='multipart/form-data – это тип кодирования, который позволяет отправлять файлы с помощью POST. Проще говоря, без этой кодировки файлы не могут быть отправлены через POST.
Если вы хотите разрешить пользователю загружать файл через форму, вы должны использовать этот enctype.
Насколько я понимаю, вы можете использовать multipart/form-data для отправки недвоичных файлов, но это неэффективно. Я считаю, что использование application/x-www-form-urlencoded — это правильный способ отправки недвоичных данных, но кому-то, у кого больше опыта работы с недвоичными файлами, возможно, придется меня поправить.
Основное преимущество использования multipart/form-data для отправки файла заключается в том, что он будет работать автоматически как во внешнем, так и во внутреннем интерфейсе. Никакой специальной обработки делать не нужно. Все файлы являются двоичными, даже если они должны содержать только текст. application/x-www-form-urlencoded — это стандартный способ POST формы без вложенных файлов. multipart/form-data — это стандартный способ POST формы с прикрепленными файлами. (Существует также множество других кодировок, таких как application/json и application/json-patch+json , которые являются общими для связи между сервером и клиентом.)
Указание, как отправить форму на сервер
Атрибут enctype имеет смысл только при использовании метода POST. Когда он указан, он указывает браузеру отправить форму, кодируя ее содержимое определенным образом. Из MDN - Enctype формы:
Когда значением атрибута метода является post, enctype – это тип контента MIME, который используется для отправки формы на сервер.
- application/x-www-form-urlencoded : значение по умолчанию. При отправке формы собираются все имена и значения, а для последней строки выполняется кодирование URL.
- multipart/form-data : символы НЕ кодируются. Это важно, когда форма имеет элемент управления загрузкой файлов. Вы хотите отправить двоичный файл, и это гарантирует, что битовый поток не будет изменен.
- text/plain : пробелы преобразуются, но кодирование больше не выполняется.
Безопасность
При отправке форм могут возникнуть некоторые проблемы с безопасностью, как указано в RFC 7578, раздел 7: Данные составных форм. Вопросы безопасности:
Все программное обеспечение для обработки форм должно относиться к предоставленным пользователем данным формы
с осторожностью, поскольку они часто содержат конфиденциальную или личную информацию,
идентифицирующую личность. В веб-браузерах широко используются функции «автоматического заполнения» форм; они могут использоваться, чтобы заставить пользователей
по незнанию отправлять конфиденциальную информацию при выполнении
безобидных задач. multipart/form-data не предоставляет каких-либо функций
для проверки целостности, обеспечения конфиденциальности, предотвращения путаницы
пользователя или других функций безопасности; эти проблемы должны быть
решены приложениями для заполнения форм и интерпретации данных форм.Приложения, которые получают формы и обрабатывают их, должны быть осторожны, чтобы не возвращать данные запрашивающему обработчику форм. сайт, который не предназначался для отправки.
При интерпретации имени файла в поле заголовка Content-
Disposition важно не допустить непреднамеренной перезаписи файлов в
файловом пространстве получателя.< /p>Это касается вас, если вы являетесь разработчиком и ваш сервер будет обрабатывать отправленные пользователями формы, которые могут содержать конфиденциальную информацию.
Файлы сборки Apache Ant записываются в формате XML. Каждый файл сборки содержит один проект и как минимум одну цель (по умолчанию). Цели содержат элементы задачи.Каждый элемент задачи в файле сборки может иметь атрибут id, и впоследствии на него может ссылаться значение, указанное для this. Значение должно быть уникальным. (Дополнительную информацию см. в разделе «Задачи» ниже.)
Проекты
У проекта есть три атрибута:
Атрибут Описание Обязательный tr>name имя проекта. Нет по умолчанию < td>цель по умолчанию для использования, когда цель не указана.Нет; однако, начиная с Ant 1.6.0, каждый проект включает неявную цель, которая содержит все без исключения задачи и/или типы верхнего уровня. Эта цель всегда будет выполняться как часть инициализации проекта, даже если Ant запускается с параметром -projecthelp. базовый_каталог базовый каталог из которой выполняются все расчеты пути. Относительный путь разрешается относительно каталога, содержащего файл сборки. Нет; по умолчанию используется родительский каталог файла сборки, если только он не переопределен параметром baseir проекта или свойством baseir При желании описание проекта может быть предоставлено в виде элемента верхнего уровня (см. тип описания).
Каждый проект определяет одну или несколько целей. Цель – это набор задач, которые вы хотите выполнить. При запуске Ant вы можете выбрать, какие цели вы хотите выполнить. Если цель не указана, используется проект по умолчанию.
Цели
Цель может зависеть от других целей. Например, у вас может быть цель для компиляции и цель для создания дистрибутива. Вы можете создать дистрибутив только после того, как вы его скомпилировали, поэтому цель распространения зависит от цели компиляции. Ant разрешает эти зависимости.
Следует отметить, однако, что атрибут depend в Ant указывает только порядок, в котором должны выполняться цели, — он не влияет на то, будет ли выполняться цель, которая определяет зависимости, зависимая(ые) цель(и) не выполнялась (должна) выполняться.
Дополнительную информацию можно найти на специальной странице руководства.
Задачи
Задача – это фрагмент кода, который можно выполнить.
У задачи может быть несколько атрибутов (или аргументов, если хотите). Значение атрибута может содержать ссылки на свойство. Эти ссылки будут разрешены до выполнения задачи.
где имя — это имя задачи, attributeN — имя атрибута, а valueN — значение этого атрибута.
Есть набор встроенных задач, но также очень легко написать свои собственные.
Все задачи могут иметь атрибут имени. Значение этого атрибута будет использоваться в сообщениях журнала, генерируемых Ant.
Заданиям можно присвоить атрибут id:
где имя_задачи – это имя задачи, а ID_задачи – уникальный идентификатор этой задачи. Вы можете ссылаться на соответствующий объект задачи в сценариях или других задачах с помощью этого имени. Например, в сценариях вы можете сделать:
для установки атрибута foo этого конкретного экземпляра задачи. В другой задаче (написанной на Java) вы можете получить доступ к экземпляру через project.getReference("task1") .
Примечание 1. Если задача 1 еще не запущена, значит, она не настроена (т. е. атрибуты не заданы), и если она будет настроена позже, все, что вы сделали с экземпляром, может быть перезаписан.
Примечание 2. Будущие версии Ant, скорее всего, не будут обратно совместимы с этим поведением, поскольку экземпляров задач, скорее всего, вообще не будет, а будут только прокси-серверы.
Свойства
Свойства — это важный способ настроить процесс сборки или просто предоставить ярлыки для строк, которые неоднократно используются внутри файла сборки.
В самой простой форме свойства определяются в файле сборки (например, задачей свойств) или могут быть установлены вне Ant. У свойства есть имя и значение; имя чувствительно к регистру. Свойства могут использоваться в значении атрибутов задачи или во вложенном тексте задач, которые их поддерживают. Это делается путем помещения имени свойства между $ < и > в значении атрибута. Например, если есть свойство builddir со значением build, то его можно использовать в таком атрибуте: $/classes. Это решается во время выполнения как build/classes .
Начиная с Ant 1.8.0, расширение свойств стало намного более мощным, чем простые пары ключ-значение, более подробную информацию можно найти в разделе понятий этого руководства.
Пример файла сборки
Обратите внимание, что мы объявляем свойства вне какой-либо цели. Начиная с Ant 1.6, все задачи могут быть объявлены внешними целями (только в более ранней версии
и ). Когда вы делаете это, они оцениваются до того, как будут выполнены какие-либо цели. Некоторые задачи будут генерировать сбои сборки, если они используются вне целей, поскольку в противном случае они могут вызвать бесконечные циклы (например).
Мы дали описание некоторых целей; это приводит к тому, что параметр вызова -projecthelp перечисляет их как общедоступные цели с описаниями; другая цель является внутренней и не указана в списке.
Наконец, чтобы эта цель работала, исходный код в подкаталоге src должен храниться в дереве каталогов, которое соответствует именам пакетов. Подробности смотрите в задаче.
Фильтры токенов
В проекте может быть набор токенов, которые могут быть автоматически расширены, если они будут найдены при копировании файла, если в задачах, поддерживающих это, выбрано поведение фильтрации-копирования. Они могут быть установлены в файле сборки задачей фильтра.
Поскольку это потенциально может быть очень опасным поведением, токены в файлах должны иметь форму @ token @ , где token — это имя токена, заданное в задаче. Этот синтаксис токена соответствует синтаксису других систем сборки, выполняющих такую фильтрацию, и остается достаточно ортогональным для большинства языков программирования и сценариев, а также для систем документации.
Примечание. Если в файле найден токен в формате @токен@, но с этим токеном не связан фильтр, никаких изменений не происходит; таким образом, метод экранирования недоступен, но пока вы выбираете подходящие имена для своих токенов, это не должно вызывать проблем.
Предупреждение. Если вы копируете двоичные файлы с включенной фильтрацией, вы можете повредить файлы. Эту функцию следует использовать только с текстовыми файлами.
Путиподобные структуры
Вы можете указать ссылки типа PATH и CLASSPATH, используя как :, так и ; в качестве символов-разделителей. Ant преобразует разделитель в правильный символ текущей операционной системы.
Везде, где необходимо указать значения, подобные пути, можно использовать вложенный элемент. Это принимает общую форму:
Атрибут местоположения указывает один файл или каталог относительно базового каталога проекта (или абсолютное имя файла), в то время как атрибут пути принимает списки местоположений, разделенные двоеточием или точкой с запятой. Атрибут пути предназначен для использования с предопределенными путями — в любом другом случае предпочтение отдается нескольким элементам с атрибутами местоположения.
Начиная с Ant 1.8.2 атрибут местоположения также может содержать подстановочный знак в своем последнем компоненте пути (т. е. он может заканчиваться на * ) для поддержки подстановочных знаков CLASSPATH, представленных в Java 6. Ant не будет расширять или оценивать подстановочные знаки, и результирующий путь может не работать как что-либо еще, кроме CLASSPATH — или даже как CLASSPATH для JVM до Java 6.
В качестве ярлыка тег поддерживает собственные атрибуты пути и местоположения, поэтому:
можно сократить до:
Кроме того, в качестве вложенных элементов можно указать одну или несколько коллекций ресурсов (они должны состоять только из ресурсов файлового типа). Кроме того, следует отметить, что, хотя наборы ресурсов обрабатываются в порядке их обнаружения, некоторые типы наборов ресурсов, такие как наборы файлов, наборы каталогов и файлы, не определены с точки зрения порядка.
Это создает путь, который содержит значение $ , за которым следуют все файлы jar в каталоге lib , каталоге классов , всех каталогах с именами классов в подкаталоге приложений $ , за исключением тех, которые имеют текст Test в своем имени, и файлы, указанные в указанном FileList.
Если вы хотите использовать одну и ту же структуру пути для нескольких задач, вы можете определить их с помощью
элемент на том же уровне, что и s, и ссылайтесь на них через их атрибут id — пример см. в разделе «Ссылки».
По умолчанию структура, подобная пути, будет повторно оценивать все вложенные коллекции ресурсов всякий раз, когда она используется, что может привести к ненужному повторному сканированию файловой системы. Начиная с Ant 1.8.0, путь имеет необязательный атрибут кэша, и если для него задано значение true , экземпляр пути будет сканировать свои вложенные коллекции ресурсов только один раз и предполагать, что он больше не изменяется во время сборки ( значение по умолчанию для кеша по-прежнему равно false ). Даже если вы используете путь только в одной задаче, можно повысить общую производительность, установив для кеша значение true, если вы используете сложные вложенные конструкции.
Структура, подобная пути, может включать ссылку на другую структуру, подобную пути (путь сам является набором ресурсов) через вложенные элементы
Сочетания клавиш, упомянутые ранее, также действительны для
может быть записано как:
Ярлык пути
Начиная с Ant 1.6, в свойствах есть ярлык для преобразования путей в строки, специфичные для ОС. Можно использовать выражение $pathreference> для преобразования ссылки на элемент пути в строку, которую можно использовать в качестве аргумента пути. Например:
Аргументы командной строки
Некоторые задачи принимают аргументы, которые будут переданы другому процессу в командной строке. Чтобы упростить указание аргументов, содержащих пробелы, можно использовать вложенные элементы arg.
Атрибут Описание Обязательный tr>значение один аргумент командной строки; может содержать символы пробела. Точно один из них. файл Имя файла в виде один аргумент командной строки; будет заменено абсолютным именем файла. путь Строка, которая будет рассматриваться как строка, подобная пути, как одна команда- линейный аргумент; вы можете использовать ; или : в качестве разделителей пути, и Ant преобразует его в локальные соглашения платформы. pathref Ссылка на путь, определенный в другом месте. Ant преобразует его в локальные соглашения платформы. line разделенный пробелами список аргументов командной строки. prefix Фиксированная строка, которая помещается перед аргументом. В случае если строка разбита на части, она будет помещена перед каждой частью. Начиная с Ant 1.8. Нет суффикс Фиксированная строка, помещаемая сразу после аргумент. В случае если строка разбита на части, она будет помещена после каждой части. Начиная с Ant 1.8. Нет Настоятельно рекомендуется по возможности избегать линейной версии. Ant попытается разделить командную строку таким же образом, как это сделала бы оболочка (Unix), но при некоторых обстоятельствах может создать что-то, что сильно отличается от того, что вы ожидаете.
Примеры
это один аргумент командной строки, содержащий пробел, не отдельные параметры -l и -a .
Это командная строка с двумя отдельными параметрами: -l и -a .
является одним аргументом командной строки со значением \dir;\dir2;\dir3 в системах на основе DOS и /dir:/dir2:/dir3 в системах типа Unix.
Ссылки
Любому элементу проекта можно присвоить идентификатор, используя его атрибут id. В большинстве случаев на элемент впоследствии можно ссылаться, указав атрибут refid для элемента того же типа. Это может быть полезно, если вы собираетесь копировать один и тот же фрагмент XML снова и снова — например, используя структуру более одного раза.
Следующий пример:
может быть переписано так:
Все задачи, использующие вложенные элементы для PatternSets, FileSets, ZipFileSets или структур, подобных пути, принимают ссылки на эти структуры, как показано в примерах. Использование refid для задачи обычно имеет тот же эффект (ссылка на уже объявленную задачу), но пользователь должен знать, что интерпретация этого атрибута зависит от реализации элемента, для которого он указан. Некоторые задачи (удобный пример — задача свойства) преднамеренно присваивают refid другое значение.
Использование внешних задач
Ant поддерживает механизм подключаемых модулей для использования сторонних задач. Для их использования вам необходимо сделать два шага:
- разместите их реализацию там, где их сможет найти Ant.
- объявите их.
Не добавляйте ничего в переменную среды CLASSPATH — это часто является причиной очень неясных ошибок. Используйте собственные механизмы Ant для добавления библиотек:
Читайте также: