Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 9, 2017 20:37:39

exister
От: Minsk
Зарегистрирован: 2017-08-07
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Правильное оформление CGI скриптов

Помогите, пожалуйста, разобраться в том, как должен выглядеть простой CGI скрипт. В голове после десятков тем на стаке и форумов 3-ех летней давности уже совсем каша.
Не понимаю, почему которые скрипты исполняются в SSH-консоли, а некоторые в браузере. Почему иногда перенос строк работает, но чаще всего нет.

У работаю через AJAX запросы. Хочется понимать что я вообще в своем скрипте пишу.

Пожалуйста, посмотрите мой файл скрипта и, на основании ваших ответов я смогу подправить его, так, чтобы все корректно работало.

 #!/usr/bin/python3.4
# -*- coding: utf-8 -*-
1) Когда нужно прописывать # -*- coding: utf-8 -*- ?

 import httplib2, os
import cgi, sys, codecs
2) Почему некоторые компоненты импортируются вместе, через запятую, а некоторые по-отдельности? Какие компоненты нужно подключать для этой задачи?

 sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())

3) Для чего вообще нужна эта sys.stdout строка?

 #print("Content-type: text/html\n\n")
print("Content-Type: text/html;charset=utf-8\n\n")

4) Какой из этих вариантов лучше? Вроде во второй строке уже кодировка задана. Или нет?
Использовать text/plain или text/html?

Отредактировано exister (Авг. 9, 2017 21:11:43)

Офлайн

#2 Авг. 9, 2017 21:34:46

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Правильное оформление CGI скриптов

1. в питоне 3 - не надо. это для ветки 2
2. в принципе пофиг, для удобства чтения
3. https://habrahabr.ru/post/117236/ инфа старая но полезная
4. вообще для ajax JS/jQuery надо знать. http://javascript.ru/ajax

Отредактировано vic57 (Авг. 9, 2017 21:36:24)

Офлайн

#3 Авг. 9, 2017 22:08:25

exister
От: Minsk
Зарегистрирован: 2017-08-07
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Правильное оформление CGI скриптов

vic57
1. в питоне 3 - не надо. это для ветки 22. в принципе пофиг, для удобства чтения3. https://habrahabr.ru/post/117236/ инфа старая но полезная4. вообще для ajax JS/jQuery надо знать. http://javascript.ru/ajax

Ух ты, спасибо за ответы и ссылки, буду читать и разбираться.

По теме синтаксиса еще вопрос.
Вот у меня есть скрипт, который делает запись в таблицу Гугловскую.

 #!/usr/bin/python3.4
import cgitb, cgi, sys, codecs, httplib2, os
sys.path.insert(0, "/home/w/wipartcom/Z017/libs/gspread")
sys.path.insert(0, "/home/w/wipartcom/Z017/libs/google_sheets_api")
import gspread
from oauth2client.service_account import ServiceAccountCredentials
#sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())
print("Content-type: text/html\n\n")
def main():
	scope = ['https://spreadsheets.google.com/feeds']
	credentials = ServiceAccountCredentials.from_json_keyfile_name('API Project-db286890e9c5.json', scope)
	gc = gspread.authorize(credentials)
	# Open a worksheet from spreadsheet with one shot
	wks = gc.open_by_url('https://docs.google.com/spreadsheets/d/1VBDpfCm7BnGAMoh7zTKPPiOjJFIynSnDqPiM3sJ8hR8/edit#gid=0')
	ws = wks.get_worksheet(0)
	ws.update_acell('A1', 'Test')
if __name__ == '__main__':
	main()

Если я запускаю его через SSH-консоль ( python newlib.py) , все хорошо, он исполняется. Но когда я запускаю его в браузере через AXAJ или просто напрямую http://z017.ru/test/5/newlib.py он никак не исполняется.
В чем тут проблема? Беда еще в том, что в SSH-консоли можно увидеть коды ошибки и разрулить ситуацию, а тут всегда одно и тоже: “500 (Internal Server Error)”

UPD Разобрался в причине не запуска скриптов. Все дело вообще не в коде, а в настройках хостинга. Он был настроен под PHP а для PY скриптов нужны другие настройки - см. скрин.





Отредактировано exister (Авг. 10, 2017 12:09:26)

Офлайн

#4 Авг. 10, 2017 05:16:14

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10015
Репутация: +  857  -
Профиль   Отправить e-mail  

Правильное оформление CGI скриптов

exister
1) Когда нужно прописывать # -*- coding: utf-8 -*- ?
В третьем питоне - никогда. Во втором - всегда. Ну и код должен быть в кодировке utf-8, потому что она покрывает все символы в мире (все иероглифы, значки и так далее).

exister
2) Почему некоторые компоненты импортируются вместе, через запятую, а некоторые по-отдельности?
Старайся по отдельности импортировать модули - это хороший стиль, потому что не требует вчитываться в строки, чтобы понять, что импортировано, а что - нет. При этом имена (классы, функции, константы), импортируемые из одного модуля, можно писать через запятую.
https://www.python.org/dev/peps/pep-0008/#imports

exister
Какие компоненты нужно подключать для этой задачи?
  
sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())
sys и codecs
  
import sys
import codecs

exister
3) Для чего вообще нужна эта sys.stdout строка?
Видимо, какой-то костыль для установки кодировки. Если понадобилось перекрывать sys.stdout, то что-то не то в программе. Обычно все языковые вопросы настраиваются по-другому, без всякой хрени в коде.

exister
  
print("Content-type: text/html\n\n")
  
print("Content-Type: text/html;charset=utf-8\n\n")
4) Какой из этих вариантов лучше? Вроде во второй строке уже кодировка задана. Или нет?
Использовать text/plain или text/html?
Смотря где оно применяется. Во многих местах есть установка кодировки. В общем, смотри у развитых сервисов заголовки (поставь расширение в браузер). Это обширная тема, поэтому либо читай материалы про протокол HTTP, либо копируй уже работающие сервисы, просматривая их настройки.


exister
Если я запускаю его через SSH-консоль ( python newlib.py)
Не надо его тестировать только в консоли. Тестируй его у себя на компе: сначала в консоли, потом на локальном сервере. И только потом выкладывай его на хостинг. Потому что так можно смотреть логи своего локального сервера и читать там, почему скрипт не выполнился.

exister
Беда еще в том, что в SSH-консоли можно увидеть коды ошибки и разрулить ситуацию, а тут всегда одно и тоже: “500 (Internal Server Error)”
Это чаще всего значит, что ты неправильно настроил окружение скрипта. Скорее всего, права неправильные дал.



Отредактировано py.user.next (Авг. 10, 2017 12:38:00)

Офлайн

#5 Авг. 10, 2017 12:29:20

exister
От: Minsk
Зарегистрирован: 2017-08-07
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Правильное оформление CGI скриптов

py.user.next
Не надо его тестировать только в консоли. Тестируй его у себя на компе: сначала в консоли, потом на локальном сервере. И только потом выкладывай его на хостинг. Потому что так можно смотреть логи своего локального сервера и читать там, почему скрипт не выполнился.

По моей логике, если запускать в консоли на сервере это намного ближе к тому как в жизни все происходит. А в консоли на компе все прям всегда само собой работает, а как кидаешь на сервер - лови сразу стандартную 500ую ошибку.

А вот в локальном сервере я совсем не тестил, так что спасибо за совет, буду разбираться с нем.

К слову, мне сегодня в саппорте посоветовали в настройках хостинга врубить “Лог ошибок”. Я про него вообще не знал, но такая офигенная тема оказалась! Туда падают ошибки из скрипта на сервере.


py.user.next
Огромное спасибо за подробные ответы и объяснения. И статья эта прям в тему, мне после C# и Java логика того, как код в Python обрабатывается кажется очень необычной.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version