SlideShare uma empresa Scribd logo
1 de 58
XHR




django Forms in an API World
          http://www.northwesternflipside.com/2011/01/10/2011-where-are-the-flying-cars/
Lets talk about me



            Tareque Hossain
             Lead Software Engineer
Lets talk about forms


django Forms

And how we can use them in
this day & age of APIs!
What can you expect…
• What’s wrong with forms as it is
• How we use forms
• Issues using form in an API
  world
• Approaches for tackling the
  issues
• The solution
The good old days..


• Write up some HTML
• Throw some fancy template tags in
  there
       {{ my_awesome_form.as_p }}
• WIN
Fast forward a few years..



    You really dig APIs
Your setup looks like this:

                    Me likey!




                                I give you
No $#!7.                            API
Nuevo mundo..
• Django forms live on API server
  – Validates/ saves API requests
  – Doesn’t get rendered via template
• You’ve been writing forms in the
  frontend
  – Hardcoded HTML
  – Trying to match up data that API expects
API Clients
• Your website no longer lives on the same
  application space as the API
• Common API clients
  – A JavaScript MVC powered website
  – An android app
  – An iOS app
Forms on API Clients
The Issue
• You can serve most platforms with an
  HTML app
  – Write form in HTML on your webapp
• If you write native application for mobile
  – You recreate forms using the interfaces
    available
The Issue

• These interfaces you write
  – Don’t have any idea about the django
    forms residing on the API server
  – Only know what data to collect when you
    explicitly code them on each device
• There’s a disconnect
Houston we have a problem..
                  http://epicdemotivational.com/tag/beer/page/2/
Lets take a step back



  What is a form?
Lets take a step back

ˈ rm (noun)
fȯ
 a printed or typed document with
 blank spaces for insertion of
 required or requested information


                   Entry #4 at http://www.merriam-webster.com/dictionary/form
In the world of HTML


Part of an HTML document with input
interfaces for inserting required or
requested information
In the world of web apps

• A form is the interface we provide the
  application user to collect information
• It’s essential to any application where we
  collect data
In the world of django
django Forms

• A construct that:
  – Binds data (request.POST)
  – Validates data (clean)
  – Processes data (save)
  – Renders interface (as_p)
django Forms
• ModelForm
  – Turns your model into a form
  – Easiest way to get an interface for your
    data
• Widgets
  – Define specific properties for interface
    element
  – Separates presentation from data types
Why not just render via template?

You can’t if:
  – You only use django to power your API and
    the consumers are arbitrary
  – You run several django API servers each
    dealing with different data space
Think about this architecture
                   Profile API




                                   Analytics API
Content API




                                 Admin App
        User App
Your services are distributed

• Web applications we design are
  increasingly becoming:
  – Separated between presentation and data
    layer via API
  – Dependent on multiple API endpoints
  – Rich and complex in interface
Your services are distributed

• Your site content is retrieved using the
  Content API
  – You collect user feedback on content using
    forms
  – You provide admin interface to manage
    content using forms
Your services are distributed

• Information for users are stored and
  retrieved using Profile API
  – You allow log in, creation and update of
    profiles using forms
  – You provide admin interface to manage
    profiles using forms
Your services are distributed


• Site performance and user traffic is
  recorded to Analytics API
  – You provide admin interface to access and
    create custom reports using forms
Think again.
                            Profile API




                                            Analytics API
Content API




                                          Admin App
        User App
The Issue (contd.)

• At WiserTogether we love APIs & have
  a similar distributed setup
• We’ve been hardcoding forms in the
  frontend, collecting data and sending to
  API
The Issue (contd.)

• Whenever a data point in the backend
  changed, we had to update the form
• We have multiple clients who require
  different set of fields present on
  registration forms
  – Again, hardcoding in frontend
It was a mess
                $#^*!
What to do..

• django forms is used to validate and
  process our API data
• We wanted django forms to
  determine our frontend interface
  – But it was completely agnostic about
    backend forms!
What to do..

• Deliver form definition over API
• Render interface in the frontend from
  the retrieved definition
  – No more hardcoding
  – Forms in the user facing application
    changes as soon as backend form
    changes
What to do..

• Adjust form in whatever way
  necessary
  – Add/ remove fields from registration
    form
  – Frontend renders form exactly the way
    you want
  – No code change necessary in frontend
What to do..

• Contain form definition in one spot
• Allow a single central point to control
  interface on all applications
• Allow different API consumers to
  retrieve form definition
  – And render interface appropriate for the
    platform or device
3 step solution
Step 1


Serialize form with all information
necessary for reproduction at frontend
Step 2

• Devise methods to handle the
  following over API:
  – Deliver form definition
  – Receive form data
  – Validate form and deliver errors
  – If valid save the form
Step 3
• Handle forms in the frontend using
  API data
  – Render form
  – Submit data
  – If not valid, then display errors
  – If valid, then display success
    message, reload page or redirect as
    necessary
Step 1


Serialize form with all information
necessary for reproduction at frontend
django Remote Forms

• Extracts all information from a given
  django form or model form instance
• Goes through each field & widget to
  extract all necessary information
• Presents the information as
  dictionary for further manipulation &
  easy serialization into JSON
As easy as π
A JSON form
Step 2

• Devise methods to handle the
  following over API:
  – Deliver form definition
  – Receive form data
  – Validate form and deliver errors
  – If valid save the form
Points to Ponder
• Handle CSRF yourself of using X-
  CSRFToken
  – django CSRF middleware is not JSON
    friendly
• Encapsulate form processing in save
  method, similar to Model Form
Step 3
• Handle forms in the frontend using
  API data
  – Render form
  – Submit data
  – If not valid, then display errors
  – If valid, then display success
    message, reload page or redirect as
    necessary
HTML/JS/CSS Implementation
• We created a set of rendering and
  data handling tools for the frontend
  using:



• In future, we’ll be working towards
  iOS implementations as well
Backbone Form Handler
• Renders forms based on definition
  received over API
• Uses Handlebars template for
  rendering:
  – Core form structure (form tag, fields
    container, global errors)
  – Field & widget structure (help text, errors)
• Error rendering
Backbone Form Handler
• Allows instant validation
  – Similar to autocomplete
  – Field can be validated as soon as you
    move to next one
• Allows preloading of data
• Disallow editing of fields
  – Including selects, radio and checkboxes
• Provide submit buttons (if not supplied)
Handlebars Templates
                   Handlebars
                    Widgets
Sample Backbone View
                                  Instantiate
                                 form model



                                 Instantiate
                                  form view




            Initiate rendering
             by fetching the
             form definition
django Remote Admin
• A reviewer expressed interest
  – Use remote forms to expose django admin
    interface over API
• So I implemented a set of API endpoints
  – Exposes django admin app/model/instance
    data
  – Exposes admin forms
• And wrote a backbone app implementing
  django admin
Goals of django Remote Admin

• Allow administration of django
  projects over API
• No more ties to the same old
  interface!
• Use awesome Handlebars snippets of
  your own to spice up the interface
How does it work?
• Cycle through admin site registry
  – Extract app/model info and expose over
    API
• Create ModelForm from the model
  – Expose over API using django remote
    forms
• The backbone app calls the API
  – Allows browsing apps/ models
  – Allows creating/editing model instances
Further Work
• django Remote Forms
  – Implement file/ image uploading over
    API
• django Remote Admin
  – Load form/widget customizations from
    Admin classes
  – Implement pagination for foreign key
    loader
Demo
• Ask me about WiserTogether
  – github.com/WiserTogether/django-remote-forms
  – github.com/tarequeh/django-remote-admin
• Follow my tweets @tarequeh
• Shout out to Carlo Costino
• ind this presentation
  – slideshare.net/tarequeh
Q/A
• Ask me about WiserTogether
  – github.com/WiserTogether/django-remote-forms
  – github.com/tarequeh/django-remote-admin
• Follow my tweets @tarequeh
• Shout out to Carlo Costino
• ind this presentation
  – slideshare.net/tarequeh

Mais conteúdo relacionado

Mais procurados

Deploying PHP applications with Phing
Deploying PHP applications with PhingDeploying PHP applications with Phing
Deploying PHP applications with PhingMichiel Rook
 
Repository and Unit Of Work Design Patterns
Repository and Unit Of Work Design PatternsRepository and Unit Of Work Design Patterns
Repository and Unit Of Work Design PatternsHatim Hakeel
 
Java - Generic programming
Java - Generic programmingJava - Generic programming
Java - Generic programmingRiccardo Cardin
 
Spring data presentation
Spring data presentationSpring data presentation
Spring data presentationOleksii Usyk
 
Static keyword ppt
Static keyword pptStatic keyword ppt
Static keyword pptVinod Kumar
 
Introduction about Python by JanBask Training
Introduction about Python by JanBask TrainingIntroduction about Python by JanBask Training
Introduction about Python by JanBask TrainingJanBask Training
 
Introduction to .NET Core
Introduction to .NET CoreIntroduction to .NET Core
Introduction to .NET CoreMarco Parenzan
 
Usage and Comparisons of Control Group in Android AOSP: Marshmallow and Before
Usage and Comparisons of Control Group in Android AOSP: Marshmallow and BeforeUsage and Comparisons of Control Group in Android AOSP: Marshmallow and Before
Usage and Comparisons of Control Group in Android AOSP: Marshmallow and BeforeYoshi Shih-Chieh Huang
 
Python/Flask Presentation
Python/Flask PresentationPython/Flask Presentation
Python/Flask PresentationParag Mujumdar
 

Mais procurados (20)

Introduction to .NET Framework
Introduction to .NET FrameworkIntroduction to .NET Framework
Introduction to .NET Framework
 
Deploying PHP applications with Phing
Deploying PHP applications with PhingDeploying PHP applications with Phing
Deploying PHP applications with Phing
 
Java architecture
Java architectureJava architecture
Java architecture
 
Repository and Unit Of Work Design Patterns
Repository and Unit Of Work Design PatternsRepository and Unit Of Work Design Patterns
Repository and Unit Of Work Design Patterns
 
Java - Generic programming
Java - Generic programmingJava - Generic programming
Java - Generic programming
 
Java annotations
Java annotationsJava annotations
Java annotations
 
Servlets
ServletsServlets
Servlets
 
Spring data presentation
Spring data presentationSpring data presentation
Spring data presentation
 
Static keyword ppt
Static keyword pptStatic keyword ppt
Static keyword ppt
 
Java 8 features
Java 8 featuresJava 8 features
Java 8 features
 
Java logging
Java loggingJava logging
Java logging
 
Retrofit
RetrofitRetrofit
Retrofit
 
Rest in flask
Rest in flaskRest in flask
Rest in flask
 
Introduction about Python by JanBask Training
Introduction about Python by JanBask TrainingIntroduction about Python by JanBask Training
Introduction about Python by JanBask Training
 
Python OOPs
Python OOPsPython OOPs
Python OOPs
 
Sequelize
SequelizeSequelize
Sequelize
 
Introduction to .NET Core
Introduction to .NET CoreIntroduction to .NET Core
Introduction to .NET Core
 
Usage and Comparisons of Control Group in Android AOSP: Marshmallow and Before
Usage and Comparisons of Control Group in Android AOSP: Marshmallow and BeforeUsage and Comparisons of Control Group in Android AOSP: Marshmallow and Before
Usage and Comparisons of Control Group in Android AOSP: Marshmallow and Before
 
Python/Flask Presentation
Python/Flask PresentationPython/Flask Presentation
Python/Flask Presentation
 
Recycler view
Recycler viewRecycler view
Recycler view
 

Destaque

Life in a Queue - Using Message Queue with django
Life in a Queue - Using Message Queue with djangoLife in a Queue - Using Message Queue with django
Life in a Queue - Using Message Queue with djangoTareque Hossain
 
Django Forms: Best Practices, Tips, Tricks
Django Forms: Best Practices, Tips, TricksDjango Forms: Best Practices, Tips, Tricks
Django Forms: Best Practices, Tips, TricksShawn Rider
 
Advanced Django Forms Usage
Advanced Django Forms UsageAdvanced Django Forms Usage
Advanced Django Forms UsageDaniel Greenfeld
 
12 tips on Django Best Practices
12 tips on Django Best Practices12 tips on Django Best Practices
12 tips on Django Best PracticesDavid Arcos
 
IDMP and RIM: friend or foe?
IDMP and RIM: friend or foe?IDMP and RIM: friend or foe?
IDMP and RIM: friend or foe?eCTDconsultancy
 

Destaque (7)

Life in a Queue - Using Message Queue with django
Life in a Queue - Using Message Queue with djangoLife in a Queue - Using Message Queue with django
Life in a Queue - Using Message Queue with django
 
Pinax Introduction
Pinax IntroductionPinax Introduction
Pinax Introduction
 
Django Uni-Form
Django Uni-FormDjango Uni-Form
Django Uni-Form
 
Django Forms: Best Practices, Tips, Tricks
Django Forms: Best Practices, Tips, TricksDjango Forms: Best Practices, Tips, Tricks
Django Forms: Best Practices, Tips, Tricks
 
Advanced Django Forms Usage
Advanced Django Forms UsageAdvanced Django Forms Usage
Advanced Django Forms Usage
 
12 tips on Django Best Practices
12 tips on Django Best Practices12 tips on Django Best Practices
12 tips on Django Best Practices
 
IDMP and RIM: friend or foe?
IDMP and RIM: friend or foe?IDMP and RIM: friend or foe?
IDMP and RIM: friend or foe?
 

Semelhante a django Forms in a Web API World

(ATS6-DEV02) Web Application Strategies
(ATS6-DEV02) Web Application Strategies(ATS6-DEV02) Web Application Strategies
(ATS6-DEV02) Web Application StrategiesBIOVIA
 
java mini project for college students
java mini project for college students java mini project for college students
java mini project for college students SWETALEENA2
 
SharePoint 2013 APIs demystified
SharePoint 2013 APIs demystifiedSharePoint 2013 APIs demystified
SharePoint 2013 APIs demystifiedSPC Adriatics
 
Come riprogettare le attuali farm solution di share point con il nuovo modell...
Come riprogettare le attuali farm solution di share point con il nuovo modell...Come riprogettare le attuali farm solution di share point con il nuovo modell...
Come riprogettare le attuali farm solution di share point con il nuovo modell...Fabio Franzini
 
Server and client rendering of single page apps
Server and client rendering of single page appsServer and client rendering of single page apps
Server and client rendering of single page appsThomas Heymann
 
Optimizing your job apply pages with the LinkedIn profile API
Optimizing your job apply pages with the LinkedIn profile APIOptimizing your job apply pages with the LinkedIn profile API
Optimizing your job apply pages with the LinkedIn profile APIIvo Brett
 
Prepararsi a spostare le proprie applicazioni share point su office 365
Prepararsi a spostare le proprie applicazioni share point su office 365Prepararsi a spostare le proprie applicazioni share point su office 365
Prepararsi a spostare le proprie applicazioni share point su office 365Giuseppe Marchi
 
Building a REST API for Longevity
Building a REST API for LongevityBuilding a REST API for Longevity
Building a REST API for LongevityMuleSoft
 
Angular 2 overview in 60 minutes
Angular 2 overview in 60 minutesAngular 2 overview in 60 minutes
Angular 2 overview in 60 minutesLoiane Groner
 
Tutorial, Part 1: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 1: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...Tutorial, Part 1: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 1: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...SPTechCon
 
The future of web development write once, run everywhere with angular js an...
The future of web development   write once, run everywhere with angular js an...The future of web development   write once, run everywhere with angular js an...
The future of web development write once, run everywhere with angular js an...Mark Leusink
 
The future of web development write once, run everywhere with angular.js and ...
The future of web development write once, run everywhere with angular.js and ...The future of web development write once, run everywhere with angular.js and ...
The future of web development write once, run everywhere with angular.js and ...Mark Roden
 
Workshop 04 android-development
Workshop 04 android-developmentWorkshop 04 android-development
Workshop 04 android-developmentAravindharamanan S
 
Write Generic Code with the Tooling API
Write Generic Code with the Tooling APIWrite Generic Code with the Tooling API
Write Generic Code with the Tooling APIAdam Olshansky
 
Z sap boe-2016-techws-04_vs_fiori-app-with-eclipseluna-accessing-zsap-system
Z sap boe-2016-techws-04_vs_fiori-app-with-eclipseluna-accessing-zsap-systemZ sap boe-2016-techws-04_vs_fiori-app-with-eclipseluna-accessing-zsap-system
Z sap boe-2016-techws-04_vs_fiori-app-with-eclipseluna-accessing-zsap-systemNagendra Babu
 
How to Connect to Any REST API (Without Writing Any Code)
How to Connect to Any REST API (Without Writing Any Code)How to Connect to Any REST API (Without Writing Any Code)
How to Connect to Any REST API (Without Writing Any Code)Safe Software
 
Practices and tools for building better APIs
Practices and tools for building better APIsPractices and tools for building better APIs
Practices and tools for building better APIsNLJUG
 

Semelhante a django Forms in a Web API World (20)

SAP Adobe forms
SAP Adobe formsSAP Adobe forms
SAP Adobe forms
 
(ATS6-DEV02) Web Application Strategies
(ATS6-DEV02) Web Application Strategies(ATS6-DEV02) Web Application Strategies
(ATS6-DEV02) Web Application Strategies
 
java mini project for college students
java mini project for college students java mini project for college students
java mini project for college students
 
SharePoint 2013 APIs demystified
SharePoint 2013 APIs demystifiedSharePoint 2013 APIs demystified
SharePoint 2013 APIs demystified
 
Come riprogettare le attuali farm solution di share point con il nuovo modell...
Come riprogettare le attuali farm solution di share point con il nuovo modell...Come riprogettare le attuali farm solution di share point con il nuovo modell...
Come riprogettare le attuali farm solution di share point con il nuovo modell...
 
Server and client rendering of single page apps
Server and client rendering of single page appsServer and client rendering of single page apps
Server and client rendering of single page apps
 
Optimizing your job apply pages with the LinkedIn profile API
Optimizing your job apply pages with the LinkedIn profile APIOptimizing your job apply pages with the LinkedIn profile API
Optimizing your job apply pages with the LinkedIn profile API
 
Prepararsi a spostare le proprie applicazioni share point su office 365
Prepararsi a spostare le proprie applicazioni share point su office 365Prepararsi a spostare le proprie applicazioni share point su office 365
Prepararsi a spostare le proprie applicazioni share point su office 365
 
Building a REST API for Longevity
Building a REST API for LongevityBuilding a REST API for Longevity
Building a REST API for Longevity
 
Angular 2 overview in 60 minutes
Angular 2 overview in 60 minutesAngular 2 overview in 60 minutes
Angular 2 overview in 60 minutes
 
Tutorial, Part 1: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 1: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...Tutorial, Part 1: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
Tutorial, Part 1: SharePoint 101: Jump-Starting the Developer by Rob Windsor ...
 
The future of web development write once, run everywhere with angular js an...
The future of web development   write once, run everywhere with angular js an...The future of web development   write once, run everywhere with angular js an...
The future of web development write once, run everywhere with angular js an...
 
The future of web development write once, run everywhere with angular.js and ...
The future of web development write once, run everywhere with angular.js and ...The future of web development write once, run everywhere with angular.js and ...
The future of web development write once, run everywhere with angular.js and ...
 
Workshop 04 android-development
Workshop 04 android-developmentWorkshop 04 android-development
Workshop 04 android-development
 
Write Generic Code with the Tooling API
Write Generic Code with the Tooling APIWrite Generic Code with the Tooling API
Write Generic Code with the Tooling API
 
Smartone v1.0
Smartone v1.0Smartone v1.0
Smartone v1.0
 
Z sap boe-2016-techws-04_vs_fiori-app-with-eclipseluna-accessing-zsap-system
Z sap boe-2016-techws-04_vs_fiori-app-with-eclipseluna-accessing-zsap-systemZ sap boe-2016-techws-04_vs_fiori-app-with-eclipseluna-accessing-zsap-system
Z sap boe-2016-techws-04_vs_fiori-app-with-eclipseluna-accessing-zsap-system
 
Code workshop
Code workshopCode workshop
Code workshop
 
How to Connect to Any REST API (Without Writing Any Code)
How to Connect to Any REST API (Without Writing Any Code)How to Connect to Any REST API (Without Writing Any Code)
How to Connect to Any REST API (Without Writing Any Code)
 
Practices and tools for building better APIs
Practices and tools for building better APIsPractices and tools for building better APIs
Practices and tools for building better APIs
 

Mais de Tareque Hossain

RESTful APIs: Promises & lies
RESTful APIs: Promises & liesRESTful APIs: Promises & lies
RESTful APIs: Promises & liesTareque Hossain
 
API Design & Security in django
API Design & Security in djangoAPI Design & Security in django
API Design & Security in djangoTareque Hossain
 
Introducing KMux - The Kernel Multiplexer
Introducing KMux - The Kernel MultiplexerIntroducing KMux - The Kernel Multiplexer
Introducing KMux - The Kernel MultiplexerTareque Hossain
 
SIGTRAN - An Introduction
SIGTRAN - An IntroductionSIGTRAN - An Introduction
SIGTRAN - An IntroductionTareque Hossain
 
Linux Composite Communication
Linux Composite CommunicationLinux Composite Communication
Linux Composite CommunicationTareque Hossain
 
Xen & the Art of Virtualization
Xen & the Art of VirtualizationXen & the Art of Virtualization
Xen & the Art of VirtualizationTareque Hossain
 
Introduction to django-config
Introduction to django-configIntroduction to django-config
Introduction to django-configTareque Hossain
 

Mais de Tareque Hossain (10)

The solr power
The solr powerThe solr power
The solr power
 
RESTful APIs: Promises & lies
RESTful APIs: Promises & liesRESTful APIs: Promises & lies
RESTful APIs: Promises & lies
 
API Design & Security in django
API Design & Security in djangoAPI Design & Security in django
API Design & Security in django
 
Introducing KMux - The Kernel Multiplexer
Introducing KMux - The Kernel MultiplexerIntroducing KMux - The Kernel Multiplexer
Introducing KMux - The Kernel Multiplexer
 
SIGTRAN - An Introduction
SIGTRAN - An IntroductionSIGTRAN - An Introduction
SIGTRAN - An Introduction
 
Django orm-tips
Django orm-tipsDjango orm-tips
Django orm-tips
 
Linux Composite Communication
Linux Composite CommunicationLinux Composite Communication
Linux Composite Communication
 
Django Deployment
Django DeploymentDjango Deployment
Django Deployment
 
Xen & the Art of Virtualization
Xen & the Art of VirtualizationXen & the Art of Virtualization
Xen & the Art of Virtualization
 
Introduction to django-config
Introduction to django-configIntroduction to django-config
Introduction to django-config
 

Último

The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfSeasiaInfotech2
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesZilliz
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Enterprise Knowledge
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024Lorenzo Miniero
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 

Último (20)

The Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdfThe Future of Software Development - Devin AI Innovative Approach.pdf
The Future of Software Development - Devin AI Innovative Approach.pdf
 
Vector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector DatabasesVector Databases 101 - An introduction to the world of Vector Databases
Vector Databases 101 - An introduction to the world of Vector Databases
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024Designing IA for AI - Information Architecture Conference 2024
Designing IA for AI - Information Architecture Conference 2024
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024SIP trunking in Janus @ Kamailio World 2024
SIP trunking in Janus @ Kamailio World 2024
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 

django Forms in a Web API World

  • 1. XHR django Forms in an API World http://www.northwesternflipside.com/2011/01/10/2011-where-are-the-flying-cars/
  • 2. Lets talk about me Tareque Hossain Lead Software Engineer
  • 3. Lets talk about forms django Forms And how we can use them in this day & age of APIs!
  • 4. What can you expect… • What’s wrong with forms as it is • How we use forms • Issues using form in an API world • Approaches for tackling the issues • The solution
  • 5. The good old days.. • Write up some HTML • Throw some fancy template tags in there {{ my_awesome_form.as_p }} • WIN
  • 6. Fast forward a few years.. You really dig APIs
  • 7. Your setup looks like this: Me likey! I give you No $#!7. API
  • 8. Nuevo mundo.. • Django forms live on API server – Validates/ saves API requests – Doesn’t get rendered via template • You’ve been writing forms in the frontend – Hardcoded HTML – Trying to match up data that API expects
  • 9. API Clients • Your website no longer lives on the same application space as the API • Common API clients – A JavaScript MVC powered website – An android app – An iOS app
  • 10. Forms on API Clients
  • 11. The Issue • You can serve most platforms with an HTML app – Write form in HTML on your webapp • If you write native application for mobile – You recreate forms using the interfaces available
  • 12. The Issue • These interfaces you write – Don’t have any idea about the django forms residing on the API server – Only know what data to collect when you explicitly code them on each device • There’s a disconnect
  • 13. Houston we have a problem.. http://epicdemotivational.com/tag/beer/page/2/
  • 14. Lets take a step back What is a form?
  • 15. Lets take a step back ˈ rm (noun) fȯ a printed or typed document with blank spaces for insertion of required or requested information Entry #4 at http://www.merriam-webster.com/dictionary/form
  • 16. In the world of HTML Part of an HTML document with input interfaces for inserting required or requested information
  • 17. In the world of web apps • A form is the interface we provide the application user to collect information • It’s essential to any application where we collect data
  • 18. In the world of django
  • 19. django Forms • A construct that: – Binds data (request.POST) – Validates data (clean) – Processes data (save) – Renders interface (as_p)
  • 20. django Forms • ModelForm – Turns your model into a form – Easiest way to get an interface for your data • Widgets – Define specific properties for interface element – Separates presentation from data types
  • 21. Why not just render via template? You can’t if: – You only use django to power your API and the consumers are arbitrary – You run several django API servers each dealing with different data space
  • 22. Think about this architecture Profile API Analytics API Content API Admin App User App
  • 23. Your services are distributed • Web applications we design are increasingly becoming: – Separated between presentation and data layer via API – Dependent on multiple API endpoints – Rich and complex in interface
  • 24. Your services are distributed • Your site content is retrieved using the Content API – You collect user feedback on content using forms – You provide admin interface to manage content using forms
  • 25. Your services are distributed • Information for users are stored and retrieved using Profile API – You allow log in, creation and update of profiles using forms – You provide admin interface to manage profiles using forms
  • 26. Your services are distributed • Site performance and user traffic is recorded to Analytics API – You provide admin interface to access and create custom reports using forms
  • 27. Think again. Profile API Analytics API Content API Admin App User App
  • 28. The Issue (contd.) • At WiserTogether we love APIs & have a similar distributed setup • We’ve been hardcoding forms in the frontend, collecting data and sending to API
  • 29. The Issue (contd.) • Whenever a data point in the backend changed, we had to update the form • We have multiple clients who require different set of fields present on registration forms – Again, hardcoding in frontend
  • 30. It was a mess $#^*!
  • 31. What to do.. • django forms is used to validate and process our API data • We wanted django forms to determine our frontend interface – But it was completely agnostic about backend forms!
  • 32. What to do.. • Deliver form definition over API • Render interface in the frontend from the retrieved definition – No more hardcoding – Forms in the user facing application changes as soon as backend form changes
  • 33. What to do.. • Adjust form in whatever way necessary – Add/ remove fields from registration form – Frontend renders form exactly the way you want – No code change necessary in frontend
  • 34. What to do.. • Contain form definition in one spot • Allow a single central point to control interface on all applications • Allow different API consumers to retrieve form definition – And render interface appropriate for the platform or device
  • 36. Step 1 Serialize form with all information necessary for reproduction at frontend
  • 37. Step 2 • Devise methods to handle the following over API: – Deliver form definition – Receive form data – Validate form and deliver errors – If valid save the form
  • 38. Step 3 • Handle forms in the frontend using API data – Render form – Submit data – If not valid, then display errors – If valid, then display success message, reload page or redirect as necessary
  • 39. Step 1 Serialize form with all information necessary for reproduction at frontend
  • 40. django Remote Forms • Extracts all information from a given django form or model form instance • Goes through each field & widget to extract all necessary information • Presents the information as dictionary for further manipulation & easy serialization into JSON
  • 43. Step 2 • Devise methods to handle the following over API: – Deliver form definition – Receive form data – Validate form and deliver errors – If valid save the form
  • 44.
  • 45. Points to Ponder • Handle CSRF yourself of using X- CSRFToken – django CSRF middleware is not JSON friendly • Encapsulate form processing in save method, similar to Model Form
  • 46. Step 3 • Handle forms in the frontend using API data – Render form – Submit data – If not valid, then display errors – If valid, then display success message, reload page or redirect as necessary
  • 47. HTML/JS/CSS Implementation • We created a set of rendering and data handling tools for the frontend using: • In future, we’ll be working towards iOS implementations as well
  • 48. Backbone Form Handler • Renders forms based on definition received over API • Uses Handlebars template for rendering: – Core form structure (form tag, fields container, global errors) – Field & widget structure (help text, errors) • Error rendering
  • 49. Backbone Form Handler • Allows instant validation – Similar to autocomplete – Field can be validated as soon as you move to next one • Allows preloading of data • Disallow editing of fields – Including selects, radio and checkboxes • Provide submit buttons (if not supplied)
  • 50. Handlebars Templates Handlebars Widgets
  • 51. Sample Backbone View Instantiate form model Instantiate form view Initiate rendering by fetching the form definition
  • 52.
  • 53. django Remote Admin • A reviewer expressed interest – Use remote forms to expose django admin interface over API • So I implemented a set of API endpoints – Exposes django admin app/model/instance data – Exposes admin forms • And wrote a backbone app implementing django admin
  • 54. Goals of django Remote Admin • Allow administration of django projects over API • No more ties to the same old interface! • Use awesome Handlebars snippets of your own to spice up the interface
  • 55. How does it work? • Cycle through admin site registry – Extract app/model info and expose over API • Create ModelForm from the model – Expose over API using django remote forms • The backbone app calls the API – Allows browsing apps/ models – Allows creating/editing model instances
  • 56. Further Work • django Remote Forms – Implement file/ image uploading over API • django Remote Admin – Load form/widget customizations from Admin classes – Implement pagination for foreign key loader
  • 57. Demo • Ask me about WiserTogether – github.com/WiserTogether/django-remote-forms – github.com/tarequeh/django-remote-admin • Follow my tweets @tarequeh • Shout out to Carlo Costino • ind this presentation – slideshare.net/tarequeh
  • 58. Q/A • Ask me about WiserTogether – github.com/WiserTogether/django-remote-forms – github.com/tarequeh/django-remote-admin • Follow my tweets @tarequeh • Shout out to Carlo Costino • ind this presentation – slideshare.net/tarequeh

Notas do Editor

  1. We are a small health care startup and we provide a platform through which users can make better decisions about their healthcare options
  2. But we are here today to talk about forms, particularly django forms.
  3. I’ll discuss the following things..
  4. Remember the times when the only form on your site was a comments page?
  5. Here we see He-Man riding warrior pony serving API using django and says I give you API! And all the consumers love it
  6. But the problem of reproducing forms on the frontend is much more than not being able to render it via django template
  7. Here’s a clear manifestation of forms on different platforms. On the far right we have the login/registration form on Twitter’s homepage, which is strikingly similar to the interfaces on these devices!
  8. So let’s get back to the issue of form rendering
  9. This is a simple authentication form that asks for your email and password, has a few clean methods to distill the data and some additional helper methods
  10. LOVE django forms
  11. ModelForms and Widgets are two great aspect of django, one promotes DRY and the other provides separation of logic
  12. And much more
  13. 3 independent django projects and 2 independent webapps
  14. And much more
  15. And much more
  16. And much more
  17. And much more
  18. And much more
  19. More hardcoding to accommodate different versions of the same form
  20. More hardcoding to accommodate different versions of the same form
  21. More hardcoding to accommodate different versions of the same form
  22. Let’s go over each of the steps in detail..
  23. And our solution…
  24. I want to emphasize on the fact that I’m not a big fan of sending HTML over API. Particularly not for forms, since the consumer of the API may or may not render the form using HTML
  25. Lets take a look at what a view capable of providing such API functionalities look like. I promise it’s not too complex.
  26. Finally step 3
  27. So we went ahead and implemented a solution for the web applications
  28. The primary construct that’s responsible for managing the remote forms is a special Backbone model/view combo that we call the Backbone Form Handler
  29. Lets take a look at the handelbars part of this solution
  30. As you can see, we are using little snippets of Handlebars for different form fields. Similar to form widgets.
  31. More hardcoding to accommodate different versions of the same form
  32. Please feel free to use the examples in any way that suits your needs. They are not meant to be out of the box solution and currently doesn’t have much documentation
  33. Please feel free to use the examples in any way that suits your needs. They are not meant to be out of the box solution and currently doesn’t have much documentation