Что такое КОНТЕКСТ в качестве программного обеспечения? [Дубликат]

Также, если вы используете сторонние библиотеки, убедитесь, что у вас есть правильные 32/64 битные файлы

106
задан Ben Davis 17 November 2013 в 23:39
поделиться

4 ответа

182
ответ дан Mark Hildreth 24 August 2018 в 06:54
поделиться
28
ответ дан mike_e 24 August 2018 в 06:54
поделиться

Давайте возьмем один пример, предположим, что вы хотите установить usercontext (используя конструкцию флагов Local и LocalProxy).

Определить один класс пользователя:

class User(object):
    def __init__(self):
        self.userid = None

определить функцию для извлечения пользовательского объекта внутри текущего потока или greenlet

def get_user(_local):
    try:
        # get user object in current thread or greenlet
        return _local.user
    except AttributeError:
        # if user object is not set in current thread ,set empty user object 
       _local.user = User()
    return _local.user

Теперь определите LocalProxy

usercontext = LocalProxy(partial(get_user, Local()))

Теперь, чтобы получить идентификатор пользователя в текущем потоке usercontext.userid

:

1.Local имеет идентификатор и объект, тождество - это идентификатор threadid или greenlet, в этом примере _local.user = Пользователь () является эквивалентным для _local .___ storage __ [идентификатор текущего потока] ["user"] = User ()

  1. LocalProxy делегирует операцию завершению локального объекта или вы можете предоставить функцию, которая возвращает целевой объект. В приведенном выше примере функция get_user предоставляет текущий пользовательский объект LocalProxy, и когда вы запрашиваете идентификатор пользователя текущего пользователя usercontext.userid, функция __getattr__ LocalProxy сначала вызывает get_user для получения объекта пользователя (пользователя), а затем вызывает getattr (user, «userid»). чтобы установить userid в User (в текущем потоке или зеленетеле), вы просто выполните: usercontext.userid = "user_123"
1
ответ дан Ratn Deo--Dev 24 August 2018 в 06:54
поделиться

Маленькое добавление ответа @Mark Hildreth.

Контекстный стек выглядит как {thread.get_ident(): []}, где [] называется «стек», потому что используется только append (push), pop и [-1] (__getitem__(-1)). Таким образом, стек контекста будет сохранять фактические данные для потока нити или зеленого.

current_app, g, request, session и т. Д. Является LocalProxy объектом, который просто переопределяет специальные методы __getattr__ , __getitem__, __call__, __eq__ и т. д. и вернуть значение из верхнего стека контекста ([-1]) по имени аргумента (например, current_app, request). LocalProxy необходимо импортировать эти объекты один раз, и они не будут пропускать актуальность. Так что лучше просто импортировать request, где бы вы ни находились в коде, вместо этого играйте с отправкой аргумента запроса до ваших функций и методов. Вы можете легко писать собственные расширения вместе с ним, но не забывайте, что легкомысленное использование может затруднить понимание кода.

Проведите время, чтобы понять https://github.com/mitsuhiko/werkzeug/ blob / master / werkzeug / local.py .

Итак, как заполняется оба стека? По запросу Flask:

  1. создать request_context по средам (init map_adapter, путь соответствия)
  2. ввести или нажать этот запрос: очистить предыдущий request_context создать app_context, если он пропустил и нажал на стек контекста приложения, этот запрос был нажат для запроса сеанса инициализации контекста, если он пропустил
  3. запрос на отправку
  4. очистить запрос и поместить его из стека
10
ответ дан tbicr 24 August 2018 в 06:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: