### Setup and Configuration Commands
Source: https://github.com/forminit/forminit-python/blob/main/examples/django/README.md
A collection of shell commands required to initialize the Django environment for Forminit. This includes installing dependencies, setting API credentials, and preparing the database.
```bash
pip install -r requirements.txt
export FORMINIT_API_KEY="your-api-key"
export FORMINIT_FORM_ID="your-form-id"
python manage.py migrate
python manage.py runserver
```
--------------------------------
### Install Forminit Python SDK
Source: https://github.com/forminit/forminit-python/blob/main/README.md
Installs the Forminit Python SDK using pip. This is the first step to integrate Forminit into your Python projects.
```bash
pip install forminit
```
--------------------------------
### Integrate Forminit with Flask
Source: https://context7.com/forminit/forminit-python/llms.txt
A complete example of integrating Forminit into a Flask route. It highlights extracting the client IP address from proxy headers and setting user context for geolocation tracking.
```python
import os
from flask import Flask, request, jsonify
from forminit import ForminitClient
app = Flask(__name__)
@app.route("/submit", methods=["POST"])
def submit_form():
client_ip = request.headers.get("X-Forwarded-For", request.remote_addr)
if client_ip and "," in client_ip:
client_ip = client_ip.split(",")[0].strip()
client = ForminitClient(api_key=os.environ.get("FORMINIT_API_KEY"))
client.set_user_info(
ip=client_ip,
user_agent=request.headers.get("User-Agent", ""),
referer=request.headers.get("Referer")
)
form_data = request.form.to_dict()
result = client.submit(form_id=os.environ.get("FORMINIT_FORM_ID"), data=form_data)
client.close()
if "error" in result:
return jsonify({"success": False, "message": result["error"]["message"]}), 400
return jsonify({"success": True, "submissionId": result["data"]["hashId"]})
```
--------------------------------
### Define Form Block Types
Source: https://context7.com/forminit/forminit-python/llms.txt
Provides a comprehensive example of all supported Forminit block types, including tracking, sender, input fields, and file metadata. This structure ensures type-safe submissions when using the Forminit Python SDK.
```python
from forminit import ForminitClient
from forminit.types import FormSubmissionData
# Type-safe form submission with all block types
submission: FormSubmissionData = {
"blocks": [
{
"type": "tracking",
"properties": {
"utmSource": "google",
"utmMedium": "cpc",
"utmCampaign": "spring_sale",
"gclid": "abc123",
"fbclid": "xyz789",
"msclkid": "def456"
}
},
{
"type": "sender",
"properties": {
"email": "user@example.com",
"firstName": "John",
"lastName": "Doe",
"fullName": "John Doe",
"phone": "+1-555-0123",
"company": "Acme Corp",
"position": "Software Engineer",
"address": "123 Main St",
"city": "San Francisco",
"country": "United States"
}
},
{"type": "text", "name": "message", "value": "Hello!"},
{"type": "number", "name": "quantity", "value": 5},
{"type": "email", "name": "alternate_email", "value": "alt@example.com"},
{"type": "url", "name": "website", "value": "https://example.com"},
{"type": "phone", "name": "mobile", "value": "+1-555-9999"},
{"type": "rating", "name": "satisfaction", "value": 5},
{"type": "date", "name": "preferred_date", "value": "2024-06-15"},
{"type": "country", "name": "shipping_country", "value": "US"},
{"type": "select", "name": "department", "value": "Sales"},
{"type": "radio", "name": "contact_method", "value": "email"},
{"type": "checkbox", "name": "interests", "value": ["products", "services", "support"]},
{
"type": "file",
"name": "attachment",
"value": "https://storage.example.com/file.pdf",
"metadata": {
"filename": "document.pdf",
"size": 102400,
"mimeType": "application/pdf"
}
}
]
}
client = ForminitClient(api_key="your-api-key")
result = client.submit(form_id="your-form-id", data=submission)
client.close()
```
--------------------------------
### Contact Form HTML with Django Templating
Source: https://github.com/forminit/forminit-python/blob/main/examples/django/contactform/templates/contactform/index.html
This snippet shows the HTML structure for a contact form using Django's template tags. It includes a CSRF token for security and input fields for name, email, and message. The form is linked to a JavaScript event listener for submission.
```html
Contact Us
Contact Us
```
--------------------------------
### Configure ForminitClient Options
Source: https://github.com/forminit/forminit-python/blob/main/README.md
Shows how to initialize `ForminitClient` with various configuration options, including API key, proxy URL, and base URL.
```python
from forminit import ForminitClient
client = ForminitClient(
api_key="your-api-key", # Required for server-side usage
proxy_url=None, # Optional: proxy URL for client-side usage
base_url="https://forminit.com", # Optional: override base URL
)
```
--------------------------------
### Client Configuration
Source: https://context7.com/forminit/forminit-python/llms.txt
Demonstrates how to initialize the ForminitClient and AsyncForminitClient with different configuration options, including API keys, base URLs, proxy support, and environment variables.
```APIDOC
## Client Configuration Options
Configure the client with custom options including proxy support for client-side usage scenarios.
### Standard Server-Side Configuration
```python
from forminit import ForminitClient
client = ForminitClient(
api_key="your-api-key", # Required for server-side
base_url="https://forminit.com" # Optional: override base URL
)
```
### Configuration with Proxy
```python
from forminit import ForminitClient
proxy_client = ForminitClient(
proxy_url="https://your-proxy.com/api/forminit", # Route through your proxy
api_key=None # API key handled by proxy
)
```
### Async Client Configuration
```python
from forminit import AsyncForminitClient
async_client = AsyncForminitClient(
api_key="your-api-key",
base_url="https://forminit.com"
)
```
### Environment Variable Configuration
Set environment variables `FORMINIT_API_KEY` and `FORMINIT_FORM_ID`.
```python
import os
from forminit import ForminitClient
client = ForminitClient(api_key=os.environ.get("FORMINIT_API_KEY"))
```
```
--------------------------------
### Configure Forminit Client Options
Source: https://context7.com/forminit/forminit-python/llms.txt
Demonstrates how to initialize the Forminit client for server-side or client-side proxy scenarios. It also shows how to retrieve API keys from environment variables for secure configuration.
```python
from forminit import ForminitClient, AsyncForminitClient
import os
# Standard server-side configuration
client = ForminitClient(
api_key="your-api-key",
base_url="https://forminit.com"
)
# Configuration with proxy for client-side scenarios
proxy_client = ForminitClient(
proxy_url="https://your-proxy.com/api/forminit",
api_key=None
)
# Async client with same options
async_client = AsyncForminitClient(
api_key="your-api-key",
base_url="https://forminit.com"
)
# Environment variable configuration
client = ForminitClient(api_key=os.environ.get("FORMINIT_API_KEY"))
```
--------------------------------
### Submit Forms with Synchronous Client
Source: https://context7.com/forminit/forminit-python/llms.txt
Demonstrates how to use the ForminitClient for synchronous form submissions. It covers client initialization, setting user metadata, and handling structured block data.
```python
from forminit import ForminitClient
client = ForminitClient(api_key="your-api-key")
client.set_user_info(
ip="203.0.113.10",
user_agent="Mozilla/5.0...",
referer="https://example.com"
)
result = client.submit(
form_id="your-form-id",
data={
"blocks": [
{"type": "sender", "properties": {"email": "john@example.com", "firstName": "John", "lastName": "Doe"}},
{"type": "text", "name": "message", "value": "Hello from Forminit!"},
{"type": "email", "name": "contact_email", "value": "contact@example.com"},
{"type": "rating", "name": "satisfaction", "value": 5}
]
},
tracking={"utmSource": "newsletter", "utmMedium": "email", "utmCampaign": "spring2024"}
)
if "error" in result:
print(f"Error: {result['error']['message']}")
else:
print(f"Success! Submission ID: {result['data']['hashId']}")
client.close()
```
--------------------------------
### Integrate Forminit with FastAPI
Source: https://context7.com/forminit/forminit-python/llms.txt
An asynchronous implementation for FastAPI. It utilizes the AsyncForminitClient for non-blocking I/O and demonstrates structured block-based data submission.
```python
import os
from fastapi import FastAPI, Request, HTTPException, Form
from forminit import AsyncForminitClient
app = FastAPI()
@app.post("/submit")
async def submit_form(request: Request, name: str = Form(...), email: str = Form(...), message: str = Form(...)):
forwarded_for = request.headers.get("X-Forwarded-For")
client_ip = forwarded_for.split(",")[0].strip() if forwarded_for else (request.client.host if request.client else "127.0.0.1")
async with AsyncForminitClient(api_key=os.environ.get("FORMINIT_API_KEY")) as client:
client.set_user_info(ip=client_ip, user_agent=request.headers.get("User-Agent", ""), referer=request.headers.get("Referer"))
result = await client.submit(
form_id=os.environ.get("FORMINIT_FORM_ID"),
data={
"blocks": [
{"type": "sender", "properties": {"email": email, "fullName": name}},
{"type": "text", "name": "message", "value": message}
]
}
)
if "error" in result:
raise HTTPException(status_code=result["error"].get("code", 400), detail=result["error"]["message"])
return {"success": True, "submissionId": result["data"]["hashId"]}
```
--------------------------------
### Submit Form Data with Forminit Python SDK
Source: https://context7.com/forminit/forminit-python/llms.txt
Demonstrates the basic workflow for submitting form data to Forminit. It shows how to map form fields using the required prefix conventions and handle the response object.
```python
result = client.submit(
form_id="your-form-id",
data={
"fi-sender-fullName": "John Doe",
"fi-sender-email": "john@example.com",
"fi-sender-phone": "+1-555-0100",
"fi-sender-company": "Acme Inc",
"fi-text-message": "I have a question about your services.",
"fi-text-subject": "General Inquiry",
"fi-rating-satisfaction": "4"
}
)
if "error" in result:
print(f"Submission failed: {result['error']['message']}")
else:
print(f"Form submitted successfully: {result['data']['hashId']}")
client.close()
```
--------------------------------
### Form-Style Data Submission with ForminitClient
Source: https://github.com/forminit/forminit-python/blob/main/README.md
Illustrates submitting flat form data, mimicking an HTML form submission, using the `client.submit` method. This is useful for simpler data structures.
```python
result = client.submit(
form_id="your-form-id",
data={
"fi-sender-fullName": "John Doe",
"fi-sender-email": "john@example.com",
"fi-text-message": "Hello!",
},
)
```
--------------------------------
### Synchronous Form Submission with ForminitClient
Source: https://github.com/forminit/forminit-python/blob/main/README.md
Demonstrates how to initialize and use the synchronous ForminitClient to submit form data. It includes setting user information for tracking and handling the submission result.
```python
from forminit import ForminitClient
# Initialize client with your API key
client = ForminitClient(api_key="your-api-key")
# Set user info for tracking (optional)
# Note: Set user info from the client request for accurate tracking
# This ensures proper geolocation and analytics for the actual user
client.set_user_info(
ip="203.0.113.10", # Client's IP from X-Forwarded-For or X-Real-IP header
user_agent="Mozilla/5.0...", # Client's User-Agent header
referer="https://example.com", # Client's Referer header
)
# Submit form data
result = client.submit(
form_id="your-form-id",
data={
"blocks": [
{"type": "text", "name": "message", "value": "Hello!"},
{"type": "email", "name": "email", "value": "user@example.com"},
]
},
tracking={"utmSource": "newsletter", "utmMedium": "email"},
)
if "error" in result:
print(f"Error: {result['error']['message']}")
else:
print(f"Success! Submission ID: {result['data']['hashId']}")
if "redirectUrl" in result:
print(f"Redirect to: {result['redirectUrl']}")
client.close()
```
--------------------------------
### Asynchronous Form Submission with AsyncForminitClient
Source: https://github.com/forminit/forminit-python/blob/main/README.md
Demonstrates the asynchronous usage of the Forminit SDK using `AsyncForminitClient`. This is suitable for non-blocking operations in asynchronous Python applications.
```python
import asyncio
from forminit import AsyncForminitClient
async def main():
async with AsyncForminitClient(api_key="your-api-key") as client:
result = await client.submit(
form_id="your-form-id",
data={
"blocks": [
{"type": "text", "name": "message", "value": "Hello!"},
]
},
)
if "error" in result:
print(f"Error: {result['error']['message']}")
else:
print(f"Success! Submission ID: {result['data']['hashId']}")
asyncio.run(main())
```
--------------------------------
### Web Framework Integration (Flask) with ForminitClient
Source: https://github.com/forminit/forminit-python/blob/main/README.md
Shows how to integrate ForminitClient into a Flask web application. It emphasizes extracting client information from request headers for accurate tracking.
```python
from flask import Flask, request
from forminit import ForminitClient
app = Flask(__name__)
@app.route("/submit", methods=["POST"])
def submit():
client = ForminitClient(api_key="your-api-key")
# Extract client information from request headers for accurate tracking
# Note: Use X-Forwarded-For when behind proxies/load balancers
client_ip = request.headers.get("X-Forwarded-For", request.remote_addr)
if client_ip and "," in client_ip:
client_ip = client_ip.split(",")[0].strip() # Get first IP
client.set_user_info(
ip=client_ip,
user_agent=request.headers.get("User-Agent", ""),
referer=request.headers.get("Referer"),
)
result = client.submit(
form_id="your-form-id",
data=request.form.to_dict(),
)
client.close()
return result
```
--------------------------------
### Submit Form via Django View
Source: https://context7.com/forminit/forminit-python/llms.txt
Demonstrates how to create a Django view that processes form submissions. It handles client IP extraction from request headers, configures the Forminit client, and returns a JSON response based on the submission result.
```python
import os
import json
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.views.decorators.http import require_http_methods
from forminit import ForminitClient
@csrf_exempt
@require_http_methods(["POST"])
def submit_form(request):
# Extract client IP from Django META headers
forwarded_for = request.META.get("HTTP_X_FORWARDED_FOR")
client_ip = forwarded_for.split(",")[0].strip() if forwarded_for else (
request.META.get("REMOTE_ADDR", "127.0.0.1")
)
# Create and configure client
client = ForminitClient(api_key=os.environ.get("FORMINIT_API_KEY"))
client.set_user_info(
ip=client_ip,
user_agent=request.META.get("HTTP_USER_AGENT", ""),
referer=request.META.get("HTTP_REFERER")
)
# Parse JSON body
data = json.loads(request.body)
# Build structured submission
result = client.submit(
form_id=os.environ.get("FORMINIT_FORM_ID"),
data={
"blocks": [
{
"type": "sender",
"properties": {
"email": data.get("email"),
"firstName": data.get("firstName"),
"lastName": data.get("lastName")
}
},
{"type": "text", "name": "message", "value": data.get("message")}
]
},
tracking=data.get("tracking")
)
client.close()
if "error" in result:
return JsonResponse(
{"success": False, "error": result["error"]},
status=result["error"].get("code", 400)
)
return JsonResponse({
"success": True,
"data": result["data"],
"redirectUrl": result.get("redirectUrl")
})
```
--------------------------------
### Set Forminit Environment Variables
Source: https://github.com/forminit/forminit-python/blob/main/README.md
Configures Forminit using environment variables for API key and form ID. This is a common practice for managing credentials and settings.
```bash
export FORMINIT_API_KEY="your-api-key"
export FORMINIT_FORM_ID="your-form-id"
```
--------------------------------
### Error Handling and Response Processing
Source: https://context7.com/forminit/forminit-python/llms.txt
Illustrates how to handle potential errors returned by the SDK, such as validation errors, missing API keys, and network issues, as well as processing successful submission responses.
```APIDOC
## Error Handling
The SDK returns structured error responses for validation failures, network errors, and API errors.
### Handling Errors and Success Responses
```python
from forminit import ForminitClient
client = ForminitClient(api_key="your-api-key")
result = client.submit(
form_id="your-form-id",
data={
"blocks": [
{"type": "email", "name": "email", "value": "invalid-email"}
]
}
)
if "error" in result:
error = result["error"]
print(f"Success: {error['success']}") # False
print(f"Error Code: {error.get('code')}") # 400
print(f"Error Type: {error['error']}") # "VALIDATION_ERROR"
print(f"Message: {error['message']}") # "Invalid email format"
print(f"Field: {error.get('fieldName')}") # "email" (if field-specific)
# Handle specific error types
if error["error"] == "MISSING_API_KEY":
print("Please configure your API key")
elif error["error"] == "VALIDATION_ERROR":
print(f"Fix the field: {error.get('fieldName')}")
elif error["error"] == "HTTP_ERROR":
print("Network or server error occurred")
else:
# Success response
data = result["data"]
print(f"Submission ID: {data['hashId']}")
print(f"Submitted at: {data['date']}")
print(f"Location: {data['submissionInfo']['location']['country']}")
if "redirectUrl" in result:
print(f"Redirect user to: {result['redirectUrl']}")
client.close()
```
```
--------------------------------
### Submit Forms with Asynchronous Client
Source: https://context7.com/forminit/forminit-python/llms.txt
Demonstrates the use of AsyncForminitClient for non-blocking form submissions in async frameworks like FastAPI. It utilizes an async context manager for resource management.
```python
import asyncio
from forminit import AsyncForminitClient
async def submit_contact_form():
async with AsyncForminitClient(api_key="your-api-key") as client:
client.set_user_info(
ip="192.168.1.100",
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
referer="https://mysite.com/contact"
)
result = await client.submit(
form_id="contact-form-id",
data={
"blocks": [
{"type": "sender", "properties": {"email": "user@example.com", "fullName": "Jane Smith", "company": "Acme Corp"}},
{"type": "text", "name": "subject", "value": "Partnership Inquiry"},
{"type": "text", "name": "message", "value": "I'd like to discuss..."},
{"type": "phone", "name": "phone", "value": "+1-555-0123"}
]
},
tracking={"utmSource": "google", "gclid": "abc123"}
)
if "error" in result:
return {"success": False, "error": result["error"]["message"]}
return {"success": True, "submissionId": result["data"]["hashId"], "redirectUrl": result.get("redirectUrl")}
response = asyncio.run(submit_contact_form())
print(response)
```
--------------------------------
### Utilize Forminit Type Definitions for Form Submission
Source: https://github.com/forminit/forminit-python/blob/main/README.md
Demonstrates using type hints from `forminit.types` for building type-safe form submissions. This improves code reliability and maintainability.
```python
from forminit.types import (
FormBlock,
FormSubmissionData,
FormResponse,
TrackingBlock,
SenderBlock,
TextBlock,
# ... and more
)
# Type-safe form building
submission: FormSubmissionData = {
"blocks": [
{
"type": "sender",
"properties": {
"email": "user@example.com",
"firstName": "John",
"lastName": "Doe",
},
},
{"type": "text", "name": "message", "value": "Hello!"},
]
}
```
--------------------------------
### Handle API Errors and Responses
Source: https://context7.com/forminit/forminit-python/llms.txt
Explains how to process form submission results, including checking for error flags, parsing validation messages, and accessing successful submission data.
```python
from forminit import ForminitClient
client = ForminitClient(api_key="your-api-key")
result = client.submit(
form_id="your-form-id",
data={
"blocks": [
{"type": "email", "name": "email", "value": "invalid-email"}
]
}
)
if "error" in result:
error = result["error"]
print(f"Error Type: {error['error']}")
if error["error"] == "VALIDATION_ERROR":
print(f"Fix the field: {error.get('fieldName')}")
else:
data = result["data"]
print(f"Submission ID: {data['hashId']}")
client.close()
```
=== COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.