Python 3 - Pemrograman CGI

Common Gateway Interface, atau CGI, adalah seperangkat standar yang menentukan bagaimana informasi dipertukarkan antara server web dan skrip kustom. Spesifikasi CGI saat ini dikelola oleh NCSA.

Apakah CGI itu?

  • Common Gateway Interface, atau CGI, adalah standar untuk program gateway eksternal untuk berinteraksi dengan server informasi seperti server HTTP.

  • Versi saat ini adalah CGI / 1.1 dan CGI / 1.2 sedang dalam proses.

Menjelajah web

Untuk memahami konsep CGI, mari kita lihat apa yang terjadi ketika kita mengklik hyper link untuk menjelajahi halaman web atau URL tertentu.

  • Browser Anda menghubungi server web HTTP dan meminta URL, yaitu nama file.

  • Server Web mem-parsing URL dan mencari nama file. Jika menemukan file itu kemudian mengirimkannya kembali ke browser, jika tidak mengirimkan pesan kesalahan yang menunjukkan bahwa Anda meminta file yang salah.

  • Browser web menerima respons dari server web dan menampilkan file yang diterima atau pesan kesalahan.

Namun, dimungkinkan untuk mengatur server HTTP sehingga setiap kali file dalam direktori tertentu diminta, file tersebut tidak dikirim kembali; alih-alih dijalankan sebagai program, dan apa pun yang dihasilkan program itu dikirim kembali untuk ditampilkan oleh browser Anda. Fungsi ini disebut Common Gateway Interface atau CGI dan programnya disebut skrip CGI. Program CGI ini dapat berupa Skrip Python, Skrip PERL, Skrip Shell, program C atau C ++, dll.

Diagram Arsitektur CGI

Dukungan dan Konfigurasi Server Web

Sebelum Anda melanjutkan dengan Pemrograman CGI, pastikan bahwa Server Web Anda mendukung CGI dan dikonfigurasi untuk menangani Program CGI. Semua Program CGI yang akan dijalankan oleh server HTTP disimpan dalam direktori yang telah dikonfigurasi sebelumnya. Direktori ini disebut Direktori CGI dan menurut konvensi dinamakan / var / www / cgi-bin. Secara konvensi, file CGI memiliki ekstensi sebagai.cgi, tetapi Anda dapat menyimpan file Anda dengan ekstensi python .py demikian juga.

Secara default, server Linux dikonfigurasi untuk menjalankan hanya skrip di direktori cgi-bin di / var / www. Jika Anda ingin menentukan direktori lain untuk menjalankan skrip CGI Anda, beri komentar pada baris berikut di file httpd.conf -

<Directory "/var/www/cgi-bin">
   AllowOverride None
   Options ExecCGI
   Order allow,deny
   Allow from all
</Directory>

<Directory "/var/www/cgi-bin">
Options All
</Directory>

Di sini, kami berasumsi bahwa Anda memiliki Server Web dan berjalan dengan sukses dan Anda dapat menjalankan program CGI lainnya seperti Perl atau Shell, dll.

Program CGI Pertama

Berikut ini tautan sederhana, yang ditautkan ke skrip CGI yang disebut hello.py . File ini disimpan di direktori / var / www / cgi-bin dan memiliki konten berikut. Sebelum menjalankan program CGI Anda, pastikan Anda telah mengubah mode file menggunakanchmod 755 hello.py Perintah UNIX untuk membuat file dapat dieksekusi.

#!/usr/bin/python

print ("Content-type:text/html\r\n\r\n")
print ('<html>')
print ('<head>')
print ('<title>Hello Word - First CGI Program</title>')
print ('</head>')
print ('<body>')
print ('<h2>Hello Word! This is my first CGI program</h2>')
print ('</body>')
print ('</html>')

Note- Baris pertama dalam skrip harus berupa jalur ke Python yang dapat dieksekusi. Di Linux seharusnya #! / Usr / bin / python3

Masukkan URL berikut di browser Anda

http://localhost:8080/cgi-bin/hello.py

Hello Word! This is my first CGI program

Skrip hello.py ini adalah skrip Python sederhana, yang menulis outputnya pada file STDOUT, yaitu layar. Ada satu fitur penting dan tambahan yang tersedia yaitu baris pertama yang akan dicetakContent-type:text/html\r\n\r\n. Baris ini dikirim kembali ke browser dan menentukan tipe konten yang akan ditampilkan di layar browser.

Sekarang Anda pasti sudah mengerti konsep dasar CGI dan Anda bisa menulis banyak program CGI yang rumit menggunakan Python. Script ini dapat berinteraksi dengan sistem eksternal lain juga untuk bertukar informasi seperti RDBMS.

Header HTTP

Garis Content-type:text/html\r\n\r\nadalah bagian dari header HTTP yang dikirim ke browser untuk memahami konten. Semua header HTTP akan dalam bentuk berikut -

HTTP Field Name: Field Content

For Example
Content-type: text/html\r\n\r\n

Ada beberapa header HTTP penting lainnya, yang akan sering Anda gunakan dalam Pemrograman CGI.

Sr.No. Header & Deskripsi
1

Content-type:

String MIME yang menentukan format file yang dikembalikan. Contohnya adalah Content-type: text / html

2

Expires: Date

Tanggal informasi menjadi tidak valid. Ini digunakan oleh browser untuk memutuskan kapan halaman perlu di-refresh. String tanggal yang valid dalam format 01 Jan 1998 12:00:00 GMT.

3

Location: URL

URL yang dikembalikan, bukan URL yang diminta. Anda dapat menggunakan bidang ini untuk mengarahkan permintaan ke file apa pun.

4

Last-modified: Date

Tanggal modifikasi terakhir sumber daya.

5

Content-length: N

Panjang, dalam byte, dari data yang dikembalikan. Browser menggunakan nilai ini untuk melaporkan perkiraan waktu download suatu file.

6

Set-Cookie: String

Atur cookie melewati string

Variabel Lingkungan CGI

Semua program CGI memiliki akses ke variabel lingkungan berikut. Variabel ini memainkan peran penting saat menulis program CGI apa pun.

Sr.No. Nama & Deskripsi Variabel
1

CONTENT_TYPE

Jenis data konten. Digunakan saat klien mengirim konten terlampir ke server. Misalnya, unggah file.

2

CONTENT_LENGTH

Panjang informasi kueri. Ini hanya tersedia untuk permintaan POST.

3

HTTP_COOKIE

Mengembalikan cookie yang ditetapkan dalam bentuk pasangan kunci & nilai.

4

HTTP_USER_AGENT

Bidang header permintaan Agen-Pengguna berisi informasi tentang agen pengguna yang membuat permintaan. Itu adalah nama browser web.

5

PATH_INFO

Jalur untuk skrip CGI.

6

QUERY_STRING

Informasi yang dikodekan URL yang dikirim dengan permintaan metode GET.

7

REMOTE_ADDR

Alamat IP dari remote host yang membuat permintaan. Ini adalah logging berguna atau untuk otentikasi.

8

REMOTE_HOST

Nama host yang sepenuhnya memenuhi syarat yang membuat permintaan. Jika informasi ini tidak tersedia, maka REMOTE_ADDR dapat digunakan untuk mendapatkan alamat IR.

9

REQUEST_METHOD

Metode yang digunakan untuk membuat permintaan. Metode yang paling umum adalah GET dan POST.

10

SCRIPT_FILENAME

Jalur lengkap ke skrip CGI.

11

SCRIPT_NAME

Nama skrip CGI.

12

SERVER_NAME

Nama host atau Alamat IP server

13

SERVER_SOFTWARE

Nama dan versi perangkat lunak yang dijalankan server.

Berikut adalah program CGI kecil untuk mencantumkan semua variabel CGI. Klik link ini untuk melihat hasil Get Environment

#!/usr/bin/python

import os

print ("Content-type: text/html\r\n\r\n");
print ("<font size=+1>Environment</font><\br>");
for param in os.environ.keys():
   print ("<b>%20s</b>: %s<\br>" % (param, os.environ[param]))

GET dan Metode POST

Anda pasti pernah menjumpai banyak situasi ketika Anda perlu meneruskan beberapa informasi dari browser Anda ke server web dan akhirnya ke Program CGI Anda. Paling sering, browser menggunakan dua metode untuk meneruskan informasi ini ke server web. Metode ini adalah Metode GET dan Metode POST.

Meneruskan Informasi menggunakan metode GET

Metode GET mengirimkan informasi pengguna yang dikodekan yang ditambahkan ke permintaan halaman. Halaman dan informasi yang disandikan dipisahkan oleh? karakter sebagai berikut -

http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2
  • Metode GET adalah metode default untuk meneruskan informasi dari browser ke server web dan menghasilkan string panjang yang muncul di kotak Lokasi: browser Anda.

  • Jangan pernah menggunakan metode GET jika Anda memiliki kata sandi atau informasi sensitif lainnya untuk diteruskan ke server.

  • Metode GET memiliki batasan ukuran: hanya 1024 karakter yang dapat dikirim dalam string permintaan.

  • Metode GET mengirimkan informasi menggunakan header QUERY_STRING dan akan dapat diakses di Program CGI Anda melalui variabel lingkungan QUERY_STRING.

Anda dapat menyampaikan informasi hanya dengan menggabungkan pasangan kunci dan nilai bersama dengan URL apa pun atau Anda dapat menggunakan tag <FORM> HTML untuk menyampaikan informasi menggunakan metode GET.

Contoh URL Sederhana: Dapatkan Metode

Berikut adalah URL sederhana, yang meneruskan dua nilai ke program hello_get.py menggunakan metode GET.

/cgi-bin/hello_get.py?first_name=ZARA&last_name=ALI

Dibawah ini hello_get.pyscript untuk menangani input yang diberikan oleh web browser. Kami akan menggunakancgi modul, yang membuatnya sangat mudah untuk mengakses informasi yang diteruskan -

#!/usr/bin/python

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
first_name = form.getvalue('first_name')
last_name  = form.getvalue('last_name')

print ("Content-type:text/html\r\n\r\n")
print ("<html>")
print ("<head>")
print ("<title>Hello - Second CGI Program</title>")
print ("</head>")
print ("<body>")
print ("<h2>Hello %s %s</h2>" % (first_name, last_name))
print ("</body>")
print ("</html>")

Ini akan menghasilkan hasil sebagai berikut -

Hello ZARA ALI

Contoh FORMULIR Sederhana: Metode GET

Contoh ini meneruskan dua nilai menggunakan HTML FORM dan tombol kirim. Kami menggunakan skrip CGI yang sama hello_get.py untuk menangani masukan ini.

<form action = "/cgi-bin/hello_get.py" method = "get">
   First Name: <input type = "text" name = "first_name">  <br />

   Last Name: <input type = "text" name = "last_name" />
   <input type = "submit" value = "Submit" />
</form>

Berikut adalah output sebenarnya dari form di atas, Anda memasukkan First Name dan Last Name lalu klik tombol submit untuk melihat hasilnya.

Meneruskan Informasi Menggunakan Metode POST

Metode yang umumnya lebih dapat diandalkan untuk menyampaikan informasi ke program CGI adalah metode POST. Ini memaketkan informasi dengan cara yang persis sama seperti metode GET, tetapi alih-alih mengirimkannya sebagai string teks setelah? di URL itu mengirimkannya sebagai pesan terpisah. Pesan ini masuk ke skrip CGI dalam bentuk input standar.

Di bawah ini adalah script hello_get.py yang sama yang menangani metode GET dan POST.

#!/usr/bin/python

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
first_name = form.getvalue('first_name')
last_name  = form.getvalue('last_name')

print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Hello - Second CGI Program</title>"
print "</head>"
print "<body>"
print "<h2>Hello %s %s</h2>" % (first_name, last_name)
print "</body>"
print "</html>"

Mari kita ambil contoh yang sama seperti di atas yang melewatkan dua nilai menggunakan HTML FORM dan tombol submit. Kami menggunakan skrip CGI yang sama hello_get.py untuk menangani masukan ini.

<form action = "/cgi-bin/hello_get.py" method = "post">
First Name: <input type = "text" name = "first_name"><br />
Last Name: <input type = "text" name = "last_name" />

<input type = "submit" value = "Submit" />
</form>

Berikut adalah keluaran aktual dari formulir di atas. Anda memasukkan Nama Depan dan Belakang dan kemudian klik tombol kirim untuk melihat hasilnya.

Meneruskan Data Kotak Centang ke Program CGI

Kotak centang digunakan ketika lebih dari satu opsi diperlukan untuk dipilih.

Berikut adalah contoh kode HTML untuk formulir dengan dua kotak centang -

<form action = "/cgi-bin/checkbox.cgi" method = "POST" target = "_blank">
   <input type = "checkbox" name = "maths" value = "on" /> Maths
   <input type = "checkbox" name = "physics" value = "on" /> Physics
   <input type = "submit" value = "Select Subject" />
</form>

Hasil dari kode ini adalah bentuk berikut -

Di bawah ini adalah skrip checkbox.cgi untuk menangani masukan yang diberikan oleh browser web untuk tombol kotak centang.

#!/usr/bin/python

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
if form.getvalue('maths'):
   math_flag = "ON"
else:
   math_flag = "OFF"

if form.getvalue('physics'):
   physics_flag = "ON"
else:
   physics_flag = "OFF"

print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Checkbox - Third CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> CheckBox Maths is : %s</h2>" % math_flag
print "<h2> CheckBox Physics is : %s</h2>" % physics_flag
print "</body>"
print "</html>"

Meneruskan Data Tombol Radio ke Program CGI

Tombol Radio digunakan ketika hanya satu opsi yang diperlukan untuk dipilih.

Berikut adalah contoh kode HTML untuk formulir dengan dua tombol radio -

<form action = "/cgi-bin/radiobutton.py" method = "post" target = "_blank">
   <input type = "radio" name = "subject" value = "maths" /> Maths
   <input type = "radio" name = "subject" value = "physics" /> Physics
   <input type = "submit" value = "Select Subject" />
</form>

Hasil dari kode ini adalah bentuk berikut -

Di bawah ini adalah script radiobutton.py untuk menangani masukan yang diberikan oleh browser web untuk tombol radio -

#!/usr/bin/python

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
if form.getvalue('subject'):
   subject = form.getvalue('subject')
else:
   subject = "Not set"

print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Radio - Fourth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Selected Subject is %s</h2>" % subject
print "</body>"
print "</html>"

Meneruskan Data Area Teks ke Program CGI

Elemen TEXTAREA digunakan ketika teks multiline harus diteruskan ke Program CGI.

Berikut adalah contoh kode HTML untuk formulir dengan kotak TEXTAREA -

<form action = "/cgi-bin/textarea.py" method = "post" target = "_blank">
   <textarea name = "textcontent" cols = "40" rows = "4">
      Type your text here...
   </textarea>
   <input type = "submit" value = "Submit" />
</form>

Hasil dari kode ini adalah bentuk berikut -

Di bawah ini adalah script textarea.cgi untuk menangani input yang diberikan oleh web browser -

#!/usr/bin/python

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
if form.getvalue('textcontent'):
   text_content = form.getvalue('textcontent')
else:
   text_content = "Not entered"

print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>";
print "<title>Text Area - Fifth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Entered Text Content is %s</h2>" % text_content
print "</body>"

Meneruskan Data Drop Down Box ke Program CGI

Drop Down Box digunakan ketika kami memiliki banyak opsi yang tersedia tetapi hanya satu atau dua yang akan dipilih.

Berikut adalah contoh kode HTML untuk formulir dengan satu kotak drop-down -

<form action = "/cgi-bin/dropdown.py" method = "post" target = "_blank">
   <select name = "dropdown">
      <option value = "Maths" selected>Maths</option>
      <option value = "Physics">Physics</option>
   </select>
   <input type = "submit" value = "Submit"/>
</form>

Hasil dari kode ini adalah bentuk berikut -

Di bawah ini adalah script dropdown.py untuk menangani input yang diberikan oleh web browser.

#!/usr/bin/python

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

# Get data from fields
if form.getvalue('dropdown'):
   subject = form.getvalue('dropdown')
else:
   subject = "Not entered"

print "Content-type:text/html\r\n\r\n"
print "<html>"
print "<head>"
print "<title>Dropdown Box - Sixth CGI Program</title>"
print "</head>"
print "<body>"
print "<h2> Selected Subject is %s</h2>" % subject
print "</body>"
print "</html>"

Menggunakan Cookies di CGI

Protokol HTTP adalah protokol tanpa negara. Untuk situs web komersial, diperlukan untuk menjaga informasi sesi di antara halaman yang berbeda. Misalnya, satu pendaftaran pengguna berakhir setelah menyelesaikan banyak halaman. Bagaimana cara menjaga informasi sesi pengguna di semua halaman web?

Dalam banyak situasi, menggunakan cookie adalah metode paling efisien untuk mengingat dan melacak preferensi, pembelian, komisi, dan informasi lain yang diperlukan untuk pengalaman pengunjung atau statistik situs yang lebih baik.

Bagaimana itu bekerja?

Server Anda mengirimkan beberapa data ke browser pengunjung dalam bentuk cookie. Browser mungkin menerima cookie. Jika ya, itu disimpan sebagai catatan teks biasa di hard drive pengunjung. Sekarang, saat pengunjung tiba di halaman lain di situs Anda, cookie tersedia untuk diambil. Setelah diambil, server Anda tahu / mengingat apa yang disimpan.

Cookie adalah rekaman data teks biasa dari 5 bidang dengan panjang variabel -

  • Expires- Tanggal cookie akan kedaluwarsa. Jika ini kosong, cookie akan kedaluwarsa saat pengunjung keluar dari browser.

  • Domain - Nama domain situs Anda.

  • Path- Jalur ke direktori atau halaman web yang menyetel cookie. Ini mungkin kosong jika Anda ingin mengambil cookie dari direktori atau halaman manapun.

  • Secure- Jika bidang ini berisi kata "aman", cookie hanya dapat diambil dengan server aman. Jika bidang ini kosong, tidak ada batasan seperti itu.

  • Name = Value - Cookie disetel dan diambil dalam bentuk pasangan kunci dan nilai.

Menyiapkan Cookies

Sangat mudah untuk mengirim cookie ke browser. Cookie ini dikirim bersama dengan HTTP Header sebelum ke bidang Jenis konten. Dengan asumsi Anda ingin menyetel UserID dan Kata Sandi sebagai cookie. Pengaturan cookie dilakukan sebagai berikut -

#!/usr/bin/python
print "Set-Cookie:UserID = XYZ;\r\n"
print "Set-Cookie:Password = XYZ123;\r\n"
print "Set-Cookie:Expires = Tuesday, 31-Dec-2007 23:12:40 GMT;\r\n"
print "Set-Cookie:Domain = www.tutorialspoint.com;\r\n"
print "Set-Cookie:Path = /perl;\n"
print "Content-type:text/html\r\n\r\n"
...........Rest of the HTML Content....

Dari contoh ini, Anda pasti sudah memahami cara menyetel cookie. Kita gunakanSet-Cookie Header HTTP untuk menyetel cookie.

Ini opsional untuk menyetel atribut cookie seperti Kedaluwarsa, Domain, dan Jalur. Perlu dicatat bahwa cookie diatur sebelum mengirim garis ajaib"Content-type:text/html\r\n\r\n.

Mengambil Cookies

Sangat mudah untuk mengambil semua cookie yang disetel. Cookie disimpan dalam variabel lingkungan CGI HTTP_COOKIE dan mereka akan memiliki bentuk berikut -

key1 = value1;key2 = value2;key3 = value3....

Berikut adalah contoh cara mengambil cookie.

#!/usr/bin/python

# Import modules for CGI handling 
from os import environ
import cgi, cgitb

if environ.has_key('HTTP_COOKIE'):
   for cookie in map(strip, split(environ['HTTP_COOKIE'], ';')):
      (key, value ) = split(cookie, '=');
      if key == "UserID":
         user_id = value

      if key == "Password":
         password = value

print "User ID  = %s" % user_id
print "Password = %s" % password

Ini menghasilkan hasil berikut untuk cookie yang disetel oleh skrip di atas -

User ID = XYZ
Password = XYZ123

Contoh Unggahan File

Untuk mengupload file, formulir HTML harus memiliki atribut enctype yang disetel ke multipart/form-data. Tag masukan dengan jenis file membuat tombol "Jelajahi".

<html>
   <body>
      <form enctype = "multipart/form-data" action = "save_file.py" method = "post">
      <p>File: <input type = "file" name = "filename" /></p>
      <p><input type = "submit" value = "Upload" /></p>
      </form>
   </body>
</html>

Hasil dari kode ini adalah bentuk berikut -

Contoh di atas telah dinonaktifkan dengan sengaja untuk menyimpan orang yang mengupload file di server kami, tetapi Anda dapat mencoba kode di atas dengan server Anda.

Ini skripnya save_file.py untuk menangani unggahan file -

#!/usr/bin/python

import cgi, os
import cgitb; cgitb.enable()

form = cgi.FieldStorage()

# Get filename here.
fileitem = form['filename']

# Test if the file was uploaded
if fileitem.filename:
   # strip leading path from file name to avoid 
   # directory traversal attacks
   fn = os.path.basename(fileitem.filename)
   open('/tmp/' + fn, 'wb').write(fileitem.file.read())

   message = 'The file "' + fn + '" was uploaded successfully'
   
else:
   message = 'No file was uploaded'
   
print """\
Content-Type: text/html\n
<html>
   <body>
      <p>%s</p>
   </body>
</html>
""" % (message,)

Jika Anda menjalankan skrip di atas pada Unix / Linux, maka Anda perlu berhati-hati saat mengganti pemisah file sebagai berikut, jika tidak, pada mesin windows Anda di atas pernyataan open () akan berfungsi dengan baik.

fn = os.path.basename(fileitem.filename.replace("\\", "/" ))

Bagaimana Cara Meningkatkan Kotak Dialog "Unduh File"?

Kadang-kadang, Anda ingin memberikan opsi di mana pengguna dapat mengklik tautan dan itu akan memunculkan kotak dialog "Unduh File" kepada pengguna alih-alih menampilkan konten yang sebenarnya. Ini sangat mudah dan dapat dicapai melalui header HTTP. Header HTTP ini berbeda dengan header yang disebutkan di bagian sebelumnya.

Misalnya, jika Anda ingin membuat file FileName file dapat diunduh dari tautan yang diberikan, maka sintaksnya adalah sebagai berikut -

#!/usr/bin/python

# HTTP Header
print "Content-Type:application/octet-stream; name = \"FileName\"\r\n";
print "Content-Disposition: attachment; filename = \"FileName\"\r\n\n";

# Actual File Content will go here.
fo = open("foo.txt", "rb")

str = fo.read();
print str

# Close opend file
fo.close()

Semoga Anda menikmati tutorial ini. Jika ya, kirimkan tanggapan Anda di: Hubungi Kami