Common Gateway Interface

Skrypty CGI w języku interpretera Bourne’a

Hello World!

#!/bin/bash

echo "Content-Type: text/plain"
echo
echo "Hello World!"

Aktualna data i godzina

#!/bin/bash

echo "Content-Type: text/html"
echo
echo "<html>"
echo "<body>"
echo -n "<h1>"
date "+%Y-%m-%d %H:%M:%S"
echo "</h1>"
echo "</body>"
echo "</html>"

Przekierowanie

#!/bin/bash

echo "Location: http://www.cs.put.poznan.pl"
echo

Program CGI w języku C

#include <stdio.h>
#include <stdlib.h>
#include <cgi-util.h>

int main(int argc, char * argv[])
{
  int res;
  char* nazwisko;
  char* imie;

  res = cgi_init();
  printf("Content-type: text/html\n\n");
  if (res != CGIERR_NONE)
  {
    printf("Error # %d: %s<p>\n", res, cgi_strerror(res));
    exit(0);
  }
  nazwisko = (char*)cgi_getentrystr("nazwisko");
  imie = (char*)cgi_getentrystr("imie");

  printf("<html>\n<body>\n");
  printf("<h1>Odczyt parametrów</h1>\n");
  printf("<p>Nazwisko=%s\n", nazwisko);
  printf("<p>Imię=%s\n", imie);
  printf("</body>\n</html>\n");

  cgi_quit();

  return(0);
}

Kod programu jest zapisany w pliku c-example.c. Do kompilacji potrzebna jest biblioteka cgi-util:

# gcc -o c-example.cgi c-example.c -lcgi-util

Programy CGI w języku Python

Argumenty skryptu

Wersja tekstowa args-plain.py:

#!/usr/bin/env python3

import cgi

print("Content-type: text/plain\n")

args = cgi.FieldStorage()
print("Lista wszystkich argumentów:")
for x in args:
    print(x + "=" + args[x].value)

Wersja HTML args-html.py dodatkowo załącza moduł cgitb do wyświetlania komunikatów o błędach w skrypcie:

#!/usr/bin/env python3

import cgi
import cgitb

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

cgitb.enable()

print("<html>\n<body>")
args = cgi.FieldStorage()
print("<h1>Lista wszystkich argumentów</h1>")
print("<pre>")
for x in args:
    print(x + "=" + args[x].value)
print("</pre>\n</body>\n</html>")

Obsługa baz danych SQLite

Tworzenie bazy danych realizuje skrypt sqlite-init.py:

#!/usr/bin/env python3

import sqlite3
import cgitb

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

cgitb.enable()

conn = sqlite3.connect("data/sqlite.db")
c = conn.cursor()
c.executescript("""
    DROP TABLE IF EXISTS pracownicy;
    CREATE TABLE pracownicy(
        id INT PRIMARY KEY,
        nazwisko VARCHAR(30),
        imie VARCHAR(30),
        zarobki DOUBLE,
        wiek INT);
    INSERT INTO pracownicy VALUES(1, 'Kowalski', 'Jan', 3500, 32);
    INSERT INTO pracownicy VALUES(2, 'Nowak', 'Barbara', 3650, 33);
    INSERT INTO pracownicy VALUES(3, 'Kaczmarek', 'Jacek', 2400, 24);
    INSERT INTO pracownicy VALUES(4, 'Potocka', 'Katarzyna', 2800, 26);
    INSERT INTO pracownicy VALUES(5, 'Niewiadomski', 'Jerzy', 2200, 22);
""")
conn.commit()
c.close()
print("OK")

Wyświetlanie bazy danych realizuje skrypt sqlite-select.py:

#!/usr/bin/env python3

import sqlite3
import cgitb

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

cgitb.enable()

conn = sqlite3.connect("data/sqlite.db")
c = conn.cursor()
c.execute("select * from pracownicy")
print("<pre>")
for row in c:
    print(row[1],row[2])
c.close()
print("</pre>")

Dodawanie krotki realizuje skrypt sqlite-insert.py

#!/usr/bin/env python3

import sqlite3
import cgitb

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

cgitb.enable()

conn = sqlite3.connect("data/sqlite.db")
c = conn.cursor()
c.execute("INSERT INTO pracownicy VALUES(6, 'Nowy', 'Hektor', 4444, 37)")
conn.commit()
c.close()
print("OK")

Zobacz również: