Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Pump, Cedric
lab-rest
Commits
2cc8e7b5
Commit
2cc8e7b5
authored
Mar 28, 2021
by
CedricPump
Browse files
- tutorial step Connecting Our API to a Database
parent
c48daf25
Pipeline
#38139
passed with stages
in 1 minute and 27 seconds
Changes
1
Pipelines
1
Show whitespace changes
Inline
Side-by-side
api/api.py
View file @
2cc8e7b5
import
flask
import
flask
from
flask
import
request
,
jsonify
from
flask
import
request
,
jsonify
import
sqlite3
app
=
flask
.
Flask
(
__name__
)
app
=
flask
.
Flask
(
__name__
)
app
.
config
[
"DEBUG"
]
=
True
app
.
config
[
"DEBUG"
]
=
True
# Create some test data for our catalog in the form of a list of dictionaries.
def
dict_factory
(
cursor
,
row
):
books
=
[
d
=
{}
{
'id'
:
0
,
for
idx
,
col
in
enumerate
(
cursor
.
description
):
'title'
:
'A Fire Upon the Deep'
,
d
[
col
[
0
]]
=
row
[
idx
]
'author'
:
'Vernor Vinge'
,
return
d
'first_sentence'
:
'The coldsleep itself was dreamless.'
,
'year_published'
:
'1992'
},
{
'id'
:
1
,
'title'
:
'The Ones Who Walk Away From Omelas'
,
'author'
:
'Ursula K. Le Guin'
,
'first_sentence'
:
'With a clamor of bells that set the swallows soaring, the Festival of Summer came to the city Omelas, bright-towered by the sea.'
,
'published'
:
'1973'
},
{
'id'
:
2
,
'title'
:
'Dhalgren'
,
'author'
:
'Samuel R. Delany'
,
'first_sentence'
:
'to wound the autumnal city.'
,
'published'
:
'1975'
}
]
@
app
.
route
(
'/'
,
methods
=
[
'GET'
])
@
app
.
route
(
'/'
,
methods
=
[
'GET'
])
...
@@ -32,30 +20,51 @@ def home():
...
@@ -32,30 +20,51 @@ def home():
@
app
.
route
(
'/api/v1/resources/books/all'
,
methods
=
[
'GET'
])
@
app
.
route
(
'/api/v1/resources/books/all'
,
methods
=
[
'GET'
])
def
api_all
():
def
api_all
():
return
jsonify
(
books
)
conn
=
sqlite3
.
connect
(
'books.db'
)
conn
.
row_factory
=
dict_factory
cur
=
conn
.
cursor
()
all_books
=
cur
.
execute
(
'SELECT * FROM books;'
).
fetchall
()
return
jsonify
(
all_books
)
@
app
.
errorhandler
(
404
)
def
page_not_found
(
e
):
return
"<h1>404</h1><p>The resource could not be found.</p>"
,
404
@
app
.
route
(
'/api/v1/resources/books'
,
methods
=
[
'GET'
])
@
app
.
route
(
'/api/v1/resources/books'
,
methods
=
[
'GET'
])
def
api_id
():
def
api_filter
():
# Check if an ID was provided as part of the URL.
query_parameters
=
request
.
args
# If ID is provided, assign it to a variable.
# If no ID is provided, display an error in the browser.
id
=
query_parameters
.
get
(
'id'
)
if
'id'
in
request
.
args
:
published
=
query_parameters
.
get
(
'published'
)
id
=
int
(
request
.
args
[
'id'
])
author
=
query_parameters
.
get
(
'author'
)
else
:
return
"Error: No id field provided. Please specify an id."
query
=
"SELECT * FROM books WHERE"
to_filter
=
[]
# Create an empty list for our results
results
=
[]
if
id
:
query
+=
' id=? AND'
# Loop through the data and match results that fit the requested ID.
to_filter
.
append
(
id
)
# IDs are unique, but other fields might return many results
if
published
:
for
book
in
books
:
query
+=
' published=? AND'
if
book
[
'id'
]
==
id
:
to_filter
.
append
(
published
)
results
.
append
(
book
)
if
author
:
query
+=
' author=? AND'
# Use the jsonify function from Flask to convert our list of
to_filter
.
append
(
author
)
# Python dictionaries to the JSON format.
if
not
(
id
or
published
or
author
):
return
page_not_found
(
404
)
query
=
query
[:
-
4
]
+
';'
conn
=
sqlite3
.
connect
(
'books.db'
)
conn
.
row_factory
=
dict_factory
cur
=
conn
.
cursor
()
results
=
cur
.
execute
(
query
,
to_filter
).
fetchall
()
return
jsonify
(
results
)
return
jsonify
(
results
)
app
.
run
()
app
.
run
()
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment