Add basic search function
This commit is contained in:
parent
9773cf11f2
commit
c3c7ff61e9
@ -1,2 +1,3 @@
|
||||
# OHLQ-api
|
||||
|
||||
API wrapper to scrape the [Ohio Liquour Agency](https://www.ohlq.com)
|
||||
|
10
src/api/__init__.py
Normal file
10
src/api/__init__.py
Normal file
@ -0,0 +1,10 @@
|
||||
from flask_restx import Api
|
||||
from .search import api as search_ns
|
||||
|
||||
api = Api(
|
||||
title='OHLQ',
|
||||
version='1.0',
|
||||
description='Programatic interface to OHLQ'
|
||||
)
|
||||
|
||||
api.add_namespace(search_ns)
|
0
src/api/availability.py
Normal file
0
src/api/availability.py
Normal file
39
src/api/search.py
Normal file
39
src/api/search.py
Normal file
@ -0,0 +1,39 @@
|
||||
from flask_restx import Namespace, Resource, fields
|
||||
from flask_restx import reqparse
|
||||
from flask import make_response, abort, request, Response
|
||||
from functools import lru_cache
|
||||
import requests
|
||||
import logging
|
||||
|
||||
api = Namespace('search',
|
||||
description='Search the OHLQ website')
|
||||
|
||||
@api.route('/<string:query>')
|
||||
@api.doc(description='Search the OHLQ website. This is equivilant to the search box on the home page.')
|
||||
class Search(Resource):
|
||||
@api.doc('get')
|
||||
@api.response(200, 'Success')
|
||||
@api.response(500, 'Failure to retrieve data')
|
||||
def get(self, query):
|
||||
try:
|
||||
reply = performSearch(query)
|
||||
except Exception as e:
|
||||
abort(500, str(e))
|
||||
return reply
|
||||
|
||||
|
||||
# We define the caching mechanism for web requests
|
||||
@lru_cache(maxsize=32)
|
||||
def performSearch(query, page=1, pagesize=10):
|
||||
params = {
|
||||
"query": query,
|
||||
"page": page,
|
||||
"pagesize": pagesize
|
||||
}
|
||||
response = requests.get("https://www.ohlq.com/api/search/site", params=params)
|
||||
|
||||
if response.status_code != 200:
|
||||
logging.warn("Unable to perform search, got non 200 response code, recieved response %s", response.status_code)
|
||||
raise Exception("Unable to perform search, got non 200 response code")
|
||||
|
||||
return response.json()
|
21
src/app.py
Executable file
21
src/app.py
Executable file
@ -0,0 +1,21 @@
|
||||
#!/usr/bin/python
|
||||
# Entry point
|
||||
|
||||
from flask import Flask
|
||||
from api import api
|
||||
from config import config, setLogLevel
|
||||
import os
|
||||
import logging
|
||||
|
||||
setLogLevel()
|
||||
|
||||
port = config["server.port"]
|
||||
|
||||
app = Flask(__name__)
|
||||
|
||||
api.init_app(app)
|
||||
|
||||
app.run(host='0.0.0.0', port=port)
|
||||
|
||||
|
||||
|
19
src/config.py
Normal file
19
src/config.py
Normal file
@ -0,0 +1,19 @@
|
||||
# Load configuration yaml
|
||||
|
||||
import envyaml
|
||||
import os
|
||||
import logging
|
||||
|
||||
config = envyaml.EnvYAML(os.environ.get('CONFIG_PATH', 'config.yaml'))
|
||||
|
||||
def setLogLevel():
|
||||
"""
|
||||
Set the logging level based on the config
|
||||
"""
|
||||
logLevel = config["log.level"]
|
||||
if logLevel == "info":
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
elif logLevel == "debug":
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
|
||||
logging.warn("Logging level set to %s", logLevel)
|
5
src/config.yaml
Normal file
5
src/config.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
log:
|
||||
level: "debug"
|
||||
|
||||
server:
|
||||
port: 8080
|
0
src/requirements.txt
Normal file
0
src/requirements.txt
Normal file
Loading…
Reference in New Issue
Block a user