Jobs API Implementation Using Flask¶

This notebook implements a simple jobs API using Flask and Python for data access and demonstration purposes.

JOBS API Implementation Using FLASK¶

Estimated time needed: 45 to 60 minutes

Objectives¶

You will be executing this code so that the client application Collecting Jobs API will be accessing this code executing on the server

In [1]:
!pip install flask
Requirement already satisfied: flask in e:\anaconda\envs\cvpr\lib\site-packages (2.1.2)
WARNING: Ignoring invalid distribution -umpy (e:\anaconda\envs\cvpr\lib\site-packages)
WARNING: Ignoring invalid distribution -umpy (e:\anaconda\envs\cvpr\lib\site-packages)
WARNING: Ignoring invalid distribution -umpy (e:\anaconda\envs\cvpr\lib\site-packages)
WARNING: Ignoring invalid distribution -umpy (e:\anaconda\envs\cvpr\lib\site-packages)
Requirement already satisfied: Werkzeug>=2.0 in e:\anaconda\envs\cvpr\lib\site-packages (from flask) (2.1.1)
Requirement already satisfied: Jinja2>=3.0 in e:\anaconda\envs\cvpr\lib\site-packages (from flask) (3.1.1)
Requirement already satisfied: click>=8.0 in e:\anaconda\envs\cvpr\lib\site-packages (from flask) (8.1.2)
Requirement already satisfied: importlib-metadata>=3.6.0 in e:\anaconda\envs\cvpr\lib\site-packages (from flask) (4.11.3)
Requirement already satisfied: itsdangerous>=2.0 in e:\anaconda\envs\cvpr\lib\site-packages (from flask) (2.1.2)
Requirement already satisfied: colorama in e:\anaconda\envs\cvpr\lib\site-packages (from click>=8.0->flask) (0.4.4)
Requirement already satisfied: zipp>=0.5 in e:\anaconda\envs\cvpr\lib\site-packages (from importlib-metadata>=3.6.0->flask) (3.8.0)
Requirement already satisfied: MarkupSafe>=2.0 in e:\anaconda\envs\cvpr\lib\site-packages (from Jinja2>=3.0->flask) (2.1.1)

Dataset Used in this Project¶

The dataset used in this project comes from the following source: https://www.kaggle.com/promptcloud/jobs-on-naukricom under the under a Public Domain license.

Note: We are using a modified subset of that dataset, so to follow the instructions successfully please use the dataset provided, rather than the dataset from the original source.

The original dataset is a csv. We have converted the csv to json as per the requirement of the project.

In [2]:
# !wget --no-check-certificate https://cf-courses-data.s3.us.cloud-object-storage.appdomain.cloud/IBM-DA0321EN-SkillsNetwork/labs/module%201/Accessing%20Data%20Using%20APIs/jobs.json
In [ ]:
import flask
from flask import request, jsonify
import requests
import re

def get_data(key,value,current):
    results = list()
    for rec in current:
        
        if rec[key].find(value) != -1:
            results.append(rec)
    return results

app = flask.Flask(__name__)

import json
data = None
with open('jobs.json',encoding='utf-8') as f:
    # returns JSON object as
    # a dictionary
    data = json.load(f)
    
    

@app.route('/', methods=['GET'])
def home():
    
    return '''<h1>Welcome to flask JOB search API</p>'''


@app.route('/data/all', methods=['GET'])
def api_all():
    return jsonify(data)


@app.route('/data', methods=['GET'])
def api_id():
    # Check if keys such as Job Title,KeySkills, Role Category and others  are provided as part of the URL.
    #  Assign the keys to the corresponding variables..
    # If no key is provided, display an error in the browser.
    res = None
    for req in request.args:
        
        if req == 'Job Title':
            key = 'Job Title'
        elif req == 'Job Experience Required' :
            key='Job Experience Required'
        elif req == 'Key Skills' :
            key='Key Skills'
            
        elif req == 'Role Category' :
            key='Role Category'
        elif req == 'Location' :
            key='Location'
        
        elif req == 'Functional Area' :
            key='Functional Area'
        
        elif req == 'Industry' :
            key='Industry'
        elif req == 'Role' :
            key='Role'
        elif req=="id":
             key="id"
        else:
            pass
    
        value = request.args[key]
        if (res==None):
            res = get_data(key,value,data)
        else:
            res = get_data(key,value,res)

    # Use the jsonify function from Flask to convert our list of
    # Python dictionaries to the JSON format.
    return jsonify(res)

app.run()
 * Serving Flask app '__main__' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
127.0.0.1 - - [01/Jul/2022 01:49:16] "GET /data?Key+Skills=Python HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:49:16] "GET /data?Location=Washington+DC HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:49:20] "GET /data?Location=Los+Angeles HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:49:20] "GET /data?Location=New+York HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:49:20] "GET /data?Location=San+Francisco HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:49:20] "GET /data?Location=Washington+DC HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:49:20] "GET /data?Location=Seattle HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:49:21] "GET /data?Location=Austin HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:49:21] "GET /data?Location=Detroit HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:49:22] "GET /data?Key+Skills=C HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:49:23] "GET /data?Key+Skills=C%23 HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:49:23] "GET /data?Key+Skills=C%2B%2B HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:49:23] "GET /data?Key+Skills=Java HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:49:23] "GET /data?Key+Skills=JavaScript HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:49:24] "GET /data?Key+Skills=Python HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:49:24] "GET /data?Key+Skills=Scala HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:49:24] "GET /data?Key+Skills=Oracle HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:49:24] "GET /data?Key+Skills=SQL+Server HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:49:24] "GET /data?Key+Skills=MySQL+Server HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:49:24] "GET /data?Key+Skills=PostgreSQL HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:49:24] "GET /data?Key+Skills=MongoDB HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:51:02] "GET /data?Key+Skills=C HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:51:02] "GET /data?Key+Skills=C%23 HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:51:02] "GET /data?Key+Skills=C%2B%2B HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:51:03] "GET /data?Key+Skills=Java HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:51:03] "GET /data?Key+Skills=JavaScript HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:51:03] "GET /data?Key+Skills=Python HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:51:03] "GET /data?Key+Skills=Scala HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:51:03] "GET /data?Key+Skills=Oracle HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:51:03] "GET /data?Key+Skills=SQL+Server HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:51:03] "GET /data?Key+Skills=MySQL+Server HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:51:03] "GET /data?Key+Skills=PostgreSQL HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:51:03] "GET /data?Key+Skills=MongoDB HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:55:38] "GET /data?Key+Skills=Python HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:55:38] "GET /data?Location=Washington+DC HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:55:38] "GET /data?Location=Los+Angeles HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:55:39] "GET /data?Location=New+York HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:55:39] "GET /data?Location=San+Francisco HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:55:39] "GET /data?Location=Washington+DC HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:55:39] "GET /data?Location=Seattle HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:55:39] "GET /data?Location=Austin HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:55:39] "GET /data?Location=Detroit HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:55:40] "GET /data?Key+Skills=C HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:55:40] "GET /data?Key+Skills=C%23 HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:55:40] "GET /data?Key+Skills=C%2B%2B HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:55:40] "GET /data?Key+Skills=Java HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:55:41] "GET /data?Key+Skills=JavaScript HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:55:41] "GET /data?Key+Skills=Python HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:55:41] "GET /data?Key+Skills=Scala HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:55:41] "GET /data?Key+Skills=Oracle HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:55:41] "GET /data?Key+Skills=SQL+Server HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:55:41] "GET /data?Key+Skills=MySQL+Server HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:55:41] "GET /data?Key+Skills=PostgreSQL HTTP/1.1" 200 -
127.0.0.1 - - [01/Jul/2022 01:55:41] "GET /data?Key+Skills=MongoDB HTTP/1.1" 200 -