Latest web development tutorials

pemrograman Python3 CGI

Apa CGI

CGI saat ini dikelola oleh NCSA, NCSA CGI didefinisikan sebagai berikut:

CGI (Common Gateway Interface), Common Gateway Interface, yang merupakan program yang berjalan di server, seperti: HTTP server, antarmuka klien menyediakan halaman HTML yang sama.


web browsing

Untuk lebih memahami bagaimana CGI bekerja, kita bisa klik pada link pada halaman web atau URL dari proses:

  • 1, menggunakan browser untuk mengakses URL dan terhubung ke web server HTTP.
  • 2, Web server menerima pesan permintaan akan diurai URL dan mencari file diakses pada server jika ada, jika ada untuk mengembalikan isi file, jika tidak maka kembali pesan kesalahan.
  • 3, browser menerima informasi dari server dan menampilkan diterima file atau pesan kesalahan.

program CGI bisa menjadi script Python, naskah PERL, naskah SHELL, C atau C ++ program.


CGI Bagan

cgiarch


konfigurasi server web dan dukungan

Sebelum Anda melakukan pemrograman CGI, pastikan bahwa server Web Anda telah dikonfigurasi untuk mendukung CGI dan CGI handler.

Apache mendukung konfigurasi CGI:

Mengatur direktori CGI:

ScriptAlias /cgi-bin/ /var/www/cgi-bin/

Semua HTTP server untuk mengeksekusi program CGI disimpan dalam direktori pra-dikonfigurasi. Direktori ini disebut direktori CGI, dan dengan konvensi, itu bernama / var / www / direktori cgi-bin.

File CGI ekstensi cgi, python juga dapat menggunakan ekstensi py.

Secara default, Linux server konfigurasi menjalankan direktori cgi-bin adalah / var / www.

Jika Anda ingin menentukan direktori yang berbeda untuk menjalankan script CGI, Anda dapat memodifikasi file konfigurasi httpd.conf sebagai berikut:

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

Tambahkan py akhiran AddHandler, sehingga kita dapat mengakses akhir py file script python:

AddHandler cgi-script .cgi .pl .py

Program CGI pertama

Kami menggunakan Python untuk membuat program CGI pertama disebut hello.py, file tersebut berada di / var / www / cgi-bin direktori, sebagai berikut:

#!/usr/bin/python3

print ("Content-type:text/html")
print ()                             # 空行,告诉服务器结束头部
print ('<html>')
print ('<head>')
print ('<meta charset="utf-8">')
print ('<title>Hello Word - 我的第一个 CGI 程序!</title>')
print ('</head>')
print ('<body>')
print ('<h2>Hello Word! 我是来自本教程的第一CGI程序</h2>')
print ('</body>')
print ('</html>')

Setelah Anda menyimpan hello.py modifikasi file, mengubah hak akses file 755:

chmod 755 hello.py 

Program di atas ditampilkan dalam browser untuk mengakses hasil adalah sebagai berikut:

hello.py script ini adalah script Python sederhana, naskah jalur output pertama "Content-type: text / html" untuk mengirim ke jenis browser dan memberitahu browser untuk menampilkan konten sebagai "text / html".

hasil cetak dengan baris kosong digunakan untuk memberitahu akhir server dari informasi header.


HTTP header

isi file hello.py di: bagian dari header HTTP adalah "Content-type text / html", itu akan dikirim ke jenis konten browser menceritakan file browser.

Format Header HTTP adalah sebagai berikut:

HTTP 字段名: 字段内容

Sebagai contoh:

Content-type: text/html

Tabel berikut menjelaskan informasi dalam program CGI HTTP header yang sering digunakan:

kepala deskripsi
Konten-type: entitas MIME sesuai dengan permintaan informasi. Sebagai contoh: Content-type: text / html
Kedaluwarsa: Tanggal Tanggal respon dan waktu berakhir
Lokasi: URL Untuk mengarahkan penerima untuk permintaan URL non-lokasi untuk menyelesaikan permintaan atau identifikasi sumber daya baru
Terakhir diubah: Tanggal sumber daya yang diminta terakhir diubah
Konten-length: N permintaan konten-Panjang
Set-Cookie: String pengaturan http Cookie

Variabel CGI Lingkungan

Semua program CGI telah menerima variabel lingkungan berikut, yang memainkan peran penting dalam program CGI:

