Web-Applications: TurboGears II BCHB524 2015 Lecture 26 12/7/2015 BCHB524 - 2015 - Edwards
Web-Applications:TurboGears II
BCHB5242015
Lecture 26
12/7/2015 BCHB524 - 2015 - Edwards
12/7/2015 BCHB524 - 2015 - Edwards 2
Last time…
We made the empty HoyaTaxa website and learned how to make minor changes, and send dynamic content to template.
We added a “taxa” information page with: Clickable Parent link (Variable number of) clickable Children links (Variable number of) names (other than sci name) Taxonomic lineage
12/7/2015 BCHB524 - 2015 - Edwards 3
Start web-app and check
Check that the web-application is working... In the class Command-Line shell:
[student@localhost ~]$ cd HoyaTaxa [student@localhost HoyaTaxa]$ start-hoyataxa.py
Start a web-browser and access by urls:http://localhost:8080/http://localhost:8080/taxa/9606http://localhost:8080/taxa?taxid=9606
12/7/2015 BCHB524 - 2015 - Edwards 4
Empty landing page
12/7/2015 BCHB524 - 2015 - Edwards 5
Taxonomy page
12/7/2015 BCHB524 - 2015 - Edwards 6
Tour the primary filesThe files we modified in the HoyaTaxa folder: Controller:
hoyataxa/controllers.py Change the index method Add the taxa method to lookup and return Taxonomy given taxid
(Data) Model: hoyataxa/model.py
SQLObject classes devdata.sqlite
download (or populate) the data in the sqlite database View / Template:
hoyataxa/templates/welcome.html Remove all but the dynamic title
hoyataxa/templates/master.html Change header and footer, remove menus
hoyataxa/templates/taxa.html Set-up the taxa page layout
12/7/2015 BCHB524 - 2015 - Edwards 7
Empty landing page
12/7/2015 BCHB524 - 2015 - Edwards 8
Set up search form
In controllers.py, define a class for the formfrom turbogears import validate, validatorsfrom turbogears import widgets, error_handler
class SearchFields(widgets.WidgetsList): query = widgets.TextField(label="Search Term") mode = widgets.SingleSelectField(label="Search Mode", options=["Starts with", "Ends with", "Contains"], default="Contains")
search_form = widgets.TableForm( fields = SearchFields(), action = "search", submit_text = "Search" )
class Root(controllers.RootController): @expose(template="hoyataxa.templates.welcome") def index(self): return dict(form=search_form, title="All your taxa are belong to us")
12/7/2015 BCHB524 - 2015 - Edwards 9
Set up search form
Place the form in welcome.html
12/7/2015 BCHB524 - 2015 - Edwards 10
Set up search form
12/7/2015 BCHB524 - 2015 - Edwards 11
Handle the search request
In controllers.py, we add the search method
12/7/2015 BCHB524 - 2015 - Edwards 12
Handle the search request
Save taxa.html as search.html and modify
12/7/2015 BCHB524 - 2015 - Edwards 13
Handle the search request
Save taxa.html as search.html and modify
Search for name: gorilla
12/7/2015 BCHB524 - 2015 - Edwards 14
12/7/2015 BCHB524 - 2015 - Edwards 15
But…
There is a problem. What to do about bad input?
Too short, spaces at beginning or end…
TurboGears provides validators to check values in the fields to make sure they are OK
Nice integration with form widgets Users get error messages so they can fix the
error
12/7/2015 BCHB524 - 2015 - Edwards 16
Validation “Schema”
12/7/2015 BCHB524 - 2015 - Edwards 17
Handle errors in search parameters
12/7/2015 BCHB524 - 2015 - Edwards 18
Problem is communicated to user
12/7/2015 BCHB524 - 2015 - Edwards 19
Problem is communicated to user
12/7/2015 BCHB524 - 2015 - Edwards 20
Validators can be quite complicated
12/7/2015 BCHB524 - 2015 - Edwards 21
Problem is communicated to user
12/7/2015 BCHB524 - 2015 - Edwards 22
Setup for use by web-services
Our web-site can now be accessed programatically… …as we did with urllib.urlopen in python
Access:http://localhost:8080/taxa?taxid=9606
http://localhost:8080/search?query=hum&mode=Contains
However, we usually don’t want to parse HTML. Programs want to parse “easy” no-frills formats.
12/7/2015 BCHB524 - 2015 - Edwards 23
Let’s provide XML output format
We need a new output template for search: searchxml.html
12/7/2015 BCHB524 - 2015 - Edwards 24
XML output format
Next we need to tell the search method when to use it…
12/7/2015 BCHB524 - 2015 - Edwards 25
XML Output Format
To get XML format output, add “&tg_format=xml” to end of URL.
Try it:
http://localhost:8080/search?query=hum&mode=Contains
http://localhost:8080/search?query=hum&mode=Contains&tg_format=xml
12/7/2015 BCHB524 - 2015 - Edwards 26
Similarly for the taxa page
12/7/2015 BCHB524 - 2015 - Edwards 27
Similarly for the taxa page
12/7/2015 BCHB524 - 2015 - Edwards 28
XML Output Format
To get XML format output, add “tg_format=xml” to end of URL.
Try it:
http://localhost:8080/taxa?taxid=9606http://localhost:8080/taxa?taxid=9606&tg_format=xml
http://localhost:8080/taxa/9606http://localhost:8080/taxa/9606?tg_format=xml
12/7/2015 BCHB524 - 2015 - Edwards 29
All done…
We can now display a taxonomy record nicely if the user types a URL ...and then navigate about its heirachy.
Can search the names based on a user query. Search form, list of matching results, etc...
XML output for web-services.
12/7/2015 BCHB524 - 2015 - Edwards 30
TODO…
If only one matching search result – jump straight to taxa page… Even if only one taxa matches?
Search/lookup by taxid too? Make pages and tables prettier
Center and position tables on page Alternate row colors