Follow instructions to install the latest version of python for your platform in the python docs
We recommend working within a virtual environment whenever using Python for projects. This keeps your dependencies for each project separate and organaized. Instructions for setting up a virual enviornment for your platform can be found in the python docs
Once you have your virtual environment setup and running, install dependencies by naviging to the /backend
directory and running:
pip install -r requirements.txt
This will install all of the required packages we selected within the requirements.txt
file.
-
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 handle the lightweight sqlite database. You'll primarily work in app.py and can reference models.py.
-
Flask-CORS is the extension we'll use to handle cross origin requests from our frontend server.
With Postgres running, restore a database using the trivia.psql file provided. From the backend folder in terminal run:
psql trivia < trivia.psql
From within the backend
directory first ensure you are working using your created virtual environment.
To run the server, execute:
export FLASK_APP=flaskr
export FLASK_ENV=development
flask run
Setting the FLASK_ENV
variable to development
will detect file changes and restart the server automatically.
Setting the FLASK_APP
variable to flaskr
directs flask to use the flaskr
directory and the __init__.py
file to find the application.
One note before you delve into your tasks: for each endpoint you are expected to define the endpoint and response data. The frontend will be a plentiful resource because it is set up to expect certain endpoints and response data formats already. You should feel free to specify endpoints in your own way; if you do so, make sure to update the frontend or you will get some unexpected behavior.
- Use Flask-CORS to enable cross-domain requests and set response headers.
- Create an endpoint to handle GET requests for questions, including pagination (every 10 questions). This endpoint should return a list of questions, number of total questions, current category, categories.
- Create an endpoint to handle GET requests for all available categories.
- Create an endpoint to DELETE question using a question ID.
- Create an endpoint to POST a new question, which will require the question and answer text, category, and difficulty score.
- Create a POST endpoint to get questions based on category.
- Create a POST endpoint to get questions based on a search term. It should return any questions for whom the search term is a substring of the question.
- Create a POST endpoint to get questions to play the quiz. This endpoint should take category and previous question parameters and return a random questions within the given category, if provided, and that is not one of the previous questions.
- Create error handlers for all expected errors including 400, 404, 422 and 500.
REVIEW_COMMENT
This README is missing documentation of your endpoints. Below is an example for your endpoint to get all categories. Please use it as a reference for creating your documentation and resubmit your code.
Endpoints
GET '/categories'
GET ...
POST ...
DELETE ...
GET '/categories'
- Fetches a dictionary of categories in which the keys are the ids and the value is the corresponding string of the category
- Request Arguments: None
- Returns: An object with a single key, categories, that contains a object of id: category_string key:value pairs.
{'1' : "Science",
'2' : "Art",
'3' : "Geography",
'4' : "History",
'5' : "Entertainment",
'6' : "Sports"}
GET '/questions' , GET '/questions?page=1' -Fetches a dictionary that contains all the categories , and also Fetches a list that contains the current category per page. -Fetches a dictionary of all the questions orderd by ids .
- Request Arguments: None
- Returns a dictionary that contains all the categories , and a list that contains the current category per page ,the dictionary contains , the question description , answer , the category this question related to , and the difficulty level, we can use a paginate function to order the question per page
{ "categories": { "1": "Science", "2": "Art", "3": "Geography", "4": "History", "5": "Entertainment", "6": "Sports" }, "current_category": [ 5, 5, 4, 5, 4, 6, 6, 4, 3, 3 ], "questions": [ { "answer": "Apollo 13", "category": 5, "difficulty": 4, "id": 2, "question": "What movie earned Tom Hanks his third straight Oscar nomination, in 1996?" }, { "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": "Maya Angelou", "category": 4, "difficulty": 2, "id": 5, "question": "Whose autobiography is entitled 'I Know Why the Caged Bird Sings'?" }, { "answer": "Edward Scissorhands", "category": 5, "difficulty": 3, "id": 6, "question": "What was the title of the 1990 fantasy directed by Tim Burton about a young man with multi-bladed appendages?" }, { "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?" } ], "success": true, "total_questions": 34 }
DELETE '/question/<int:id>'
-Deletes a certain question by its id
-Request Arguments: question_id as id
-Return
{
"question_id": 52,
"success": true
}
POST '/questions' -ADDs a new question -Request Arguments:question_description , answer , difficulty , category -Return { "new question": 61, "success": true }
POST '/questions/search'
-Search for questions that have a similir word to the search arguments
-Request Arguments:searchTerm
-Return all the question that have a similir word to the search arguments for example using the word 'title'
{
"current_category": [
4,
5
],
"questions": [
{
"answer": "Maya Angelou",
"category": 4,
"difficulty": 2,
"id": 5,
"question": "Whose autobiography is entitled 'I Know Why the Caged Bird Sings'?"
},
{
"answer": "Edward Scissorhands",
"category": 5,
"difficulty": 3,
"id": 6,
"question": "What was the title of the 1990 fantasy directed by Tim Burton about a young man with multi-bladed appendages?"
}
],
"success": true,
"total_questions": 2
}
GET '/categories/int:cat_id/questions' -Select all the question in a certain category -Request arguments:category_id as cat_id -Return all questions in a certain category for example (cat_id=2) { "current_category": "Art", "questions": [ { "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?" }, { "answer": "One", "category": 2, "difficulty": 4, "id": 18, "question": "How many paintings did Van Gogh sell in his lifetime?" }, { "answer": "Jackson Pollock", "category": 2, "difficulty": 2, "id": 19, "question": "Which American artist was a pioneer of Abstract Expressionism, and a leading exponent of action painting?" } ], "success": true, "total_questions": 4 }
POST '/quizzes'
-Plays a game of trivia by fetching a random question for the selected category for 5 times the questions is not reapeted
-Request arguments:previous_question , category_selected
-initiate the game
@app.errorhandle(404) -handles all errors that comes from any endpoint that abort(404), and returns a more readable JSON fromat rather than the default html format and 404 status_code
@app.errorhandler(422)
-handles all errors that comes from any endpoint that abort(422), and returns a more readbale JSON format rather than the default html format ,and returns 422 status_code
## Testing
To run the tests, run
dropdb trivia_test createdb trivia_test psql trivia_test < trivia.psql python test_flaskr.py