Hello, if you have any need, please feel free to consult us, this is my wechat: wx91due
CSCI 571 – Fall 2024 Assignment 2: Search Server-side Scripting using Python Flask, JSON, and Tomorrow.io API
1. Objectives
● Get experience with the Python programming language and Flask framework.
● Get experience with the Google API, Tomorrow.io API and HighCharts Service.
● Get experience creating web pages using HTML, CSS, JavaScript, DOM, JSON format and XMLHttpRequest object.
● Get experience using JSON parsers in Python and JavaScript.
● Getting hands-on experience in GCP, AWS or Azure.
1.1. Cloud Exercise
The backend of this homework must be implemented in the cloud on Google Cloud App Engine, AWS or Azure, using Python.
● SeeCloud Setup (Python)for installation of components on GCP, AWS or Azure.
● See the hints in section 3; a lot of reference material is provided to you.
● For Python and Flask kick-start, please refer to the Lecture slides on the class website.
● You must refer to the grading guidelines, the video, the specs, and Piazza. Styling will be graded, and the point’s breakup is mentioned in the grading guidelines.
2.Description
In this exercise, you are asked to create a webpage that allows you to search for weather
information using the Tomorrow.io API, and the results will be displayed in a card and tabular format. The page will also provide day’s weather details.
2.1. Description of the Search Form
The user first opens a web page (for example,weather.html,or any valid web page name). You should use the ipinfo.io API (See hint 3.3) to fetch the user’s geolocation if the location checkbox is checked else the user must enter a Street, City and State to search. An example is shown in Figure 1.
If theCheck herecheckbox is checked then all the fields i.e., Street, City and State should reset text and disable the fields.
The search form has two buttons:
● SUBMITbutton: Selecting this button performs a search of the given location, and if location is found it returns weather information. An example of valid input is shown in Figure 2. Once the user has provided valid input, your client JavaScript should send a request to your web server Python script with the form inputs. You must use GET to transfer the form data to your web server (do not use POST, as you would be unable to provide a sample link to your cloud services). A Python script using Flask will retrieve the form inputs and send it to the Tomorrow.io API weather information service. You need to use theFlaskPython framework to make all the API calls.
If the user clicks on the SUBMIT button without providing a value in the “Street”, “City” and “State” field or checking the location checkbox, you should show an error “tooltip” that indicates which field is missing. Examples are shown in Figure 2a, 2b and 2c.
Using XMLHttpRequest or any other JavaScript calls for anything other than calling your own “cloud” backend will lead to a 4-point penalty. Do not call the Tomorrow.io API directly from JavaScript.
Define routing endpoints and make your API call from the Python backend. The recommended tutorial forFlaskand more importantly, routing, can be found at the following link: https://flask.palletsprojects.com/en/1.1.x/
● CLEARbutton: This button must clear the result area (below the search area) and set all fields to the default values in the search area. The CLEAR operation must be done using a JavaScript function.
Figure 2:An Example of a Valid Search
Figure 2:An Example of an Invalid Search
2.2 Displaying WeatherResults
In this section, we outline how to use the form inputs to construct the calls to the RESTful web services to the Tomorrow.io APIservice and display the result in the web page.
The Tomorrow.io API is documented here: https://docs.tomorrow.io/reference/welcome
If the Street, City and State information is used to get weather results, your client JavaScript uses the input address to get the geocoding via Google Maps Geocoding API. The Google Maps Geocoding API is documented here: https://developers.google.com/maps/documentation/geocoding/start
The Google Maps Geocoding API expects two parameters:
● address:The street address that you want to geocode, in the format used by the national postal service of the country concerned. Additional address elements such as business names and unit, suite or floor numbers should be avoided.
● key:Your application's API key. This key identifies your application for purposes of quota management. (Explained in Section 3.2).
2.2.1 Geocoding
An example of an HTTP request to the Google Maps Geocoding API, when the location address is “University of Southern California, CA” is shown below:
https://maps.googleapis.com/maps/api/geocode/json?address=University+of+So uthern+California+CA&key=YOUR_API_KEY
The response includes the latitude and longitude of the address.
Figure 3shows an example of the JSON object returned in the Google Maps Geocoding API web service response.
The latitude and longitude of the address are used when constructing a RESTful web service URL to retrieve weather information.
2.2.2. Tomorrow.io API Service
The Tomorrow.io API Retrieve TimeIines (Basic)service is documented here: https://docs.tomorrow.io/reference/get-timelines
Click thePythontab in the example, to see the format of the URL, querystring, and headers. The Tomorrow.io API Retrieve Timelinesservice expects the following parameters:
● apikey:Your application's API key. This key identifies your application for purposes of quota management.
● locations:Thelocation around which to retrieve weather information. Acceptable formats for location(https://docs.tomorrow.io/reference/api-formats#locations)
● fields:The fields which you will require are the following:
○ temperature
○ temperatureApparent
○ temperatureMin
○ temperatureMax
○ windSpeed
○ windDirection
○ humidity
○ pressureSeaLevel
○ uvIndex
○ weatherCode
○ precipitationProbability
○ precipitationType
○ sunriseTime
○ sunsetTime
○ visibility
○ moonPhase
○ cloudCover
● timesteps:The timesteps needed for the assignment are ‘1h’,’1d’ . Further, details of timesteps are documented here:https://docs.tomorrow.io/reference/weather-data- layers#timestep-availability.
● timezone: There are various timezones available here https://docs.tomorrow.io/reference/api-formats#timezone. Use “America/Los_Angeles” .
● units:Unit of the fields. There are two options, “imperial” and “metric” . Use “imperial” .
An example of an HTTP request to the Tomorrow.io API that searches for the nearby weather information near the University of Southern California, Los Angeles, CA is shown below:
- Current API call
usage: Current weather card view
https://api.tomorrow.io/v4/timelines?location=[LAT,LONG]&fields=[FIELD_NAME]&time steps=current&units=[UNIT]&timezone=[TIME_ZONE]&apikey=[API_KEY]
- Timestep = 1day API call
usage: Table Details, Detailed Summary of weather card view and Temperature Range(Min, Max) Chart.
https://api.tomorrow.io/v4/timelines?location=[LAT,LONG]&fields=[FIELD_NAME]&time
steps=1d&units=[UNIT]&timezone=[TIME_ZONE]&apikey=[API_KEY] A sample response is shown in Figure 5.
Figure 5:shows an example of the JSON response returned by the Tomorrow.io API service response.
The Python script should pass the returned JSON object to the client side or parse the returned JSON and extract useful fields and pass these fields to the client side in a JSON- formatted object. You should use JavaScript to parse the JSON object, extract theneeded fields, and display the results in a tabular format and a card view containingcurrent day’s weather information. A sample output is shown in Figure 6(a) and 6(b).
The displayed table includes five columns: Date,Status, Temp High, Temp Low,Wind Speed.
Figure 6(a):Output of Search Results
Figure 6(b):Output of Search Results
When the search result contains a record, you need to map the data extracted from the API result to render the HTML result card and table as described in Table 1 and Table 2respectively.
Table 1:Mapping the result from API into HTML card
HTML Card |
API Service Response |
Location |
● In case the location is being obtained from the google geocode api, the value of the “formatted_address”field. ● In case the location is being detected using ipinfo, you may use the city, region, country field from the response to construct the location string. |
Temperature |
The value of the “temperature”attribute is part of the values object. |
Humidity |
The value of the “humidity”attribute is part of the values object. It should be shown with the following icon and appropriate units. https://cdn2.iconfinder.com/data/icons/weathe r-74/24/weather-16-512.png |
Pressure |
The value of the “pressure”attribute is part of the values object. It should be shown with the following icon and appropriate units. https://cdn2.iconfinder.com/data/icons/weathe r-74/24/weather-25-512.png |
Wind Speed |
The value of the “windSpeed”attribute is part of the values object. It should be shown with the following icon and appropriate units. https://cdn2.iconfinder.com/data/icons/weathe r-74/24/weather-27-512.png |
Visibility |
The value of the “visibility”attribute is part of the values object. It should be shown with the following icon and appropriate units. https://cdn2.iconfinder.com/data/icons/weathe r-74/24/weather-30-512.png |
Cloud Cover |
The value of the “cloudCoveressure”attribute is part of the values object. It should be shown with the following icon and appropriate units. https://cdn2.iconfinder.com/data/icons/weathe r-74/24/weather-28-512.png |
UV Level |
The value of the “uvIndex”attribute is part of the values object. It shouldbe shown with the following icon and appropriate units. https://cdn2.iconfinder.com/data/icons/weathe r-74/24/weather-24-512.png |
Table 2:Mapping the result from API into HTML table
HTML Table Column |
API Service Response |
Date |
The value of “startTime”attributes that is part of the intervals objects. |
Status |
The value of “weatherCode”attribute is part of the values object,which is mapped to text description and image. |
Temp High |
The value of the “TemperatureMax”attribute is part of the values object. |
Temp Low |
The value of the “TemperatureMin”attribute is part of the values object. |
Wind Speed |
The value of the “windSpeed”attribute is part of the values object. |
Reference for HTML Table Column “Status”: Map the weatherCode to text description and image URLs as shown inFigure 7and refer to the documentation at:
https://docs.tomorrow.io/reference/data-layers-core :
Figure 7:Map of weatherCode to respective weather description and icon URLs The raw images for the above table can be found here:
https://github.com/Tomorrow-IO-API/tomorrow-weather-codes/tree/master/V1_icons/color
Light-wind:https://www.clipartmax.com/png/middle/31-318730_cold-wind-blowing-vector- wind-blow-icon.png
Wind:https://www.clipartmax.com/png/middle/31-319198_winds-weather-symbol-vector- weather-symbol-for-wind.png
StrongWind:https://www.clipartmax.com/png/middle/2-27821_wind-clipart-forecast-icon-line- icon-weather-wind-windy-wind-clipart.png
All images are also provided in the file images.zip, which is included in the Assignment 2 on D2L Brightspace. You are required to map the Weather Code you obtain from the api response to the summary text shown above as well as its corresponding icon.
Note: For items with more than one icon (e.g., 1100 - Mostly Clear) you can default to the
“morning” icon. On hovering, the Card should have a drop shadow. Please refer to the video for all the features and behavior to be implemented.
2.3 Displaying Detailed Summary of the Weather
In the search result table, if the user clicks on the date of a record, the page should display a detailed description of the daily weather. The request needs same parameters for API call as in 1st (output should be JSON), and the page should request the detailed information using the Tomorrow.io APIand direct to a section populated with this information, as shown in Figure 8 andFigure 9:
Figure 8:Daily Weather Details
Figure 9:Display on Arrow toggle
Below the Daily Weather Detail, there is a chart for the hourly weather. This is hidden by default. When the user clicks on the button , the “Weather Charts” sub-section should be expanded, and when the user clicks on the button , the “Weather Charts” sub-section should be hidden (if it is open) and vice versa (see the video for the behavior).
2.4Highcharts API Service
TheHighcharts APIservice is documented here:
https://www.highcharts.com/docs/index
Temperature Range (Min, Max)weather chart should consist of a daily based plot over a period from current day (not the selected) to next 15 days. For the reference of the development of the chart, see here: https://www.highcharts.com/demo/arearange
Hourly Weather (For Next 5 days)weather chart should consist of an hourly based plot over a period from current time (not the selected) to next 5 days. An example of an HTTP request to the Tomorrow.io API that searches for the hourly weather information which is required for this
chart is shown below: https://api.tomorrow.io/v4/timelines?location=[LAT,LONG]&fields=[FIELD_NAME]×tep s=1h&units=[UNIT]&timezone=[TIME_ZONE]&apikey=[API_KEY] For the reference of development of chart below is the link:
https://www.highcharts.com/demo/combo-meteogram#https://www.yr.no/place/United_Kingdom/England/London/forecast_hour_by_hour. xml
3.Hints
3.1 How to get Tomorrow.io API Key
● To get a Tomorrow.io API key, please follow these steps:
● Create a new account at:
● https://app.tomorrow.io/signup?planid=60d46beae90c3b3549a59ff3
3.2 How to get Google API Key
● To get a Google API key, please follow these steps:
● Go to the Google Developers Console:
https://console.developers.google.com/flows/enableapi?apiid=geocoding_backend&keyTy
● pe=SE RVER_SIDE&reusekey=true.
● At the Google APIs’ guide page, click “Get a key” and select a created project.
Note that you should NOT use a google account associated with a USC email. Preferably use a Gmail account.
3.3 Get IPInfo.io API Key
● Go to https://ipinfo.io/ and sign up for free
● A token would be provided after successful sign up
An example call is as follows: https://ipinfo.io/?token=YOUR_TOKEN_ID
3.4 Deploy Python file to the cloud (GCP/AWS/Azure)
You should use the domain name of the GAE/AWS/Azure service you created in Cloud Setup (Python)to make the request. For example, if your GAE/AWS/Azure server domain is called example.appspot.comorexample.elasticbeanstalk.comorexample.azurewebsites.net, the following links will be generated:
GAE - http://example.appspot.com/index.html
AWS - http://example.elasticbeanstalk.com/index.html Azure - http://example.azurewebsites.net/index.html
Theexamplesubdomain in the above URLs will be replaced by your choice of subdomain from the cloud service. You may also use a different page than index.html.
For example, if your GAE server domain is called example.appspot.com, the following links will be generated: http://example.appspot.com/index.html
Theexamplesubdomain in the above URLs will be replaced by your choice of subdomain from the cloud service. You may also use a different page than index.html. Files to deploy:
1. client-side files (HTML+CSS+JS)
2. server-side file (main.py), .yaml, requirements.txt
The project structure should be like the following one:
3.5 Behavior for Search Forms
When random/bogus values for the Street and City fields are entered in search form along with any State selected, it should still work and display weather card view and table records with the weather information as shown here:
If the API service returns an empty result set due to limited API calls allowed which would be a rare scenario as Tomorrow.io provide sufficient API calls limit, but still in case it happens then the page should display “No records have been found” as shown here:
3.6 Parsing JSON-formatted data in Python
Information on how to parse JSON-formatted data in Python is available here: https://docs.python.org/3/library/json.html
If you use your cloud server as a “proxy” pass-through, you do not have to decode and encode the JSON.
3.7 List of US States and Their Two-Letter Abbreviations
4.Files to Submit
In the Table of Assignments page, you should update theAssignment 2 linkto refer to your new initial web search page for this exercise (for example,weather.html). All your files must be hosted on Google Cloud, AWS or Azure cloud service. An additional link should be updated in the Table of Assignments, hyperlinking directly to the back-end code, with a sample query.
Graders will verify that these links are indeed pointing to Google Cloud, AWS or Azure. You should not host your files on GitHub Pages.
Also, submit your source code file to D2L Brightspace. Submit a ZIP file of both front-end and back-end code, plus any additional files needed to build your app (e.g., yaml file). The timestamp of the ZIP file will be used to verify if you used any “grace days.” **IMPORTANT**:
- All discussions and explanations in Piazza related to this homework are part of the homework description and grading guidelines. So please review all Piazza threads, before finishing the assignment. If there is a conflict between Piazza and this description and/or the grading guidelines,Piazza always rules.
- You can use jQuery, but it is not required.
- Youshould not call the Tomorrow.io APIs directly from JavaScript, bypassing the Python proxy. Implementing any one of them in JavaScript instead of Python will result in a4-point penalty.Other APIs can be called from JavaScript.
- APPEARANCE OF CARD VIEW, TABLE AND CHARTS should be similar to the reference video as much as possible.