Печать содержания динамично созданного iframe из родительского окна

Вы можете получить доступ к этим переменным с помощью os.environ["ENV VAR NAME"] (не забудьте import os). Например:

import os
# ... other imports ...

dag = DAG(
    dag_id="demo",
    default_args=default_args,
    schedule_interval="0 0 * * *",
)

def print_env_var():
    print(os.environ["AIRFLOW_CTX_DAG_ID"])

print_context = PythonOperator(
    task_id="print_env",
    python_callable=print_env_var,
    dag=dag,
)

Однако, общий способ доступа к таким переменным в задаче - это предоставление контекста задачи, установив provide_context=True в вашем операторе.

Например:

dag = DAG(
    dag_id="demo",
    default_args=default_args,
    schedule_interval="0 0 * * *",
)

def print_context(**context):
    print(context)

print_context = PythonOperator(
    task_id="print_context",
    python_callable=print_context,
    provide_context=True,  # <====
    dag=dag,
)

Переменная context будет содержать ряд переменных, содержащих информацию о контексте задачи, в том числе те, которые указаны в вашем вопросе:

# {
# 'END_DATE': '2019-01-01',
# 'conf': ,
# 'dag': ,
# 'dag_run': None,
# 'ds': '2019-01-01',
# 'ds_nodash': '20190101',
# 'end_date': '2019-01-01',
# 'execution_date': ,
# 'inlets': [],
# 'latest_date': '2019-01-01',
# 'macros': ,
# 'next_ds': '2019-01-02',
# 'next_ds_nodash': '20190102',
# 'next_execution_date': datetime.datetime(2019, 1, 2, 0, 0, tzinfo=),
# 'outlets': [],
# 'params': {},
# 'prev_ds': '2018-12-31',
# 'prev_ds_nodash': '20181231',
# 'prev_execution_date': datetime.datetime(2018, 12, 31, 0, 0, tzinfo=),
# 'run_id': None,
# 'tables': None,
# 'task': ,
# 'task_instance': ,
# 'task_instance_key_str': 'context_demo__print_exec_date__20190101',
# 'templates_dict': None,
# 'test_mode': True,
# 'ti': ,
# 'tomorrow_ds': '2019-01-02',
# 'tomorrow_ds_nodash': '20190102',
# 'ts': '2019-01-01T00:00:00+00:00',
# 'ts_nodash': '20190101T000000',
# 'ts_nodash_with_tz': '20190101T000000+0000',
# 'var': {'json': None, 'value': None},
# 'yesterday_ds': '2018-12-31',
# 'yesterday_ds_nodash': '20181231'
# }

I объясните, как обрабатывать контекст задачи, более подробно в этой записи блога (см. «3. Передача контекста задачам»).

17
задан certainlyakey 6 May 2009 в 19:30
поделиться

3 ответа

Хмм, я правильно понял? Вам нужно только изменить источник, к которому ведет IFrame?

$("#iframe").attr("src", "http://www.example.com");
0
ответ дан 30 November 2019 в 10:43
поделиться

Я попробовал это и смог воспроизвести проблему. Я заметил, что при вызове функции печати iframe не загружен. Я проверил это, проверив значение innerHTML при вызове PrintIFrame (). Чтобы преодолеть это, вы можете использовать setTimeOut, чтобы снова вызвать функцию через x миллисекунд:

function PrintIframe() { 

        if (window.frames['myname'].innerHTML != "") {
            window.frames['myname'].focus();
            window.frames['myname'].print();
        } else {
            setTimeout(PrintIframe,1000);
        }    
    }

Это сработало для меня

EDIT Странно - в моем тестовом коде было предупреждение, которое, кажется, заставляет его работать. Когда я вынул его, ничего не вышло. Извините: (

В любом случае, это должно быть сделано с помощью jQuery, чтобы прикрепить обработчик события загрузки к iframe. Я тестировал в IE8, и он работает:

<html>
<head>
    <script language="javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
    <script type="text/javascript">
    function loadiFrame(src)
    {
        $("#iframeplaceholder").html("<iframe id='myiframe' name='myname' src='" + src + "' />");
    }

    $(function()
    {
        $("#printbutton").bind("click", 
            function() { 
                loadiFrame('test.aspx'); 
                $("#myiframe").load( 
                    function() {
                        window.frames['myname'].focus();
                        window.frames['myname'].print();
                    }
                 );
            }
        );
    });
    </script>    
</head>
<body>
    <input type="button" id="printbutton" value="Load iFrame" />
    <div id="iframeplaceholder"></div>
</body>
</html>
8
ответ дан 30 November 2019 в 10:43
поделиться

Возможно, ограничение одного домена препятствует выполнению вашего JavaScript. Ограничение одного домена позволяет JavaScript в кадре A (или в главном окне) взаимодействовать (например, .print ()) с кадром B, если A и B принадлежат к одному домену. Проверьте консоль ошибок JavaScript. Если вы получаете что-то вроде исключения безопасности / ошибки разрешения, то, скорее всего, это связано с ограничением того же домена.

0
ответ дан 30 November 2019 в 10:43
поделиться
Другие вопросы по тегам:

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