nama variabel deskripsi
CONTENT_TYPE Nilai ini menunjukkan bahwa variabel lingkungan dengan jenis MIME transfer informasi. Saat ini, variabel lingkungan umumnya CONTENT_TYPE: application / x-www-form-urlencoded, ia mengatakan bahwa data dari bentuk HTML.
CONTENT_LENGTH Jika modus transfer server dan program CGI informasi adalah POST, bahkan jika variabel lingkungan STDIN masukan jumlah byte yang dapat membaca data yang valid dari standar. variabel lingkungan ini ketika membaca data input harus digunakan.
HTTP_COOKIE konten COOKIE dalam klien.
HTTP_USER_AGENT Memberikan informasi termasuk nomor versi dari browser klien atau data kepemilikan lainnya.
PATH_INFO Nilai variabel lingkungan ini menunjukkan nama program CGI segera setelah informasi jalur tambahan. Ini sering muncul sebagai program argumen CGI.
QUERY_STRING Jika modus transfer server dan program CGI informasi adalah informasi GET, nilai variabel lingkungan ini bahkan jika berlalu. Informasi ini diikuti dengan nama program CGI, baik di tengah-tengah dengan tanda tanya '?' Separator.
REMOTE_ADDR Nilai variabel lingkungan ini adalah alamat IP dari klien mengirimkan permintaan, misalnya, 192.168.1.67 atas. Nilai ini selalu hadir. Dan itu adalah kebutuhan untuk menyediakan Web klien untuk identifier unik server Web dapat digunakan dalam program-program CGI untuk membedakan antara klien Web yang berbeda.
REMOTE_HOST Nilai variabel lingkungan ini berisi nama host dari klien meminta CGI. Jika tidak Anda ingin memeriksa, Anda tidak perlu mendefinisikan variabel lingkungan ini.
REQUEST_METHOD Ini menyediakan metode yang disebut skrip. Untuk HTTP script / 1.0 protokol hanya GET dan POST bermakna.
SCRIPT_FILENAME Path lengkap ke skrip CGI
SCRIPT_NAME Nama script CGI
SERVER_NAME Ini adalah nama host, alias, atau alamat IP dari server WEB Anda.
SERVER_SOFTWARE Nilai variabel lingkungan ini berisi panggilan CGI nama program dan versi jumlah server HTTP. Misalnya, nilai di atas Apache / 2.2.14 (Unix)

Berikut ini adalah script CGI variabel lingkungan keluaran CGI sederhana:

#!/usr/bin/python3

import os

print ("Content-type: text/html")
print ()
print ("<meta charset=\"utf-8\">")
print ("<b>环境变量</b><br>")
print ("<ul>")
for key in os.environ.keys():
    print ("<li><span style='color:green'>%30s </span> : %s </li>" % (key,os.environ[key]))
print ("</ul>")

Simpan di atas poin test.py, dan mengubah hak akses file 755, hasil eksekusi adalah sebagai berikut:


GET dan metode POST

Browser klien ke server untuk menyampaikan informasi dalam dua cara, yang keduanya metode adalah GET dan metode POST.

Gunakan metode GET mentransfer data

GET metode untuk mengirimkan informasi pengguna dikodekan ke server, data informasi yang terkandung dalam URL dari permintaan halaman ke nomor dibagi sebagai berikut "?":

http://www.test.com/cgi-bin/hello.py?key1=value1&key2=value2
GET permintaan tentang beberapa komentar lain:
  • GET permintaan dapat di-cache
  • permintaan GET tetap dalam riwayat browser
  • GET permintaan dapat di-bookmark
  • GET permintaan tidak harus digunakan ketika berhadapan dengan data sensitif
  • GET permintaan memiliki batasan panjang
  • GET permintaan hanya harus digunakan untuk mengambil data

Contoh url sederhana: metode GET

Berikut ini adalah URL sederhana, menggunakan metode GET untuk mengirimkan dua parameter untuk hello_get.py Program:

/cgi-bin/test.py?name=本教程&url=http://www.w3big.com

Sebuah file kode hello_get.py:

#!/usr/bin/python3

# CGI处理模块
import cgi, cgitb 

# 创建 FieldStorage 的实例化
form = cgi.FieldStorage() 

# 获取数据
site_name = form.getvalue('name')
site_url  = form.getvalue('url')

print ("Content-type:text/html")
print ()
print ("<html>")
print ("<head>")
print ("<meta charset=\"utf-8\">")
print ("<title>本教程 CGI 测试实例</title>")
print ("</head>")
print ("<body>")
print ("<h2>%s官网:%s</h2>" % (site_name, site_url))
print ("</body>")
print ("</html>")

Setelah Anda menyimpan hello_get.py modifikasi file, mengubah hak akses file 755:

chmod 755 hello_get.py 

Browser permintaan keluaran:

Contoh bentuk sederhana: metode GET

Berikut ini adalah dua mengirim data ke server menggunakan metode GET melalui form HTML, disampaikan sama berkas hello_get.py script Server, kode hello_get.html adalah sebagai berikut:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/hello_get.py" method="get">
站点名称: <input type="text" name="name">  <br />

站点 URL: <input type="text" name="url" />
<input type="submit" value="提交" />
</form>
</body>
</html>

Secara default, direktori cgi-bin hanya dapat menyimpan file script, kita akan berada di bawah direktori tes, memodifikasi file permissions hello_get.html disimpan sebagai 755:

chmod 755 hello_get.html

Gif presentasi adalah sebagai berikut:

Menggunakan metode POST untuk melewatkan data

Menggunakan metode POST untuk melewatkan data ke server yang lebih aman dan dapat diandalkan, karena beberapa informasi sensitif seperti password pengguna harus menggunakan POST untuk mentransfer data.

Berikut ini adalah juga hello_get.py, juga dapat menangani data formulir POST disampaikan oleh browser:

#!/usr/bin/python3

# CGI处理模块
import cgi, cgitb 

# 创建 FieldStorage 的实例化
form = cgi.FieldStorage() 

# 获取数据
site_name = form.getvalue('name')
site_url  = form.getvalue('url')

print ("Content-type:text/html")
print ()
print ("<html>")
print ("<head>")
print ("<meta charset=\"utf-8\">")
print ("<title>本教程 CGI 测试实例</title>")
print ("</head>")
print ("<body>")
print ("<h2>%s官网:%s</h2>" % (site_name, site_url))
print ("</body>")
print ("</html>")

Berikut ini adalah formulir untuk mengirimkan data ke hello_get.py server script dengan metode POST (metode = "post"):

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/hello_get.py" method="post">
站点名称: <input type="text" name="name">  <br />

站点 URL: <input type="text" name="url" />
<input type="submit" value="提交" />
</form>
</body>
</html>
</form>

Gif presentasi adalah sebagai berikut:

program CGI untuk melewatkan data melalui kotak centang

checkbox digunakan untuk mengirimkan satu atau lebih data pilihan, kode HTML adalah sebagai berikut:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/checkbox.py" method="POST" target="_blank">
<input type="checkbox" name="w3big" value="on" /> 本教程
<input type="checkbox" name="google" value="on" /> Google
<input type="submit" value="选择站点" />
</form>
</body>
</html>

Sebuah file kode checkbox.py:

#!/usr/bin/python3

# 引入 CGI 处理模块 
import cgi, cgitb 

# 创建 FieldStorage的实例 
form = cgi.FieldStorage() 

# 接收字段数据
if form.getvalue('google'):
   google_flag = "是"
else:
   google_flag = "否"

if form.getvalue('w3big'):
   w3big_flag = "是"
else:
   w3big_flag = "否"

print ("Content-type:text/html")
print ()
print ("<html>")
print ("<head>")
print ("<meta charset=\"utf-8\">")
print ("<title>本教程 CGI 测试实例</title>")
print ("</head>")
print ("<body>")
print ("<h2> 本教程是否选择了 : %s</h2>" % w3big_flag)
print ("<h2> Google 是否选择了 : %s</h2>" % google_flag)
print ("</body>")
print ("</html>")

Memodifikasi izin checkbox.py:

chmod 755 checkbox.py

Browser Access Gif grafik presentasi:

Radio transfer data via program CGI

Radio hanya mentransfer data ke server, kode HTML adalah sebagai berikut:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/radiobutton.py" method="post" target="_blank">
<input type="radio" name="site" value="w3big" /> 本教程
<input type="radio" name="site" value="google" /> Google
<input type="submit" value="提交" />
</form>
</body>
</html>

kode script radiobutton.py adalah sebagai berikut:

#!/usr/bin/python3

# 引入 CGI 处理模块 
import cgi, cgitb 

# 创建 FieldStorage的实例 
form = cgi.FieldStorage() 

# 接收字段数据
if form.getvalue('site'):
   site = form.getvalue('site')
