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

Что за код

04.02.2024, 21:17. Показов 826. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru