Learn how to craft validated and user-friendly input forms for workflows.
mailing_lists
subject
must not exceed 30 charactersattachments
are allowedpydantic
to build a convenient, self-documenting, and reusable flow signature that the Prefect UI can build a better form from.
mailing_lists
, subject
, and attachments
.
Literal
to restrict valid values
there are only a few valid values for mailing_lists
Say our valid mailing lists are: ["newsletter", "customers", "beta-testers"]
We can define a Literal
to specify the valid values for the mailing_lists
parameter.
Enum
to achieve the same effect.BaseModel
subclass to group and constrain parameterssubject
and attachments
parameters have constraints that we want to enforce.
the subject
must not exceed 30 characters
the attachments
must not exceed 5 items
Additionally, the subject
, body
, and attachments
parameters are all related to the same thing: the content of the email.
We can define a BaseModel
subclass to group these parameters together and apply these constraints.
pydantic.Field
accepts a description
kwarg that is displayed in the form above the field input.title
to Field
to override the field name in the formEmailContent
to add a description to this group of parameters in the formMailingList
and EmailContent
types, we can use them in our flow signature:
mailing_lists
parameter renders as a multi-select dropdown that only allows the Literal
values from our MailingList
type.
EmailContent
fields will be enforced before the run is submitted.
Full example code so far
json_schema_extra
to order fields in the form@flow
function signature.
Within a given BaseModel
subclass, parameters are rendered in the following order:
default
value are rendered first, alphabeticallydefault
value are rendered next, alphabeticallyBaseModel
subclass by passing json_schema_extra
to the Field
constructor with a position
key.
Taking our EmailContent
model from the previous example, let’s enforce that subject
should be displayed first, then body
, then attachments
.
pydantic
generates, as it is what the Prefect UI uses to build the form.
Call model_json_schema()
on your BaseModel
subclass to inspect the raw schema.
pydantic
, see their documentation on models and types.