else:
   site = "提交数据为空"

print ("Content-type:text/html")
print ()
print ("<html>")
print ("<head>")
print ("<meta charset=\"utf-8\">")
print ("<title>本教程 CGI 测试实例</title>")
print ("</head>")
print ("<body>")
print ("<h2> 选中的网站是 %s</h2>" % site)
print ("</body>")
print ("</html>")

Memodifikasi izin radiobutton.py:

chmod 755 radiobutton.py

Browser Access Gif grafik presentasi:

transfer data textarea melalui program CGI

Textarea lulus beberapa baris data ke server, kode HTML adalah sebagai berikut:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/textarea.py" method="post" target="_blank">
<textarea name="textcontent" cols="40" rows="4">
在这里输入内容...
</textarea>
<input type="submit" value="提交" />
</form>
</body>
</html>

textarea.py kode script adalah sebagai berikut:

#!/usr/bin/python3

# 引入 CGI 处理模块 
import cgi, cgitb 

# 创建 FieldStorage的实例 
form = cgi.FieldStorage() 

# 接收字段数据
if form.getvalue('textcontent'):
   text_content = form.getvalue('textcontent')
else:
   text_content = "没有内容"

print ("Content-type:text/html")
print ()
print ("<html>")
print ("<head>")
print ("<meta charset=\"utf-8\">")
print ("<title>本教程 CGI 测试实例</title>")
print ("</head>")
print ("<body>")
print ("<h2> 输入的内容是:%s</h2>" % text_content)
print ("</body>")
print ("</html>")

Memodifikasi izin textarea.py:

chmod 755 textarea.py

Browser Access Gif grafik presentasi:

Drop-down data yang lulus melalui program CGI.

HTML kode kotak drop-down sebagai berikut:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<form action="/cgi-bin/dropdown.py" method="post" target="_blank">
<select name="dropdown">
<option value="w3big" selected>本教程</option>
<option value="google">Google</option>
</select>
<input type="submit" value="提交"/>
</form>
</body>
</html>

kode script dropdown.py sebagai berikut:

#!/usr/bin/python3

# 引入 CGI 处理模块 
import cgi, cgitb 

# 创建 FieldStorage的实例 
form = cgi.FieldStorage() 

# 接收字段数据
if form.getvalue('dropdown'):
   dropdown_value = form.getvalue('dropdown')
else:
   dropdown_value = "没有内容"

print ("Content-type:text/html")
print ()
print ("<html>")
print ("<head>")
print ("<meta charset=\"utf-8\">")
print ("<title>本教程 CGI 测试实例</title>")
print ("</head>")
print ("<body>")
print ("<h2> 选中的选项是:%s</h2>" % dropdown_value)
print ("</body>")
print ("</html>")

Memodifikasi izin dropdown.py:

chmod 755 dropdown.py

Browser Access Gif grafik presentasi:


CGI digunakan Cookie

protokol http dalam kelemahan besar yang salah untuk menilai identitas pengguna, yang memberikan programmer banyak ketidaknyamanan, tetapi tampaknya fungsi cookie yang dibuat untuk kekurangan ini.

cookie yang mengakses script sedangkan pelanggan melalui browser pelanggan pada hard disk klien untuk menulis catatan data, mengambil data ketika pelanggan mengunjungi script berikutnya, sehingga mencapai fungsi menentukan identitas, kue yang biasa digunakan dalam memverifikasi identitas.

sintaks Cookie

Cookie http dikirim melalui header http untuk mencapai, ia harus mentransfer file, sintaks sundulan set-Cookie adalah sebagai berikut:

Set-cookie:name=name;expires=date;path=path;domain=domain;secure 
  • name = Nama: untuk menetapkan nilai dari cookie (nama tidak dapat digunakan ";" dan "," nomor), ketika ada beberapa nilai nama ";" untuk memisahkan, misalnya: name1 = name1; name2 = name2 ; name3 = name3.
  • berakhir = date: Cookie tanggal kedaluwarsa dalam format: berakhir = "Wdy, DD- Mon-YYYY HH: MM: SS"
  • path = path: jalur mengatur dukungan cookie, jika jalan adalah jalan, cookie untuk semua file dan subdirektori dari direktori entri berlaku, misalnya: path = "/ cgi-bin /", jika jalan adalah sebuah file, kue Hal ini mengacu pada berlakunya file ini, misalnya: path = "/ cgi-bin / cookie.cgi".
  • domain = domain: nama domain cookie berlaku, misalnya: domain = "www.w3big.com"
  • mengamankan: Jika flag ini diberikan, bahwa cookie hanya dapat ditularkan melalui protokol SSL https Server.
  • Cookie diterima dengan menetapkan variabel lingkungan HTTP_COOKIE dicapai, program CGI dapat memperoleh informasi dengan mengambil variabel cookie.

pengaturan Cookie

pengaturan cookie sangat sederhana, kue akan dikirim secara terpisah di http header. Contoh berikut menetapkan nama dan berakhir di cookie:

#!/usr/bin/python3
# 
print ('Content-Type: text/html')
print ('Set-Cookie: name="本教程";expires=Wed, 28 Aug 2016 18:30:00 GMT')
print ()
print ("""
<html>
  <head>
    <meta charset="utf-8">
    <title>本教程(w3big.com)</title>
  </head>
    <body>
        <h1>Cookie set OK!</h1>
    </body>
</html>
""")

Simpan kode di atas untuk cookie_set.py, dan mengubah izin cookie_set.py:

chmod 755 cookie_set.py

Contoh di atas menggunakan header Set-Cookie untuk mengatur informasi Cookie, opsi mengatur Cookie atribut lainnya, seperti berakhirnya waktu Kedaluwarsa, domain Domain, Jalur jalan. Informasi ini disediakan: Sebelum "Content-type text / html".


Mengambil Informasi Cookie

Cookie halaman pencarian informasi sangat sederhana, dalam CGI variabel lingkungan HTTP_COOKIE, format penyimpanan adalah sebagai berikut informasi Cookie disimpan:

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

Berikut adalah program CGI sederhana untuk mengambil informasi cookie:

#!/usr/bin/python3

# 导入模块
import os
import Cookie

print ("Content-type: text/html")
print ()

print ("""
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
<h1>读取cookie信息</h1>
""")

if 'HTTP_COOKIE' in os.environ:
    cookie_string=os.environ.get('HTTP_COOKIE')
    c=Cookie.SimpleCookie()
    c.load(cookie_string)

    try:
        data=c['name'].value
        print ("cookie data: "+data+"<br>")
    except KeyError:
        print ("cookie 没有设置或者已过去<br>")
print ("""
</body>
</html>
""")

Simpan kode di atas untuk cookie_get.py, dan mengubah izin cookie_get.py:

chmod 755 cookie_get.py

Lebih warna pengaturan Gif cookie sebagai berikut:

Contoh upload file

pengaturan file HTML untuk meng-upload perlu mengatur atribut enctype untuk multipart / form-data, kode sebagai berikut:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
 <form enctype="multipart/form-data" 
                     action="/cgi-bin/save_file.py" method="post">
   <p>选中文件: <input type="file" name="filename" /></p>
   <p><input type="submit" value="上传" /></p>
   </form>
</body>
</html>

Kode save_file.py file script adalah sebagai berikut:

#!/usr/bin/python3

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

form = cgi.FieldStorage()

# 获取文件名
fileitem = form['filename']

# 检测文件是否上传
if fileitem.filename:
   # 设置文件路径 
   fn = os.path.basename(fileitem.filename)
   open('/tmp/' + fn, 'wb').write(fileitem.file.read())

   message = '文件 "' + fn + '" 上传成功'
   
else:
   message = '文件没有上传'
   
print ("""\
Content-Type: text/html\n
<html>
<head>
<meta charset="utf-8">
<title>本教程(w3big.com)</title>
</head>
<body>
   <p>%s</p>
</body>
</html>
""" % (message,))

Simpan kode di atas untuk save_file.py, dan mengubah izin save_file.py:

chmod 755 save_file.py

Lebih warna pengaturan Gif cookie sebagai berikut:

Jika Anda menggunakan Unix / Linux, Anda harus mengganti pemisah file pada jendela hanya perlu menggunakan open () pernyataan dapat:

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

File kotak dialog Download

Kami membuat file foo.txt di direktori saat ini untuk men-download program.

Men-download file dengan menetapkan informasi header HTTP menerapkan kode fungsi adalah sebagai berikut:

#!/usr/bin/python3

# HTTP 头部
print ("Content-Disposition: attachment; filename=\"foo.txt\"")
print ()
# 打开文件
fo = open("foo.txt", "rb")

str = fo.read();
print (str)

# 关闭文件
fo.close()