Backend API dengan Python

1 May 2017 at 13:05 | Posted in Uncategorized | Leave a comment

Saat ini saya mulai belajar Python karena Tensorflow (dan beberapa deeplearning framework) menggunakan Python. Lalu kebetulan di kuliah mobile programming saya memberikan tugas besar yang memerlukan backend untuk komunikasi antar app jadi sekalian saja untuk latihan.

Pada tugas mobile programming tersebut mahasiswa diminta membuat app yang mirip Gojek atau Uber tetapi untuk pedagang keliling.  Intinya agar pembeli bisa melihat pedagang keliling yang lewat. Jadi idenya saya akan buat REST  API dengan Python yang dapat digunakan untuk menyimpan dan berbagi  lokasi user (baik pedagang maupun pembeli). Niat utamanya untuk mencoba, niat sampingannya supaya tidak ada mahasiswa yang protes “kok kuliah mobile programming diminta buat backend” hehe.

Untuk server, saya buat droplet DigitalOcean. Bisa saja sih menggunakan server ilkom UPI, cuma gara-gara bulan lalu kena hack jadi males (tepatnya takut utak-atik). Install apache2, mysql, python dan setup Python sebagai CGI tidak susah. Cuma ternyata perlu hati-hati untuk versi python: versi 2.7 dan 3. Saya menggunakan python3, tapi saat install library,  lupa malah menggunakan pip, bukan pip3.  Sempat bingung kok librarynya tidak dikenal padahal sudah diinstall.

Dari sisi bahasa, Python yang menggunakan indentasi, bukan “{” “}” sempat membuat saya salah meletakan code, solusinya saya tambahkan comment seperti “#end for” 🙂 Yang paling susah adalah masalah protokol  HTTP-nya sendiri.  Misal setelah  Content-Type: ..” wajib ada satu baris kosong.  Lalu penanganan error (error 400, 500 dst). Anehnya jarang yang membahas ini, mungkin karena mayoritas menggunakan library seperti Flask? 

Berikut code untuk menyimpan lokasi:

#!/usr/bin/python3

# contoh cara penggunaan:  http://xxxyyy.co.id/updatelokasi.py?tag=yw&userid=123&lat=2.343434&long=1.2423424

import cgi, cgitb
cgitb.enable()

import MySQLdb

form = cgi.FieldStorage()

tag = form.getvalue('tag')
userid = form.getvalue('userid')
lat = form.getvalue('lat')
long = form.getvalue('long')

if (tag==None) or (userid==None) or (lat==None) or (long==None) :
   print ("Status: 400 Bad Request")
   print ("Content-Type: application/json\n")
   print ('{"status":"error parameter tidak lengkap, paramter yg valid adalah userid,tag,lat dan long"}')
   print("")
else:
   tag = cgi.escape(tag)
   #print (tag+":"+userid+":"+lat+":"+long)
   db = MySQLdb.connect("localhost","mobprog","mobprogpass","mobprog" )
   cursor = db.cursor()
   sql ="insert into lokasiuser (tag, userid, latitude, longitude) values (%s,%s,%s,%s)";
   try:
      cursor.execute(sql,(tag,userid,lat,long))
      db.commit()
      print ("Status: 200 OK")
      print ("Content-Type: application/json\n")
      print ('{"status":"OK"}')
      print("")
   except:
      db.rollback()
      print ("Status: 500 Internal Error")
      print ("Content-Type: application/json\n")
      print ('{"status":"Error di server, kontak yudi@upi.edu"}')
      print("")

   db.close()

Sedangkan code untuk mengambil lokasi:

#!/usr/bin/python3

# contoh cara penggunaan: http://xxxyyy.co.id/getlokasi.py?tag=yw&userid=123

import cgi, cgitb
cgitb.enable()

import MySQLdb
import json

form = cgi.FieldStorage()

tag = form.getvalue('tag')
userid = form.getvalue('userid')

if (tag==None) or (userid==None) :
   print ("Status: 400 Bad Request")
   print ("Content-Type: application/json\n")
   print ('{"error":"parameter tidak lengkap, paramter yg valid adalah userid dan tag"}')
   print("")
else:
   tag = cgi.escape(tag)
   #print (tag+":"+userid+":"+lat+":"+long)
   db = MySQLdb.connect("localhost","mobprog","mobprogpass","mobprog" )
   cursor = db.cursor()
   sql =" select timestamp, latitude, longitude  from lokasiuser where userid = %s and tag = %s ORDER BY timestamp DESC LIMIT 1"
   try:
      cursor.execute(sql,(userid,tag))
      results = cursor.fetchall()
      #harusnya cuma satu rec
      isAda = False
      for row in results:
         timestamp  = None
         timestamp  = row[0]
         latitude   = row[1]
         longitude  = row[2]
         response={"timestamp":timestamp.isoformat(),"latitude":latitude,"longitude":longitude}
         body = json.dumps(response)
         print ("Status: 200 OK")
         print ("Content-Type: application/json\n")
         print(body)
         print("")
         isAda = True
       #endfor
      if not(isAda) :
         print ("Status: 400 Bad Request")
         print ("Content-Type: application/json\n")
         print ('{"error":"userid atau tag tidak ditemukan"}')
         print("")

   except:
      print ("Status: 500 Internal Error");
      print("Content-Type: text/html\n")
      print('{"error":"server error, kontak yudi@upi.edu"}')
      print("")
   db.close()

 

 

Advertisements

Leave a Comment »

RSS feed for comments on this post. TrackBack URI

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Create a free website or blog at WordPress.com.
Entries and comments feeds.

%d bloggers like this: