1

Тема: Python3 та CGI

Вітаю шановні.
Вивчаючи python по Луцу зіткнувся з проблемою запуску скриптів CGI на сервері.
При запуску прикладу 1.32. PP4E\Preview\webserver.py
та заповнення форми після натиснення на кнопку повинен відпрацювати  скрипт cgi101.py але це не відбувається 
в консолі видає таке

127.0.0.1 - - [13/Aug/2015 12:29:30] "POST /cgi-bin/cgi101.py HTTP/1.1" 200 -
Traceback (most recent call last):
  File "/usr/lib/python3.4/http/server.py", line 1143, in run_cgi
    os.execve(scriptfile, args, env)
PermissionError: [Errno 13] Permission denied: '/home/den/PP4E/Preview/cgi-bin/cgi101.py'

права доступу на файл стоять 777
в чому ще можу бути справа?
ОС Ubuntu 14.04 LTS

2

Re: Python3 та CGI

Може тому, що той сервер не може у ваш home влізти? Для початку можна спробувати мувнутися в /tmp. А також було б непогано поглянути на той приклад із книги Лутца

3

Re: Python3 та CGI

Тут радять запускати сервер від імені звичайного користувача а не root. А взагалі, про всяк випадок могли б хоча б код програми показати

4

Re: Python3 та CGI

на просторах інету гітхабу знайшов цей код, запрацювало в мене, з

python -m http.server --cgi 8000

не вийшло, CGI не працював, а який ви сервер запускаєте ? бо в третьому пітоні http.server

Прихований текст
#! /usr/bin/env python
'''Run a local cgi server from the current directory that treats *.cgi files
as executable python cgi scripts.'''

import http.server, sys, os

class CGIExtHTTPRequestHandler(http.server.CGIHTTPRequestHandler):
    '''This request handler mimics the Loyola server, which looks for CGI files
    to end in '.cgi' and be in any directory as opposed to the CGIHTTPServer
    expectation that the cgi script are of the form /cgi-bin/*.py.'''
    
    def is_python(self, path):
        """Test whether argument path is a Python script: allow .cgi"""
        return path.lower().endswith('.cgi')

    def is_cgi(self):
        '''As on xenon, go by extension only.'''
        base = self.path
        query = ''
        i = base.find('?')
        if i != -1:
            query = base[i:]
            base = base[:i]
        if not base.lower().endswith('.cgi'):
            return False
        [parentDirs, script] = base.rsplit('/', 1)
        self.cgi_info = (parentDirs, script+query)
        return True
   

def run_server():
    dirName = os.getcwd()
    blanks = dirName.count(' ')
    if 0 < blanks:  # server cannot handle blanks in path names
        print("""The path to this directory contains {blanks} space(s):
{dirName}
Either rename directories to remove the blanks or
move this directory to a place with no blanks in the path.
Aborting the local server run!""".format(**locals()))
        input("Press return after reading this message.")
        return
        
    server_addr = ('localhost', 8080)
    cgiServer = http.server.HTTPServer(server_addr, CGIExtHTTPRequestHandler)
    sys.stderr.write('Localhost CGI server started\n.')
    cgiServer.serve_forever()

run_server()

підключатись http://localhost:8080
Да і не забувайте, реалізацій CGI багато є, WSGI, FastCGI ... Тому в першу чергу гляньте на то яка саме це реалізація, бо не завжди запрацює, той код який ви знайдете в гуглі, це була моя початкова помилка, та й помилка всіх початківців. Ще скрипт запускати в папці де будуть файли, я її ставлю так

$ ls -l
drwx------+ 1 user Отсутствует    0 авг  1 13:16 cgi-bin
-rwx------+ 1 user Отсутствует  361 июл 28 18:46 index.html
-rwx------+ 1 user Отсутствует 1715 июл 25 16:11 localCGIServer.py

в cgi-bin скрипти cgi.
приклади HTML і так дальше виставляти ?

5

Re: Python3 та CGI

Як у книзі
Файл  запуску сервера webserver.py

import os, sys
from http.server import HTTPServer, CGIHTTPRequestHandler

webdir = '.'   # where your html files and cgi-bin script directory live
port   = 80    # default http://localhost/, else use http://localhost:xxxx/

os.chdir(webdir)                                       # run in HTML root dir
srvraddr = ("", port)                                  # my hostname, portnumber
srvrobj  = HTTPServer(srvraddr, CGIHTTPRequestHandler)
srvrobj.serve_forever()                                # run as perpetual daemon

файл сторінки cgi101.html

<html>
<title>Interactive Page</title>
<body>
<form method=POST action="cgi-bin/cgi101.py">
    <P><B>Enter your name:</B>
    <P><input type=text name=user>
    <P><input type=submit>
</form>
</body></html>

Файл cgi скрипту cgi101.py

import cgi
form = cgi.FieldStorage()                 # parse form data
print('Content-type: text/html\n')        # hdr plus blank line
print('<title>Reply Page</title>')        # html reply page
if not 'user' in form:
    print('<h1>Who are you?</h1>')
else:
    print('<h1>Hello <i>%s</i>!</h1>' % cgi.escape(form['user'].value))

Тут радять запускати сервер від імені звичайного користувача а не root. А взагалі, про всяк випадок могли б хоча б код програми показати


Від звичайного користувача не запуститься сервер.

6

Re: Python3 та CGI

Від звичайного користувача не запуститься сервер.

цей запуститься, максимум шо можу бути так це не відкритися порт

а код в моєму попередньому пості запускали і тестили ?
запускли так

python3 -m http.server --cgi

в документації є ще додатково про цей запуск

7

Re: Python3 та CGI

А скайп у вас на якому порті висить ?

8

Re: Python3 та CGI

А скайп у вас на якому порті висить ?

скайп наприклад в мене опен-сервер матюкається на 80 порт

9

Re: Python3 та CGI

Покажіть, будь ласка, повні шляхи до всіх цих трьох файлів

10

Re: Python3 та CGI

Master_Sergius написав:

Покажіть, будь ласка, повні шляхи до всіх цих трьох файлів

/home/den/PP4E/Preview/ - для файлу cgi101.html та webserver.py
/home/den/PP4E/Preview/cgi-bin/ для файлу cgi101.py

11

Re: Python3 та CGI

За троє діб пошуку я зробив висновок що цей приклад буде робити тільки під windows, автор книги "Марк Лутц - Программирование на Python, 4-е издание, I том, 2011" не випробував свій приклад на linux.
Це прикро. :(
Дякую всім за допомогу.

12 Востаннє редагувалося P.Y. (26.10.2016 03:02:10)

Re: Python3 та CGI

Проблема не може бути в відсутньому рядку виклику python'а? Як правило, в CGI (як і в шел-скриптах) на початку пишуть щось назразок

#!/usr/bin/env python

(якщо це скрипт на пітоні). Без цього вони взагалі запускаються?

(ймовірно, проблема була не в цьому, та все ж...)