API Development and Documentation
Trivia App
This Trivia app allows users to play a trivia game where they test their knowledge by answering trivia questions The web application offers the following functionalities
- Display questions - both all questions and by category. Questions should show the question, category and difficulty rating by default and can show/hide the answer.
- Delete questions
- Add questions and require that they include question and answer text.
- Search for questions based on a text query string.
- Play the quiz game, randomizing either all questions or within a specific category.
About the Stack
The backend direcory contains files to setup the backend to enable communication with the front end and viewing of data from the database
View the Backend README for more details.
Frontend
The frontend directory contains a complete React frontend to consume the data from the Flask server. If you have prior experience building a frontend application, you should feel free to edit the endpoints as you see fit for the backend you design. If you do not have prior experience building a frontend application, you should read through the frontend code before starting and make notes regarding:
- What are the end points and HTTP methods the frontend is expecting to consume?
- How are the requests from the frontend formatted? Are they expecting certain parameters or payloads?
Pay special attention to what data the frontend is expecting from each API response to help guide how you format your API.
View the Frontend README for more details.
Getting Started
Developers should have Python3,node, npm installed
Install Dependencies
-
Python 3.7 - Follow instructions to install the latest version of python for your platform in the python docs
-
Virtual Environment - We recommend working within a virtual environment whenever using Python for projects. This keeps your dependencies for each project separate and organized. Instructions for setting up a virual environment for your platform can be found in the python docs
-
PIP Dependencies - Once your virtual environment is setup and running, install the required dependencies by navigating to the
/backend
directory and running:
pip install -r requirements.txt
Key Pip Dependencies
-
Flask is a lightweight backend microservices framework. Flask is required to handle requests and responses.
-
SQLAlchemy is the Python SQL toolkit and ORM we'll use to handle the lightweight SQL database. You'll primarily work in
app.py
and can referencemodels.py
. -
Flask-CORS is the extension we'll use to handle cross-origin requests from our frontend server.
Set up the Database
With Postgres running, create a trivia
database:
createbd trivia
Populate the database using the trivia.psql
file provided. From the backend
folder in terminal run:
psql trivia < trivia.psql
Run the Server
From within the ./src
directory first ensure you are working using your created virtual environment.
To run the server, execute:
export FLASK_APP=flaskr
export FLASK_ENV=development
python -m flask run
setting the FLASK_APP=flaskr
will allow the detection of flask app __init__py
in the flaskr diretory
setting FLASK_ENV=development
enables auto detect on the changes made during development process
API Reference
Getting started
- Backend base URL :
http://127.0.0.1:5000/
- Front end base URL:
http://127.0.0.1:3000/
- Authentication : Authentication and API keys have not been used in this application
Testing
To deploy the tests, run
dropdb trivia_test
createdb trivia_test
psql trivia_test < trivia.psql
python test_flaskr.py
Error Handling
Errors are returned as json object in the following format
{
"success": False,
"error": 400,
"message": "bad request"
}
The API returns three types of errors
- 404 :Not Found
- 400 :Bad Request
- 422 :Not processable
End points
GET '/categories'
- Returns an object of categories ordered by id,that contains an object of
id:category_string
key:value pairs, success value and total number of categories - Sample :
curl http://127.0.0.1:5000/categories
{
"1": "Science",
"2": "Art",
"3": "Geography",
"4": "History",
"5": "Entertainment",
"6": "Sports"
}
GET '/questions'
- Returns a paginated set of questions ,total number of questions
- Sample
curl http://127.0.0.1:5000/questions
{
"categories": {
"1": "Science",
"2": "Art",
"3": "Geography",
"4": "History",
"5": "Entertainment",
"6": "Sports"
},
"questions": [
{
"answer": "Tom Cruise",
"category": 5,
"difficulty": 4,
"id": 4,
"question": "What actor did author Anne Rice first denounce, then praise in the role of her beloved Lestat?"
},
{
"answer": "Muhammad Ali",
"category": 4,
"difficulty": 1,
"id": 9,
"question": "What boxer's original name is Cassius Clay?"
},
{
"answer": "Brazil",
"category": 6,
"difficulty": 3,
"id": 10,
"question": "Which is the only team to play in every soccer World Cup tournament?"
},
{
"answer": "Uruguay",
"category": 6,
"difficulty": 4,
"id": 11,
"question": "Which country won the first ever soccer World Cup in 1930?"
},
{
"answer": "George Washington Carver",
"category": 4,
"difficulty": 2,
"id": 12,
"question": "Who invented Peanut Butter?"
},
{
"answer": "Lake Victoria",
"category": 3,
"difficulty": 2,
"id": 13,
"question": "What is the largest lake in Africa?"
},
{
"answer": "The Palace of Versailles",
"category": 3,
"difficulty": 3,
"id": 14,
"question": "In which royal palace would you find the Hall of Mirrors?"
},
{
"answer": "Agra",
"category": 3,
"difficulty": 2,
"id": 15,
"question": "The Taj Mahal is located in which Indian city?"
},
{
"answer": "Escher",
"category": 2,
"difficulty": 1,
"id": 16,
"question": "Which Dutch graphic artist\u2013initials M C was a creator of optical illusions?"
},
{
"answer": "Mona Lisa",
"category": 2,
"difficulty": 3,
"id": 17,
"question": "La Giaconda is better known as what?"
}
],
"success": true,
"total_questions": 27
}
DELETE '/questions/{question_id}
- Deletes the question of the given id if it exists
- Returns a success value, id of the deleted question and total number of questions
- sample
curl -X DELETE http://127.0.0.1:5000/14
{
"delete_id": 14,
"success": true,
"total_questions": 24
}
POST '/questions'
- Creates a new question using the submitted question,answer,category and difficulty
- Returns success value,id of created question and total number of questions
- sample
curl http://127.0.0.1:5000/questions -X POST -H "Content-Type: application/json" --data "{\"question\": \"Frankie Fredericks represented which African country in athletics?\", \"answer\": \"Cleo\", \"difficulty\": \"3\", \"category\": \"6\" }"
{
"created": 36,
"success": true,
"total_questions": 25
}
POST '/questions'
- Returns questions that match the searchTerm,success,total search query
- sample
curl http://127.0.0.1:5000/questions -X POST -H "Content-Type: application/json" -d "{\"searchTerm\": \"what\"}"
{
"questions": [
{
"answer": "Muhammad Ali",
"category": 4,
"difficulty": 1,
"id": 9,
"question": "What boxer's original name is Cassius Clay?"
},
{
"answer": "Lake Victoria",
"category": 3,
"difficulty": 2,
"id": 13,
"question": "What is the largest lake in Africa?"
},
{
"answer": "Mona Lisa",
"category": 2,
"difficulty": 3,
"id": 17,
"question": "La Giaconda is better known as what?"
},
{
"answer": "The Liver",
"category": 1,
"difficulty": 4,
"id": 20,
"question": "What is the heaviest organ in the human body?"
},
{
"answer": "Blood",
"category": 1,
"difficulty": 4,
"id": 22,
"question": "Hematology is a branch of medicine involving the study of what?"
},
{
"answer": "bop",
"category": 3,
"difficulty": 5,
"id": 28,
"question": "whats my name"
}
],
"success": true,
"total_results": 6
}
GET '/categories/{category_id}/questions
- Retrives questions with a given category id
- Returns success value, paginated questions with the given category id,total questions
- sample
curl http://127.0.0.1:5000/categories/1/questions
{
"questions": [
{
"answer": "Muhammad Ali",
"category": 4,
"difficulty": 1,
"id": 9,
"question": "What boxer's original name is Cassius Clay?"
},
{
"answer": "Lake Victoria",
"category": 3,
"difficulty": 2,
"id": 13,
"question": "What is the largest lake in Africa?"
},
{
"answer": "Mona Lisa",
"category": 2,
"difficulty": 3,
"id": 17,
"question": "La Giaconda is better known as what?"
},
{
"answer": "The Liver",
"category": 1,
"difficulty": 4,
"id": 20,
"question": "What is the heaviest organ in the human body?"
},
{
"answer": "Blood",
"category": 1,
"difficulty": 4,
"id": 22,
"question": "Hematology is a branch of medicine involving the study of what?"
},
{
"answer": "bop",
"category": 3,
"difficulty": 5,
"id": 28,
"question": "whats my name"
}
],
"success": true,
"total_results": 6
}
POST '/quizzes'
- Takes two parameters, category and previous questions
- Returns a success value, random questions not in the previous question
{
"question": {
"answer": "The Liver",
"category": 1,
"difficulty": 4,
"id": 20,
"question": "What is the heaviest organ in the human body?"
},
"success": true
}
Authors
- Cleophas Kadima
Acknowledgements
- Udacity