Форум сайта python.su
0
Помогите, пожалуйста, разобраться в том, как должен выглядеть простой CGI скрипт. В голове после десятков тем на стаке и форумов 3-ех летней давности уже совсем каша.
Не понимаю, почему которые скрипты исполняются в SSH-консоли, а некоторые в браузере. Почему иногда перенос строк работает, но чаще всего нет.
У работаю через AJAX запросы. Хочется понимать что я вообще в своем скрипте пишу.
Пожалуйста, посмотрите мой файл скрипта и, на основании ваших ответов я смогу подправить его, так, чтобы все корректно работало.
#!/usr/bin/python3.4 # -*- coding: utf-8 -*-
import httplib2, os import cgi, sys, codecs
sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())
#print("Content-type: text/html\n\n") print("Content-Type: text/html;charset=utf-8\n\n")
Отредактировано exister (Авг. 9, 2017 21:11:43)
Офлайн
1. в питоне 3 - не надо. это для ветки 2
2. в принципе пофиг, для удобства чтения
3. https://habrahabr.ru/post/117236/ инфа старая но полезная
4. вообще для ajax JS/jQuery надо знать. http://javascript.ru/ajax
Отредактировано vic57 (Авг. 9, 2017 21:36:24)
Офлайн
0
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()

Отредактировано exister (Авг. 10, 2017 12:09:26)
Офлайн
857
existerВ третьем питоне - никогда. Во втором - всегда. Ну и код должен быть в кодировке utf-8, потому что она покрывает все символы в мире (все иероглифы, значки и так далее).
1) Когда нужно прописывать # -*- coding: utf-8 -*- ?
existerСтарайся по отдельности импортировать модули - это хороший стиль, потому что не требует вчитываться в строки, чтобы понять, что импортировано, а что - нет. При этом имена (классы, функции, константы), импортируемые из одного модуля, можно писать через запятую.
2) Почему некоторые компоненты импортируются вместе, через запятую, а некоторые по-отдельности?
existersys и codecs
Какие компоненты нужно подключать для этой задачи?sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())
import sys import codecs
existerВидимо, какой-то костыль для установки кодировки. Если понадобилось перекрывать sys.stdout, то что-то не то в программе. Обычно все языковые вопросы настраиваются по-другому, без всякой хрени в коде.
3) Для чего вообще нужна эта sys.stdout строка?
existerСмотря где оно применяется. Во многих местах есть установка кодировки. В общем, смотри у развитых сервисов заголовки (поставь расширение в браузер). Это обширная тема, поэтому либо читай материалы про протокол HTTP, либо копируй уже работающие сервисы, просматривая их настройки.print("Content-type: text/html\n\n")4) Какой из этих вариантов лучше? Вроде во второй строке уже кодировка задана. Или нет?print("Content-Type: text/html;charset=utf-8\n\n")
Использовать text/plain или text/html?
existerНе надо его тестировать только в консоли. Тестируй его у себя на компе: сначала в консоли, потом на локальном сервере. И только потом выкладывай его на хостинг. Потому что так можно смотреть логи своего локального сервера и читать там, почему скрипт не выполнился.
Если я запускаю его через SSH-консоль ( python newlib.py)
existerЭто чаще всего значит, что ты неправильно настроил окружение скрипта. Скорее всего, права неправильные дал.
Беда еще в том, что в SSH-консоли можно увидеть коды ошибки и разрулить ситуацию, а тут всегда одно и тоже: “500 (Internal Server Error)”
Отредактировано py.user.next (Авг. 10, 2017 12:38:00)
Офлайн
0
py.user.next
Не надо его тестировать только в консоли. Тестируй его у себя на компе: сначала в консоли, потом на локальном сервере. И только потом выкладывай его на хостинг. Потому что так можно смотреть логи своего локального сервера и читать там, почему скрипт не выполнился.
py.user.nextОгромное спасибо за подробные ответы и объяснения. И статья эта прям в тему, мне после C# и Java логика того, как код в Python обрабатывается кажется очень необычной.
Офлайн