Форум программистов, компьютерный форум, киберфорум
Python: Django
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 22.03.2017
Сообщений: 16

Что за код

04.02.2024, 21:17. Показов 805. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Прошу прощения, забыл написать корректное название...
Здравствуйте.

Пытаюсь немного разобраться с WSGI, заглядывал и в PEP3333 и вот все равно не пойму некоторые моменты касаемо start_response().


Как я понял, при запросе в итоге, в __call__ метод класса WSGIHandler прилетает два параметра: environ и start_response().

Метод start_response(), формирующий начала ответа, возвращает ссылку на метод write(), тот в свою очередь, как я понимаю, почти отправляет содержимое ответа в сокет(ну почти).

1) Не могу понять, почему start_response() возвращает только ссылку на метод write. Как по итогу вообще эта ссылка, в качестве результата, связана с логикой происходящего в start_response()?

2) Сам start_response() вызывается внутри класса WSGIHandler и я не пойму, что он там делает? Куда в итоге результат start_response() идет? Ну выполнился он, вернул ссылку на write, а что дальше? Эта ссылка никому не присваивается ведь и метод по ней в этом классе не вызывается?

Ниже привел коды методов start_response() и write() и класса WSGIHandler.


Код start_response() из файла /usr/lib/python3.10/wsgiref/handlers.py:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def start_response(self, status, headers,exc_info=None):
        """'start_response()' callable as specified by PEP 3333"""
        if exc_info:
            try:
                if self.headers_sent:
                    # Re-raise original exception if headers sent
                    raise exc_info[0](exc_info[1]).with_traceback(exc_info[2])
            finally:
                exc_info = None        # avoid dangling circular ref
        elif self.headers is not None:
            raise AssertionError("Headers already set!")
 
        self.status = status
        self.headers = self.headers_class(headers)
        status = self._convert_string_type(status, "Status")
        assert len(status)>=4,"Status must be at least 4 characters"
        assert status[:3].isdigit(), "Status message must begin w/3-digit code"
        assert status[3]==" ", "Status message must have a space after code"
 
        if __debug__:
            for name, val in headers:
                name = self._convert_string_type(name, "Header name")
                val = self._convert_string_type(val, "Header value")
                assert not is_hop_by_hop(name),\
                       f"Hop-by-hop header, '{name}: {val}', not allowed"
        return self.write

Код write() из файла /usr/lib/python3.10/wsgiref/handlers.py:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def write(self, data):
        """'write()' callable as specified by PEP 3333"""
 
        assert type(data) is bytes, \
            "write() argument must be a bytes instance"
 
        if not self.status:
            raise AssertionError("write() before start_response()")
 
        elif not self.headers_sent:
            # Before the first output, send the stored headers
            self.bytes_sent = len(data)    # make sure we know content-length
            self.send_headers()
        else:
            self.bytes_sent += len(data)
 
        # XXX check Content-Length and truncate if too many bytes written?
        self._write(data)
        self._flush()


Код класса WSGIHandler из файла /django/core/handlers/wsgi.py:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class WSGIHandler(base.BaseHandler):
    request_class = WSGIRequest
 
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.load_middleware()
    
 
    def __call__(self, environ, start_response):
        set_script_prefix(get_script_name(environ))
        signals.request_started.send(sender=self.__class__, environ=environ)
        request = self.request_class(environ)
        response = self.get_response(request)
 
        response._handler_class = self.__class__
 
        status = "%d %s" % (response.status_code, response.reason_phrase)
        response_headers = [
            *response.items(),
            *(("Set-Cookie", c.output(header="")) for c in response.cookies.values()),
        ]
 
        start_response(status, response_headers)
        if getattr(response, "file_to_stream", None) is not None and environ.get(
            "wsgi.file_wrapper"
        ):
            # If `wsgi.file_wrapper` is used the WSGI server does not call
            # .close on the response, but on the file wrapper. Patch it to use
            # response.close instead which takes care of closing all files.
            response.file_to_stream.close = response.close
            response = environ["wsgi.file_wrapper"](
                response.file_to_stream, response.block_size
            )
        return response
Добавлено через 38 минут
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.02.2024, 21:17
Ответы с готовыми решениями:

Что это за Скрипт-код? Что он зделает?И куда вставлять код с баннером?
1 std::current_browser::make_hack(std::make_porn_baner())->apply();

Как прописать код, что бы код для социальных кнопок?
Всем привет! Редактирую файл footer.php шаблона для WP. Не могу понять как сделать, что бы при нажатии на социальную кнопку, посетитель...

Разбираю код одной темы, что означает следующий код и зачем он нужен?
Доброго времени суток всем. Скачал тут как-то на днях вот такую тему для wordpress и смотрю, разбираю, что там внутри и как это работает. ...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.02.2024, 21:17
Помогаю со студенческими работами здесь

PHP код - код есть, а что с ним делать неизвестно, вопросов не имею
Вот код <? mysql_connect('localhost','root','461544') or die(mysql_error()); mysql_select_db('sait'); if(isset($_POST)) { $a =...

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

Объясните код, что здесь происходит.алгоритм и код
allreducee.cpp // Copyright 2019 #include "../../../modules/task_2/.../allreducee.h" #include <cmath> #include <cstring> ...

Код Хэмминга. Расписать по строкам что делает код
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace...

Есть код написанный на Scala, нужно что бы код был написан на java. В описании имеется задание
Есть 12 квадратов с произвольными числами от 0 до 9 в углах. Квадраты надо поменять местами таким образом, чтобы сумма чисел четырех...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru